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__":
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())