PySCIPOpt  4.3.0
Python Interface for the SCIP Optimization Suite
pfs.py
Go to the documentation of this file.
1 
3 """
4 Use a position index formulation for modeling the permutation flow
5 shop problem, with the objective of minimizing the makespan (maximum
6 completion time).
7 
8 Copyright (c) by Joao Pedro PEDROSO and Mikio KUBO, 2012
9 """
10 import math
11 import random
12 from pyscipopt import Model, quicksum, multidict
13 
15  """gpp -- model for the graph partitioning problem
16  Parameters:
17  - n: number of jobs
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.
21  """
22  model = Model("permutation flow shop")
23 
24  x,s,f = {},{},{}
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))
28 
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))
33 
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))
37 
38  for i in range(1,m+1):
39  for k in range(1,n+1):
40  if k != n:
41  model.addCons(f[i,k] <= s[i,k+1], "FinishStart(%s,%s)"%(i,k))
42  if i != m:
43  model.addCons(f[i,k] <= s[i+1,k], "Machine(%s,%s)"%(i,k))
44 
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))
47 
48  model.setObjective(f[m,n], "minimize")
49 
50  model.data = x,s,f
51  return model
52 
53 
54 def make_data(n,m):
55  """make_data: prepare matrix of m times n random processing times"""
56  p = {}
57  for i in range(1,m+1):
58  for j in range(1,n+1):
59  p[i,j] = random.randint(1,10)
60  return p
61 
62 
63 def example():
64  """creates example data set"""
65  proc = [[2,3,1],[4,2,3],[1,4,1]]
66  p = {}
67  for i in range(3):
68  for j in range(3):
69  p[i+1,j+1] = proc[j][i]
70  return p
71 
72 
73 if __name__ == "__main__":
74  random.seed(1)
75  n = 15
76  m = 10
77  p = make_data(n,m)
78 
79  # n = 3
80  # m = 3
81  # p = example()
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):
85  print(p[i,j],)
86  print
87 
88  model = permutation_flow_shop(n,m,p)
89  # model.write("permflow.lp")
90  model.optimize()
91  x,s,f = model.data
92  print("Optimal value:", model.getObjVal())
93 
94 
103 
104  # x[j,k] = 1 if j is the k-th job; extract job sequence:
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)
pyscipopt.expr.quicksum
def quicksum(termlist)
Definition: expr.pxi:357
pfs.example
def example()
Definition: pfs.py:63
pfs.make_data
def make_data(n, m)
Definition: pfs.py:54
pfs.permutation_flow_shop
def permutation_flow_shop(n, m, p)
Definition: pfs.py:14