PySCIPOpt  4.3.0
Python Interface for the SCIP Optimization Suite
rcs.py
Go to the documentation of this file.
1 
3 """
4 Copyright (c) by Joao Pedro PEDROSO and Mikio KUBO, 2012
5 """
6 from pyscipopt import Model, quicksum, multidict
7 
8 def rcs(J,P,R,T,p,c,a,RUB):
9  """rcs -- model for the resource constrained scheduling problem
10  Parameters:
11  - J: set of jobs
12  - P: set of precedence constraints between jobs
13  - R: set of resources
14  - T: number of periods
15  - p[j]: processing time of job j
16  - c[j,t]: cost incurred when job j starts processing on period t.
17  - a[j,r,t]: resource r usage for job j on period t (after job starts)
18  - RUB[r,t]: upper bound for resource r on period t
19  Returns a model, ready to be solved.
20  """
21  model = Model("resource constrained scheduling")
22 
23  s,x = {},{} # s - start time variable; x=1 if job j starts on period t
24  for j in J:
25  s[j] = model.addVar(vtype="C", name="s(%s)"%j)
26  for t in range(1,T-p[j]+2):
27  x[j,t] = model.addVar(vtype="B", name="x(%s,%s)"%(j,t))
28 
29  for j in J:
30  # job execution constraints
31  model.addCons(quicksum(x[j,t] for t in range(1,T-p[j]+2)) == 1, "ConstrJob(%s,%s)"%(j,t))
32 
33  # start time constraints
34  model.addCons(quicksum((t-1)*x[j,t] for t in range(2,T-p[j]+2)) == s[j], "ConstrJob(%s,%s)"%(j,t))
35 
36  # resource upper bound constraints
37  for t in range(1,T-p[j]+2):
38  for r in R:
39  model.addCons(
40  quicksum(a[j,r,t-t_]*x[j,t_] for j in J for t_ in range(max(t-p[j]+1,1),min(t+1,T-p[j]+2))) \
41  <= RUB[r,t], "ResourceUB(%s)"%t)
42 
43  # time (precedence) constraints, i.e., s[k]-s[j] >= p[j]
44  for (j,k) in P:
45  model.addCons(s[k] - s[j] >= p[j], "Precedence(%s,%s)"%(j,k))
46 
47  model.setObjective(quicksum(c[j,t]*x[j,t] for (j,t) in x), "minimize")
48 
49  model.data = x,s
50  return model
51 
52 
53 def make_1r():
54  """creates example data set 1"""
55  J, p = multidict({ # jobs, processing times
56  1 : 1,
57  2 : 3,
58  3 : 2,
59  4 : 2,
60  })
61  P = [(1,2), (1,3), (2,4)]
62  R = [1]
63  T = 6
64  c = {}
65  for j in J:
66  for t in range(1,T-p[j]+2):
67  c[j,t] = 1*(t-1+p[j])
68  a = {
69  (1,1,0):2,
70  (2,1,0):2, (2,1,1):1, (2,1,2):1,
71  (3,1,0):1, (3,1,1):1,
72  (4,1,0):1, (4,1,1):2,
73  }
74  RUB = {(1,1):2, (1,2):2, (1,3):1, (1,4):2, (1,5):2, (1,6):2}
75  return (J,P,R,T,p,c,a,RUB)
76 
77 def make_2r():
78  """creates example data set 2"""
79  J, p = multidict({ # jobs, processing times
80  1 : 2,
81  2 : 2,
82  3 : 3,
83  4 : 2,
84  5 : 5,
85  })
86  P = [(1,2), (1,3), (2,4)]
87  R = [1,2]
88  T = 6
89  c = {}
90  for j in J:
91  for t in range(1,T-p[j]+2):
92  c[j,t] = 1*(t-1+p[j])
93  a = {
94  # resource 1:
95  (1,1,0):2, (1,1,1):2,
96  (2,1,0):1, (2,1,1):1,
97  (3,1,0):1, (3,1,1):1, (3,1,2):1,
98  (4,1,0):1, (4,1,1):1,
99  (5,1,0):0, (5,1,1):0, (5,1,2):1, (5,1,3):0, (5,1,4):0,
100  # resource 2:
101  (1,2,0):1, (1,2,1):0,
102  (2,2,0):1, (2,2,1):1,
103  (3,2,0):0, (3,2,1):0, (3,2,2):0,
104  (4,2,0):1, (4,2,1):2,
105  (5,2,0):1, (5,2,1):2, (5,2,2):1, (5,2,3):1, (5,2,4):1,
106  }
107  RUB = {(1,1):2, (1,2):2, (1,3):2, (1,4):2, (1,5):2, (1,6):2, (1,7):2,
108  (2,1):2, (2,2):2, (2,3):2, (2,4):2, (2,5):2, (2,6):2, (2,7):2 }
109  return (J,P,R,T,p,c,a,RUB)
110 
111 
112 if __name__ == "__main__":
113  (J,P,R,T,p,c,a,RUB) = make_2r()
114  model = rcs(J,P,R,T,p,c,a,RUB)
115  model.optimize()
116  x,s = model.data
117 
118  print("Optimal value:",model.getObjVal())
119  for (j,t) in x:
120  if model.getVal(x[j,t]) > 0.5:
121  print(x[j,t].name,"=",model.getVal(x[j,t]))
122 
123  for j in s:
124  if model.getVal(s[j]) > 0.:
125  print(s[j].name,"=",model.getVal(s[j]))
pyscipopt.expr.quicksum
def quicksum(termlist)
Definition: expr.pxi:357
rcs.rcs
def rcs(J, P, R, T, p, c, a, RUB)
Definition: rcs.py:8
rcs.make_2r
def make_2r()
Definition: rcs.py:77
pyscipopt.Multidict.multidict
def multidict(D)
Definition: Multidict.py:3
rcs.make_1r
def make_1r()
Definition: rcs.py:53
rcs
Definition: rcs.py:1