数理最適化ソルバー 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 )
© Copyright 2025 ExpyDoc