4 Copyright (c) by Joao Pedro PEDROSO, Masahiro MURAMATSU and Mikio KUBO, 2012
6 from pyscipopt
import Model, quicksum, multidict
9 """weber: model for solving the single source weber problem using soco.
12 - x[i]: x position of customer i
13 - y[i]: y position of customer i
14 - w[i]: weight of customer i
15 Returns a model, ready to be solved.
18 model = Model(
"weber")
20 X,Y,z,xaux,yaux = {},{},{},{},{}
21 X = model.addVar(lb=-model.infinity(), vtype=
"C", name=
"X")
22 Y = model.addVar(lb=-model.infinity(), vtype=
"C", name=
"Y")
24 z[i] = model.addVar(vtype=
"C", name=
"z(%s)"%(i))
25 xaux[i] = model.addVar(lb=-model.infinity(), vtype=
"C", name=
"xaux(%s)"%(i))
26 yaux[i] = model.addVar(lb=-model.infinity(), vtype=
"C", name=
"yaux(%s)"%(i))
29 model.addCons(xaux[i]*xaux[i] + yaux[i]*yaux[i] <= z[i]*z[i],
"MinDist(%s)"%(i))
30 model.addCons(xaux[i] == (x[i]-X),
"xAux(%s)"%(i))
31 model.addCons(yaux[i] == (y[i]-Y),
"yAux(%s)"%(i))
33 model.setObjective(
quicksum(w[i]*z[i]
for i
in I),
"minimize")
41 """creates example data set"""
46 x[i] = random.randint(0,100)
47 y[i] = random.randint(0,100)
48 w[i] = random.randint(1,5)
52 if __name__ ==
"__main__":
59 print(
"%s\t%8s\t%8s\t%8s" % (
"i",
"x[i]",
"y[i]",
"w[i]"))
61 print(
"%s\t%8g\t%8g\t%8g" % (i,x[i],y[i],w[i]))
67 print(
"Optimal value=",model.getObjVal())
68 print(
"Selected position:",)
69 print(
"\t",(round(model.getVal(X)),round(model.getVal(Y))))
72 print(
"%s\t%8s" % (
"i",
"z[i]"))
74 print(
"%s\t%8g" % (i,model.getVal(z[i])))
78 import matplotlib.pyplot
as P
83 G.add_nodes_from([
"D"])
87 position[i] = (x[i],y[i])
88 position[
"D"] = (round(model.getVal(X)),round(model.getVal(Y)))
90 NX.draw(G,pos=position,node_size=200,node_color=
"g",nodelist=I)
91 NX.draw(G,pos=position,node_size=400,node_color=
"w",nodelist=[
"D"],alpha=0.5)
96 print(
"install 'networkx' and 'matplotlib' for plotting")
101 """weber -- model for solving the weber problem using soco (multiple source version).
103 - I: set of customers
104 - J: set of potential facilities
105 - x[i]: x position of customer i
106 - y[i]: y position of customer i
107 - w[i]: weight of customer i
108 Returns a model, ready to be solved.
110 M = max([((x[i]-x[j])**2 + (y[i]-y[j])**2)
for i
in I
for j
in I])
111 model = Model(
"weber - multiple source")
112 X,Y,v,u = {},{},{},{}
113 xaux,yaux,uaux = {},{},{}
115 X[j] = model.addVar(lb=-model.infinity(), vtype=
"C", name=
"X(%s)"%j)
116 Y[j] = model.addVar(lb=-model.infinity(), vtype=
"C", name=
"Y(%s)"%j)
118 v[i,j] = model.addVar(vtype=
"C", name=
"v(%s,%s)"%(i,j))
119 u[i,j] = model.addVar(vtype=
"B", name=
"u(%s,%s)"%(i,j))
120 xaux[i,j] = model.addVar(lb=-model.infinity(), vtype=
"C", name=
"xaux(%s,%s)"%(i,j))
121 yaux[i,j] = model.addVar(lb=-model.infinity(), vtype=
"C", name=
"yaux(%s,%s)"%(i,j))
122 uaux[i,j] = model.addVar(vtype=
"C", name=
"uaux(%s,%s)"%(i,j))
127 model.addCons(
quicksum(u[i,j]
for j
in J) == 1,
"Assign(%s)"%i)
129 model.addCons(xaux[i,j]*xaux[i,j] + yaux[i,j]*yaux[i,j] <= v[i,j]*v[i,j],
"MinDist(%s,%s)"%(i,j))
130 model.addCons(xaux[i,j] == (x[i]-X[j]),
"xAux(%s,%s)"%(i,j))
131 model.addCons(yaux[i,j] == (y[i]-Y[j]),
"yAux(%s,%s)"%(i,j))
132 model.addCons(uaux[i,j] >= v[i,j] - M*(1-u[i,j]),
"uAux(%s,%s)"%(i,j))
134 model.setObjective(
quicksum(w[i]*uaux[i,j]
for i
in I
for j
in J),
"minimize")
141 if __name__ ==
"__main__":
149 print(
"Optimal value:",model.getObjVal())
150 print(
"Selected positions:")
152 print(
"\t",(model.getVal(X[j]),model.getVal(Y[j])))
153 for (i,j)
in sorted(w.keys()):
154 print(
"\t",(i,j),model.getVal(w[i,j]),model.getVal(z[i,j]))
157 edges = [(i,j)
for (i,j)
in z
if model.getVal(z[i,j]) > EPS]
160 import networkx
as NX
161 import matplotlib.pyplot
as P
166 G.add_nodes_from(
"%s"%j
for j
in J)
172 position[i] = (x[i],y[i])
174 position[
"%s"%j] = (model.getVal(X[j]),model.getVal(Y[j]))
177 NX.draw(G,position,node_color=
"g",nodelist=I)
178 NX.draw(G,position,node_color=
"w",nodelist=[
"%s"%j
for j
in J])
181 print(
"install 'networkx' and 'matplotlib' for plotting")