4 Approach: use a convex combination formulation. 6 Copyright (c) by Joao Pedro PEDROSO and Mikio KUBO, 2012 8 from pyscipopt
import Model, quicksum, multidict
10 def eoq(I,F,h,d,w,W,a0,aK,K):
11 """eoq -- multi-item capacitated economic ordering quantity model 14 - F[i]: ordering cost for item i 15 - h[i]: holding cost for item i 16 - d[i]: demand for item i 17 - w[i]: unit weight for item i 18 - W: capacity (limit on order quantity) 19 - a0: lower bound on the cycle time (x axis) 20 - aK: upper bound on the cycle time (x axis) 21 - K: number of linear pieces to use in the approximation 22 Returns a model, ready to be solved. 27 delta = float(aK-a0)/K
32 b[i,k] = F[i]/T + h[i]*d[i]*T/2.
34 model = Model(
"multi-item, capacitated EOQ")
38 x[i] = model.addVar(vtype=
"C", name=
"x(%s)"%i)
39 c[i] = model.addVar(vtype=
"C", name=
"c(%s)"%i)
41 w_[i,k] = model.addVar(ub=1, vtype=
"C", name=
"w(%s,%s)"%(i,k))
44 model.addCons(quicksum(w_[i,k]
for k
in range(K)) == 1)
45 model.addCons(quicksum(a[i,k]*w_[i,k]
for k
in range(K)) == x[i])
46 model.addCons(quicksum(b[i,k]*w_[i,k]
for k
in range(K)) == c[i])
48 model.addCons(quicksum(w[i]*d[i]*x[i]
for i
in I) <= W)
50 model.setObjective(quicksum(c[i]
for i
in I),
"minimize")
57 if __name__ ==
"__main__":
59 I,F,h,d,w = multidict(
67 model = eoq(I,F,h,d,w,W,a0,aK,K)
73 if model.getVal(x[v]) >= EPS:
74 print(x[v].name,
"=",model.getVal(x[v]))
76 print(
"Optimal value:", model.getObjVal())