PPT - LOG OPT HOME

Download Report

Transcript PPT - LOG OPT HOME

数理最適化ソルバー Gurobi
制約最適化ソルバー SCOP
スケジューリングソルバー OptSeq
最適化ソルバーのための
Python言語入門
久保 幹雄
オブジェクト指向に慣れよう!
• Pythonではすべてがオブジェクト
オブジェクト . なになに
この点が重要!
• オブジェクト「の」なになに(属性 or プロパティ)
• オブジェクト「に or を」なになにする(メソッド)
オジェクトの例 (Gurobi)
• 変数オブジェクト x の属性
x.VarName => x の名前
x.LB
=> x の下限
• モデルオブジェクト m のメソッド
m.addVar()
=> m に変数を加える
m.addConstr() => m に制約を加える
m.optimize() => m を最適化する
メソッド=クラス内で定義された関数
入力
f( 引数 )
関数
def f(引数):
.....
return 返値
出力
返値= f( )
自前のオブジェクト=クラス
class なになに:
クラスの中身
def 関数( ):
メソッドの中身
return 返値
リスト
• リストは [ ] で生成
L= [1,4,6,7]
• 中身は何でも良い
L=[ “a”, “b”, “c”]
• 中身は何でも良い
L =[ “a”, “b”, “c”, 1, 2, [ 5,6, ”d”] ]
リストの反復
• リスト内の要素を順に for 反復で取り出す
L= [1,4,6,7]
for i in L:
print i,
=> 1 4 6 7 と出力
• 要素の順番と中身が欲しい
L= [1,4,6,7]
for index,i in enumerate(L):
print index, i
=> 0 1
14
26
37
と出力
リスト内包表記
• リストを for 文を中に入れて生成
L= [ i*2 for i in range(5) ]
=> [0 , 2, 4 ,6, 8] を返す
• if 文を入れて条件付きで生成
例: 0 から 10 までの奇数
(2で割った剰余が1) のリストを生成
[ i for i in range(11) if i%2 ==1 ]
=> [1, 3, 5, 7, 9] を返す
合計を計算するための記法
• sum( ) で合計を計算
sum リストの中身の和をとる関数
例: sum ( [1,2,3] ) => 6を返す
リスト内包表記でリストを生成してもOK
例: sum( [ i for i in range(11)] ) =>55 を返す
リストを表す [ ] を省略してもOK
sum( i for i in range(11) )
合計を計算するための記法 (Gurobi)
• sum( ) もしくは高速版 quicksum を使う
例:変数オブジェクトx,y,z の和をとる
sum ( [ x,y,z] ) => x+y+z を返す
リスト内包表記でリストを生成してもOK
例: 変数オブジェクト x[0], x[1],・・・, x[10] の和をとる
sum( x[i] for i in range(11) )
=> x[0]+x[1]+ ・・・ +x[10] を返す
sum関数を用いた制約の追加の例
• モデルオブジェクト model に
x[0]+x[1]+・・・+x[10] <=8
を追加
model.addConstr(
sum( x[i] for i in range(11) ) <=8
)
大規模問題のときには quicksum を使う!
辞書
• 辞書は {} で生成
d = { } #空の辞書
• 辞書はキーを入れると値を返す
例
d[ “small” ] = 10 ; d[ “large” ] = 10000
と辞書を設定した後で
>> d[ “small”] と聞くと
10
を返す
辞書の反復
• 辞書のキーに対する for 反復
例:
d = {}
d[ “small” ] = 10
d[ “large” ] = 10000
for i in d:
print i,
=> “small” “large” を返す
辞書の使用例 (1)
• 問題のパラメータと変数を辞書で保持
例:
費用を表すパラメータ cost を辞書で保持
cost = {}
cost[ “small” ] = 10
cost[ “large” ] = 100
x = {} #変数オブジェクトの生成
for i in cost: #キーによる反復
x[i]=model.addVar()
=> 変数 x[ “small” ] と x[ “large”] が生成される
辞書の使用例 (2)
• 制約
cost[ “small]* x[ “small” ] +
cost[ “large”]* x[ “large”] <=80
をモデルオブジェクト model に追加
model.addConstr(
sum( cost[i]*x[i] for i in cost) <= 80
)