4. Python 1 ページ解説
複合型
– リスト:任意の要素から成る順序型
A=[ ]
これだけで,スタック,キュー,連結リスト,ソー
ト
A.append(5), a=A.pop(), A.remove(“6”), A.sort()
– 辞書: キーと 値の組から構成されるマップ型
D= { }
Hash 関数と同じ.何でも辞書で高速に保管できる!
D[(1,2)] =6, D[“Hello”]=“ こんにちは”
反復
for i in [1,2,5,6]: for key in D:
print i*2 print key,D[key]
5. How to solve hard optimization
problems quickly by Python
Metaheuristics
MIP solver Gurobi Python Source Codes
Developed by: Developed by:
Zonghao Gu, Me & J. Pedro Pedroso
Edward Rothberg ,
Robert Bixby
VS.
?
+
Free academic license
+ Python Interface
15. 辞書を用いたワイン製造モデル (2)
x = {}
for j in Blends:
x[j] = model.addVar(vtype="C", name="x[%s]"%j)
model.update()
model.setObjective(quicksum(Profit[j]*x[j] for j in Blends),
GRB.MAXIMIZE)
for i in Grapes:
model.addConstr(quicksum(Use[i,j]*x[j] for j in Blends)
<= Inventory[i], name="use[%s]"%i)
model.optimize()
19. Python での実装(2)
for j in range(n):
y[j]=model.addVar(obj=0,vtype=“B”,name="y"+str(j))
for i in range(n):
x[i,j]=model.addVar(obj=cost[i,j],
vtype=“B”,name="x"+str(i)+str(j))
model.update()
20. Python での実装(3)
for i in range(n):
L=LinExpr() # 線形表現オブジェクト L を空で
作成
for j in range(n):
L.addTerms(1,x[i,j]) # 線形表現オブジェクトに項を追
加
model.addConstr(lhs=L,sense= " = ",
rhs=1,name="Demand"+str(i))
線形表現( Linear Express ) クラス LinExpr
21. Python での実装(4)
中略
model.optimize() # 最適化実行
print “Opt.value=”,model.ObjVal # 目的関数値
edge=[] # 選ばれた枝 (i,j) のリスト
for (i,j) in x: # 変数 x の辞書を反復
if x[i,j].X==1: #x[i,j] の解が 1 なら
edge.append((i,j)) # リスト edge に (i,j) を追
加
return edge
22. Python での実装(5)
import networkx as NX #networkX モジュールの読み込み
import matplotlib.pyplot as P # 描画の準備
P.ion()
G = NX.Graph() # グラフオブジェクト G の生成
G.add_nodes_from(range(n)) # 点の追加
for (i,j) in edge: # グラフに枝を追加
G.add_edge(i,j)
NX.draw(G) # 描画
23. 弱い定式化での結果
n=200,k=20
Optimize a model with 401 Rows, 40200 Columns and 80400
NonZeros
中略
Explored 1445 nodes (63581 simplex iterations) in 67.08 seconds
Thread count was 2 (of 2 available processors)
Optimal solution found (tolerance 1.00e-04)
Best objective 1.0180195861e+01, best bound 1.0179189780e+01,
gap 0.0099%
Opt.value= 10.1801958607
25. 強い定式化での結果
Optimize a model with 40401 Rows, 40200 Columns and 160400
NonZeros
中略
Explored 0 nodes (1697 simplex iterations) in 3.33 seconds
( 分枝しないで終了!)
Thread count was 2 (of 2 available processors)
Optimal solution found (tolerance 1.00e-04)
Best objective 1.0180195861e+01, best bound 1.0180195861e+01,
gap 0.0%
Opt.value= 10.1801958607
26. 知見
• Big M を用いない強い定式化が望まし
い.
• この程度の式なら,必要な式のみを切
除平面として追加するような小細工は
必要なし.
(ただし,式の数が増え退化するので
,大規模なLPを高速に解けるソル
バーが前提)
27. k-center 問題
• min-max 型の施設配置問題
• 施設は顧客上から選択
• Euclid 距離,座標は一様ランダム
Which is the solution of the k-center problem?
36. 上界と下界の変化
45
(80点, Euclid TSP )
40
強化した式
35
30 でないと...
1日まわして
Obj. Func . Va lue
25
Out of Memory!
20
15
10
5
0
0 50 100 150 200 250 300 350 400
C PU
37. 結果
Optimize a model with 6480 Rows, 6400 Columns and 37762 NonZeros
中略
Cutting planes:
Gomory: 62
Implied bound: 470
MIR: 299
Zero half: 34
Explored 125799 nodes (2799697 simplex iterations) in 359.01 seconds
Optimal solution found (tolerance 1.00e-04)
Best objective 7.4532855108e+00, best bound 7.4525704995e+00, gap 0.0096%
Opt.value= 7.45328551084
48. 上界と下界の変化(標準定式
化) 1 32000
1 30000
1 28000
1 26000
Ob j. Fu n c . Va lu e
1 24000
1 22000
1 20000
1 18000
1 16000
1 14000
1 12000
0 200 400 600 800 1000 1200 1400 1600 1800 2000
C PU
1800 秒で最適解;これ以上大きな問題例は無理!
49. 上界と下界の変化(施設配置定式
1 14050
化)
1 14000
1 13950
Ob j. Fu n c . Va l.
1 13900
1 13850
1 13800
1 13750
1 13700
1 13650
1 13600
0 5 10 15 20 25 30 35 40 45
C PU
40 秒で最適解; T=100 でも大丈夫!
56. Python による記述(主問題)
K = len(t) t: 初期パターンのリスト
master = Model("MP")
x = {}
for k in range(K):
x[k] = master.addVar(obj=1, vtype="I", name="x[%d]"%k)
master.update()
orders={}
for i in range(m):
coef = [t[k][i] for k in range(K) if t[k][i] > 0]
var = [x[k] for k in range(K) if t[k][i] > 0]
orders[i] = master.addConstr(LinExpr(coef,var), ">", q[i], name="Order[%d]"%i)
master.update()
57. Python による記述(列生成)
while 1: knapsack.update()
iter += 1 knapsack.optimize()
relax = master.relax() if knapsack.ObjVal < 1+EPS:
relax.optimize() break
pi = [c.Pi for c in relax.getConstrs()] col = Column()
knapsack = Model("KP") for i in range(m):
knapsack.ModelSense=-1 if t[K][i] > 0:
y = {} col.addTerms(t[K][i], orders[i])
for i in range(m): x[K] = master.addVar(obj=1, vtype="I",
y[i] = knapsack.addVar(obj=pi[i], name="x[%d]"%K, column=col)
ub=q[i], vtype="I", name="y[%d]"%i) master.update()
knapsack.update() K += 1
L = LinExpr(w, [y[i] for i in range(m)]) master.optimize()
knapsack.addConstr(L, "<", B,
ame="width")
61. Python での実装(1)
from gurobipy import *
model=Model("gcp")
x={}
y={}
for i in range(n):
for k in range(K):
x[i,k]=model.addVar(obj=0, vtype="B",name="x"+str(i)+str(k))
for k in range(K):
y[k]=model.addVar(obj=1,vtype=“B”,name="y"+str(k))
model.update()
62. Python での実装(2)
for i in range(n):
L=LinExpr()
for k in range(K):
L.addTerms(1,x[i,k])
model.addConstr(lhs=L,sense= " = ",rhs=1,name="const"+str(i))
中略
model.optimize()
print "Opt.value=",model.ObjVal
for v in model.getVars():
if v.X>0.001:
print v.VarName,v.X
63. 上界と下界の変化(原定式
化)
12
点数 n=40 ,彩色数上限 Kmax=10
10
Obj. Func . Value
8
6
4
2
0
0 200 400 600 800 1000 1200 1400
CPU Time
Optimize a model with 3820 Rows, 410 Columns and 11740 NonZeros
Explored 17149 nodes (3425130 simplex iterations) in 1321.63 seconds
77. Prams
(Parameters to control the optimizer)
• TimeLimit : limit of the computational time
• MIPGap : upper bound of the relative error
• MIPFocus : MIP search strategy
• SolutionNumber : number of solution
• LPMethod : solution method of linear optimization
• OutputFlag : 0=Off , 1=On
...
E.g., : ModelObject.Params.TimeLimit=10
88. Prams
(Parameters to control the optimizer)
• TimeLimit : limit of the computational time
• Target : target penalty value
• RandomSeed: random seed number
• OutputFlag : 0=Off , 1=On
91. Prams
(Parameters to control the optimizer)
• TimeLimit : limit of the computational time
• Makespan: True= makespan minimization,
False=weighted tardiness minimization
• RandomSeed: random seed number
• OutputFlag : 0=Off , 1=On