4 Approach: use SOS2 constraints for modeling non-linear functions.
6 Copyright (c) by Joao Pedro PEDROSO and Mikio KUBO, 2012
8 from pyscipopt
import Model, quicksum, multidict
12 from piecewise
import convex_comb_sos
15 """ssa -- multi-stage (serial) safety stock allocation model
18 - h[i]: inventory cost on stage i
19 - K: number of linear segments
20 - f: (non-linear) cost function
21 - T[i]: production lead time on stage i
22 Returns the model with the piecewise linear relation on added variables x, f, and z.
25 model = Model(
"safety stock allocation")
29 for i
in range(1,n+1):
30 a[i] = [k
for k
in range(K)]
31 b[i] = [
f(i,k)
for k
in range(K)]
38 for i
in range(1,n+1):
41 L[i] = model.addVar(ub=0, vtype=
"C", name=
"L[%s]"%i)
43 L[i] = model.addVar(vtype=
"C", name=
"L[%s]"%i)
44 L[n+1] = model.addVar(ub=0, vtype=
"C", name=
"L[%s]"%(n+1))
46 for i
in range(1,n+1):
48 model.addCons(x[i] + L[i] == T[i] + L[i+1])
50 model.setObjective(
quicksum(h[i]*y[i]
for i
in range(1,n+1)),
"minimize")
58 """creates example data set"""
65 for i
in range(n-1,0,-1):
66 h[i] = h[i+1] + random.randint(30,50)
68 for i
in range(1,n+1):
69 T[i] = random.randint(3,5)
71 return z,sigma,h,T,K,n
75 if __name__ ==
"__main__":
80 return sigma*z*math.sqrt(k)
82 model =
ssa(n,h,K,f,T)
87 for i
in range(1,n+1):
89 if model.getVal(s[i][k]) >= 0.001:
90 print(s[i][k].name,model.getVal(s[i][k]))
92 print(
"%10s%10s%10s%10s" % (
"Period",
"x",
"L",
"T"))
93 for i
in range(1,n+1):
94 print(
"%10s%10s%10s%10s" % (i,model.getVal(x[i]), model.getVal(L[i]), T[i]))
96 print(
"Objective:",model.getObjVal())