4 Use a position index formulation for modeling the permutation flow
5 shop problem, with the objective of minimizing the makespan (maximum
8 Copyright (c) by Joao Pedro PEDROSO and Mikio KUBO, 2012
12 from pyscipopt
import Model, quicksum, multidict
15 """gpp -- model for the graph partitioning problem
18 - m: number of machines
19 - p[i,j]: processing time of job i on machine j
20 Returns a model, ready to be solved.
22 model = Model(
"permutation flow shop")
25 for j
in range(1,n+1):
26 for k
in range(1,n+1):
27 x[j,k] = model.addVar(vtype=
"B", name=
"x(%s,%s)"%(j,k))
29 for i
in range(1,m+1):
30 for k
in range(1,n+1):
31 s[i,k] = model.addVar(vtype=
"C", name=
"start(%s,%s)"%(i,k))
32 f[i,k] = model.addVar(vtype=
"C", name=
"finish(%s,%s)"%(i,k))
34 for j
in range(1,n+1):
35 model.addCons(
quicksum(x[j,k]
for k
in range(1,n+1)) == 1,
"Assign1(%s)"%(j))
36 model.addCons(
quicksum(x[k,j]
for k
in range(1,n+1)) == 1,
"Assign2(%s)"%(j))
38 for i
in range(1,m+1):
39 for k
in range(1,n+1):
41 model.addCons(f[i,k] <= s[i,k+1],
"FinishStart(%s,%s)"%(i,k))
43 model.addCons(f[i,k] <= s[i+1,k],
"Machine(%s,%s)"%(i,k))
45 model.addCons(s[i,k] +
quicksum(p[i,j]*x[j,k]
for j
in range(1,n+1)) <= f[i,k],
46 "StartFinish(%s,%s)"%(i,k))
48 model.setObjective(f[m,n],
"minimize")
55 """make_data: prepare matrix of m times n random processing times"""
57 for i
in range(1,m+1):
58 for j
in range(1,n+1):
59 p[i,j] = random.randint(1,10)
64 """creates example data set"""
65 proc = [[2,3,1],[4,2,3],[1,4,1]]
69 p[i+1,j+1] = proc[j][i]
73 if __name__ ==
"__main__":
82 print(
"processing times (%s jobs, %s machines):" % (n,m))
83 for i
in range(1,m+1):
84 for j
in range(1,n+1):
92 print(
"Optimal value:", model.getObjVal())
105 seq = [j
for (k,j)
in sorted([(k,j)
for (j,k)
in x
if model.getVal(x[j,k]) > 0.5])]
106 print(
"optimal job permutation:",seq)