最適化ソルバーのための Python言語入門 数理最適化ソルバー 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 を最適化する
メソッド=クラス内で定義された関数 関数 def f(引数): ..... return 返値 入力 出力 f( 引数 ) 返値= f( )
class なになに: クラスの中身 def 関数( ): メソッドの中身 return 返値 自前のオブジェクト=クラス 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 1 4 2 6 3 7 と出力
リスト内包表記 リストを 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 )