SlideShare uma empresa Scribd logo
1 de 91
Python を用いた
お気楽最適化とその実践




    久保 幹雄
Why Python?
                           • モジュールを読み込め
                             ば何でもできる!
                           • 最適化もできる!
                             import gurobipy (MIP)
                             import scop2 (CP)
                           • import optseq2
                             (Scheduling)
                           • 空を飛ぶことも!?
                             import antigravity ?

                          http://www.logopt.com/
                          mikiokubo/ に 20 分の入門ビデオ
http://xkcd.com/353   /
Python をお薦めする訳
• キーワード(覚えるべき予約後)が 30 程度と少
  ない.
• 字下げの強要で,誰でも読みやすいプログラム
• 短時間で開発可能(行数が短く,モジュール豊
  富)
• 変数の宣言必要なし
• インタープリタ(コンパイルする必要なし;並列
  用コンパイラもついている)
• メモリ管理も必要なし
• 多くのプラットフォームで動作( Windows, Mac,
  Linux)
• オブジェクト指向(すべてがオブジェクト)
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]
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
MIP, CP, Scheduling Solvers
• 混合整数計画 (MIP) ソルバー : Gurobi
• 制約計画 (CP) ソルバー : SCOP (Solver for
  COnstraint Programming)
• スケジューリング問題に特化したソルバー :
  OptSeq II

 モデリング ( 定式化)のコツ
 使い分けのコツ

「新時代の最適化 -Python 言語を用いた
 最適化入門 - 」近代科学社(執筆中)参照
混合整数計画とは
Mixed Integer Programming (MIP)
• 変数( Variables )
   x : 実数,整数, 0-1 整数変数
  ( Binary )
• 制約( Constraints)
  線形 or ( 凸 ) 二次制約

 minimize c’x+x’Qx ( 目的関数 )
 subject to Ax=b   ( 制約 )
Gurobi 入門 (1)
• モデルオブジェクトの生成
model = Model("Wine Blending")
Gurobi 入門 (2)
• 変数オブジェクトの追加
  x1 = model.addVar(name="x1")
  x2 = model.addVar(name="x2")
  x3 = model.addVar(name="x3")

• モデルの更新
   ( 制約を追加する前には必須.
  怠惰な更新 (lazy update); 高速化のための仕
  様. )
  model.update()
Gurobi 入門 (3)
• 目的関数の設定
 model.setObjective(15*x1 + 18*x2 + 30*x3,
                    GRB.MAXIMIZE)
• 制約の追加
 model.addConstr(2*x1 + x2 + x3 <= 60)
 model.addConstr(x1 + 2*x2 + x3 <= 60)
 model.addConstr(x3 <= 30)
• 最適化
 model.optimize()
リストを用いたモデル化
• 変数オブジェクトをリストに追加
   x=[   ]
  for i in range(1,4):
    var=model.addVar(name=“x[%s]”%i)
    x.append(var)
• 制約 “ x1 + x2 + x3 <= 2” の追加
 model.addConstr( sum(x) <= 2 ) or
 model.addConstr( quicksum(x) <= 2 )

         X[1]   X[2]    X[3]   ・・・
辞書を用いたモデル化 (1)
• 辞書( Dictionary )は,ワインの種類
  (“ Dry”, “Medium”, “Sweet”) をキーとし,
  変数オブジェクトを値とした写像型
  x={ }
 x[“Dry”]= model.addVar(name=“Dry”)
 x[“Medium”]= model.addVar(name=“Medium”)
 x[“Sweet”]= model.addVar(name=“Sweet”)
                               値
   キー
                写         “ ニーハオ”
  “Hello”,
                         Variable Object
  “Dry  
   Wine”
辞書を用いたモデル化 (2)
• 制約 “ 2 x1 + x2 + x3 <= 30” の追加
  model.addConstr( 2*x[“Dry”]+ x[“Medium”]
                            +x[“Sweet”] <=30 )


Blends, Profit =
multidict({"Dry":15, "Medium":18, "Sweet":30})
multidict

=> Blends=["Dry", "Medium“, "Sweet“]
   Profit[“Dry”]=15, Profit[“Medium”]=18, ...
辞書を用いたワイン製造モデル
        (1)
Blends, Profit =
  multidict({"Dry":15, "Medium":18, "Sweet":30})
   multidict

  => Blends=["Dry", "Medium“, "Sweet“] List of Keys
     Profit[“Dry”]=15, Profit[“Medium”]=18, ...

Grapes, Inventory =
  multidict({"Alfrocheiro":60, "Baga":60, "Castelao":30})

Use = { ("Alfrocheiro","Dry"):2, ("Alfrocheiro","Medium"):1,
         ("Alfrocheiro","Sweet"):1, ("Baga","Dry"):1, ....
       }
辞書を用いたワイン製造モデル (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()
k-median 問題
• min-sum 型の施設配置問題
• 顧客数 n=200 ,施設数 k=20
   (顧客上から選択)
• Euclid 距離,座標は一様ランダム
定式化




      弱い定式化
Python での実装( 1 )
from gurobipy import * #gurobipy モジュールの読み込み


# k-median ソルバーの関数
def solve(n,k,cost):
  model=Model(“median”) # モデルオブジェクトの生成
  y={}                  # 変数を表す辞書の準備
  x={}

           キー                    値
         “Hanako”,     写像     “127cm”
           (1,2)            変数オブジェクト
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()
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
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
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)                      # 描画
弱い定式化での結果
                 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
上界と下界の変化
                     18


                     16


                     14
Obj. Func . Va lue




                     12


                     10


                     8


                     6


                     4


                     2


                     0
                          0   10    20   30         40   50   60   70

                                              CPU
強い定式化での結果
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
知見
• Big M を用いない強い定式化が望まし
  い.
• この程度の式なら,必要な式のみを切
  除平面として追加するような小細工は
  必要なし.

 (ただし,式の数が増え退化するので
 ,大規模なLPを高速に解けるソル
 バーが前提)
k-center 問題
• min-max 型の施設配置問題
• 施設は顧客上から選択
• Euclid 距離,座標は一様ランダム




   Which is the solution of the k-center problem?
定式化
      最大距離を最小化
上界と下界の変化
                   1.2



                    1



                   0.8
Obj. Fun. Va lue




                   0.6



                   0.4



                   0.2



                    0
                         0   50   100   150      200     250   300   350   400

                                              CPU Time

              100 顧客, 10 施設 ( k-median は 200 施設, 20 顧客で 3 秒)
k- 被覆問題としての定式化
              被覆されない顧客数最小化

                  被覆されなければ1の変数




距離が θ 以下のとき
1 のパラメータ
k- 被覆問題 +Binary Search

顧客・施設間の距離の上限 UB ,下限
 LB
while UB – LB >ε:
    θ= (UB+LB)/2
    if k- 被覆問題の最適値が 0 then
         UB = θ
    else
         LB = θ
実験結果
知見
• Min-max 型の目的関数は MIP ソルバーでは解
  きにくい(双対ギャップが大きい;上界も下
  界も悪いので,途中で止めても悪い解!).
• 例: Job shop スケジューリングの最大完了時
  刻(メイクスパン)最小化 => スケジューリ
  ング問題に特化したソルバーの方が良い!
• k- 被覆問題を用いた二分探索だとある程度
  min-max 型の目的関数を回避できる.
• min-max 型の問題は,制約計画としてモデル
  化して,上限を制約として扱うと良い.
巡回セールスマン問題(TS
      P)
• すべての点をちょうど1回通る最短巡
  回路
• 切除平面法で 85,900 点の実際問題(対
  称TSP)の最適解
Miller-Tucker-Zemlin の定式化
上界と下界の変化
                     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
結果
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
単一フロー定式化




多少強化
対称な問題( DFJ 定式化)
部分巡回路除去制約を追加
   線形緩和問題
部分巡回路除去制約を追加
       整数解




連結成分を求めて切除平面を追加
部分巡回路除去制約を追加
     最適解
知見
• 式を持ち上げ操作などで強化すると,高速化
  され,大きな問題例が解けるようになる.
 (そのためには多面体論の知識が多少必要な
  ので,専門家に相談.ちょっと式をいじるだ
  けで劇的に改善する場合もある!)
• 他にも単品種フロー,多品種フロー定式化な
  どがある.(下界が強い方が良いとは限らな
  い! LP のサイズと解きやすさ(退化の具
  合)を考慮して定式化を選択!)
• 対称な問題なら分枝カット法が良い.
多品目ロットサイズ決定問題
• 段取り費用と在庫費用のトレードオフ
  を最適化する多期間生産計画
• 多品目で共通の資源を使う容量制約付
  き問題は, MIP ソルバーには難問(と
  言われてきた)
• T=30 期, P=24 品目: Trigeiro, Thomas,
  McClain ( 1989 年)の最大のベンチ
  マーク
ロットサイズ決定問題
   標準定式化のフローモデル
        生産量 (t)

  在庫量 (t-1)       在庫量 (t)
              期
              t


        需要量 (t)
                            弱い定式化の原因

      生産量 (t)≦ 大きな数 “ Large M” × 段取りの有無 (t)
在庫量( t-1)+ 生産量 (t)= 需要量 (t)+ 在庫量( t) 0-1 変数
ロットサイズ決定問題
   施設配置定式化のフローモデル
                  s 期に生産して t 期まで在庫される量


              期              期
              s              t



                             需要量 (t)

s 期に生産して t 期まで在庫される量 ≦需要量 (t)× 段取りの有無 (t)

       ∑期に生産して t 期まで在庫される量 = 需要量 (t)
       s
       s ≤t
定式化のサイズと強さの比較
           標準定式化                施設配置定式化
          変数の数   O(n)           変数の数
                                          2
                                       O(n )
制約の数
           弱い定式化
           弱い定式化                 強い定式化
 O(n)                   制約の数
                           2
追加した
                        O(n )   = 線形計画緩和が
           (S,l) 不等式            整数多面体と一致
制約の数        (S,l) 不等式

O(2 n )     切除平面
            切除平面
                                 n: 期数
            強い定式化
上界と下界の変化(標準定式
       化)                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 秒で最適解;これ以上大きな問題例は無理!
上界と下界の変化(施設配置定式
                       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 でも大丈夫!
知見
• 従来では難問と言われてきたロットサ
  イズ決定問題でもある程度までは大丈
  夫
• 緩和固定法( Federgruen, Meissner,Tzur
  “Progressive Interval Heuristics for Multi-
  Item Capacitated Lot-Sizing Problems”
  2007 )という MIP ベースのメタ解法を
  作ってみたが,同時間通常の探索を行
  う「打ち切り分枝限定法」の方が良
  い!
ビンパッキング問題

                                                                                 8   8
                                                                 7   7
6   6
             5   5   5                                                   5   5                   5
                         4   4   4   4                                                   4   4
                                                         3   3




                                                                             }
                                         2   2   2   2




                                                                                 9




        アイテム j=1,…,n のサイズ                                サイズ B のビン
        sj
切断問題




データが離散値をとるビンパッキング問題と同じ
ビンパッキング問題の定式化
             ビン j を使うとき1

             アイテム i をビン j に入れるとき1




強い定式化の
ための追加式

解の対称性のためあまり大きい問題例は解けない!
切断問題の定式化
          初期パターンの線形緩和問題
                          切断パターンを使用する回数




[4, 0, 0, 0, 0, 0, 0]
[0, 3, 0, 0, 0, 0, 0]
[0, 0, 2, 0, 0, 0, 0]
[0, 0, 0, 1, 0, 0, 0]
[0, 0, 0, 0, 1, 0, 0]
[0, 0, 0, 0, 0, 1, 0]
[0, 0, 0, 0, 0, 0, 1]   最適双対変数 (1/4,1/3,1/2,1,1,1,1)

初期切断パターン(どのアイテムを何回切断するか)
新しいパターンの生成
      ナップサック問題


         y=(2, 0, 0, 1, 0, 0, 0)   最適値 1.5

列を追加して
再び求解
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()
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")
列生成法の応用事例
(タンカースケジューリング
     問題)
• タンカーのパーティションを考慮した
  複雑な実際問題
• 海技研からの委託
• 可能なパターンの列挙,集合被覆問題
  による選択を 2 回反復した解法
• 従来法( CP ): 9 時間かけて実行不能
• 開発法: 10 分程度で求解
グラフ彩色問題
• 解の対称性
• 点数 n=40 ,彩色数上限 Kmax=10
• ランダムグラフ G(n,p=0.5)
• 彩色数 8 が最適値
定式化




      弱い定式化
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()
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
上界と下界の変化(原定式
                                  化)
                    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
定式化の改良
対称性の除去(番号の小さい方の色を優先して使う!)




特殊順序集合( SOS: Special Ordered Set ) Type 1 (いずれか
1つの変数が正になることの宣言)の追加


                     model.addSOS(1, 変数リス
                     ト)
上界と下界の変化(対称性除
                        12
                              去)
                        10
   Obj. Func . Va lue




                        8




                        6




                        4




                        2




                        0
                             0   50   1 00   1 50   200   250   300   350   400   450

                                         CPU
Optimize a model with 3829 Rows, 410 Columns and 11758 NonZeros
Explored 4399 nodes (1013290 simplex iterations) in 384.53 seconds
MIPFocus=2 (最適性保証優先) で 67 秒, MIPFocus=3 (下界優先) で
上界と下界の変化( +SOS )
                    12




                    10
Obj. Func . Va l.




                    8




                    6




                    4




                    2




                    0
                         0   5   10             15             20        25

                                       CPU
Optimize a model with 3829 Rows, 410 Columns and 11758
NonZerosExplored 109 nodes (58792 simplex iterations) in 22.02 seconds
MIPFocus=2 (最適性保証優先) で 65 秒, MIPFocus=3 (下界優先)
で 126 秒
Fixed-K approach
      悪い枝の数を最小化




 枝の両端が同じ色(悪い枝)だと 1
Fixed-K Approach +Binary Search
 彩色数 K の上界 UB ,下界 LB
 while UB – LB >1:
     K= [ (UB+LB)/2 ] [ ] : Gauss の記号
       if Fixd-K 定式化の最適値が 0 then
          UB = K
     else
          LB = K
Improved Formulation




 Fixed-K Approach
 +Binary Search
知見
• 解の対称性のある問題は,下界の改善がしに
  くいので,分枝限定法では解きにくい(モダ
  ンなソルバーは群論などを用いた工夫を入れ
  てはいるが,あまり機能しない問題もある)
• 対称性を除く工夫を入れると多少は改善
• SOS ( Special Ordered Set )制約の宣言は損
  はない(ただし,探索手法の変更との相性は
  悪い.)
• K を固定すると解きやすくなり,二分探索は
  有効
多目的最適化
• 非劣解の集合をどのように生成するか?
  ( Gurobi は分枝限定法で見つかった複数の
  解を出力)

• 線形和によるスカラー化

• 制約に変換してスライドさせる方法

• 理想点からの距離を最小化する方法
非劣解 とスカラー化法
第二目的関数


               この領域の解は
               A に優越される




スカラー化の    A
目的関数の方向

              スカラー化が見逃す非劣解

                     第一目的関数
二目的巡回セールスマン問題に対する制約スライド法の結果
制約スライド法と理想点法の比較
Gurobi Objects
 GRBError
                                Variable
                     addVar


         Model                             Column

addSOS          addConstr
                               Constraint
   SOS

         Callbacks          LinExpr    QuadExpr
Model Object
 = Model(“name of model” )
  Methods            Attributes
• AddVar       •     Params
• AddConstr    •     ObjVal
• optimize     •     ModelSense
• update       •     Runtime
• getVars      •     Status
• relax        •     SolCount
 ...           ...
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
変数追加メソッド addVar の
     引数
• lb ( 下限 ) :規定値 =0
• ub ( 上限 ) :規定値 =GRB.INFINITY (無限
  大)
• obj ( 目的関数の係数 ) :=0
• vtype ( 変数の種類 ): GRB.CONTINUOUS (連
  続変数; “ C” でも可) , GRB.BINARY ( 2 値
  変数;“ B” ) , GRB.INTEGER (整数変
  数;“ I” ) , GRB.SEMICONT ( 0 もしくはあ
  る範囲内の連続変数;“ S” でも可) ,
  GRB.SEMIINT ( 0 もしくはある範囲内の整
  数変数;“ N” でも可)
• name ( 名前 ): =“”
制約追加メソッド addConstr の引
       数
 •  l hs (左辺):線形制約オブジェク
   トか定数
 • sense (制約の向き):
   GRB.LESS_EQUAL (≦;“ <” でも可) ,
   GRB.EQUAL (=; “ =” でも可) ,
   GRB.GREATER_EQUAL (≧;“ >” でも
   可)
 • rhs (右辺):線形制約オブジェクトか
   定数
モデルのその他の主要メソッ
      ド
• optimize( コールバック関数):最適化実行
• update :モデルの変更を Gurobi に知らせる
• getVars :変数オブジェクトを入れたリスト
  を得る
• relax :緩和問題を生成
• computeIIS :既約不整合部分系(実行不能に
  なっている原因の制約と変数; Irreducible
  Inconsistent Subsystem : IIS )を計算
• addSOS ( 1 or 2, 変数リスト,重み
  ( option )):特殊順序集合( Special
  Ordered Set : SOS )を追加
パラメータの設定
 書式:
 setParam(“ パラメータ名” , 値)
 model.Params. パラメータ名 = 値
例:混合整数計画( MIP )の相対誤差
 (終了条件);規定値は 10-4
setParam(“MIPGap”,0.0)
model.Params.MIPGap=0.0
よく使うパラメータ
• TimeLimit :計算時間上限(秒)
• MIPGap :相対誤差上限(規定値は 10-4 )
• MIPFocus : MIP 探索戦略( 0= バランス ,1=
  暫定解改良 ,2= 最適性の保証 ,3= 限界値改
  良)
• SolutionNumber :探索中に発見された解の番
  号
• LPMethod :線形計画の解法( 0= 主単体, 1=
  双対単体, 2= 内点)
• OutputFlag :出力制御( 0=Off , 1=On )
属性( attributes )
書式:
 オブジェクト .setAttr(“ 属性名” , 値)
 オブジェクト . 属性名 = 値
例:変数 var の目的関数の係数を 100 に
  変更
 var.setAttr(“Obj”,100)
 var.Obj=100
よく使う属性( 1 )
• モデル
 – ObjVal :最適目的関数値(最適化後のみ)
 – ModelSense :目的関数の方向( 1= 最小化, -1= 最
   大化)
 – Runtime :計算時間(最後の求解時の)
 – Status :モデルの状態(1から 1 3まで;
   2=OPTIMAL, 3=INFEASIBLE, 4=UNBOUNDED,
   9=TIME_LIMIT, 11=INTERRUPTED,
   13=SUBOPTIMAL)
 – SolCount :探索で見つかった解の数
よく使う属性(2)
• 変数
 – LB , UB :下限,上限
 – Obj :目的関数の係数
 – Vtype :変数の種類(“ C”= 連続,“ B”=2 値,“ I”= 整数,“ S” =半連続
   ,“ N”= 半整数
 – VarName :変数名
 – X :解の値
 – Xn :パラメータ SolutionNumber で指定された番号の解の値
 – RC :被約費用(連続最適化のみ)
• 制約
 –   Sense :制約の向き(“ <” ,“ >” ,“ =” )
 –   RHS :右辺定数
 –   ConstrName :制約名
 –   Pi :双対変数(連続最適化のみ)
 –   Slack :余裕変数の値
SCOP Objects

               addVariable(s)   Variable

      Model                      Linear
               addConstraint
                                Quadratic

                                 Alldiff
詳細については http://www.logopt.com/scop/
Model Object
 = Model(“name of model” )
  Methods              Attributes
• AddVariable(s)   • Params
• AddConstraint    • variables
• optimize         • constraints
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
OptSeq Objects

                 addActivity    Attribute
                                     addMode

        Model          addResource
                                     Mode

                                Resource
               addTemporal

                                Temporal

詳細については http://www.logopt.com/OptSeq/
Model Object
    = Model(“name of model” )
    Methods           Attributes
•   AddActivity   •   Params
•   AddResource   •   activities
•   AddTemporal   •   modes
•   optimize      •   resources
•   write         •   temporals
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

Mais conteúdo relacionado

Mais procurados

【DL輪読会】Hopfield network 関連研究について
【DL輪読会】Hopfield network 関連研究について【DL輪読会】Hopfield network 関連研究について
【DL輪読会】Hopfield network 関連研究についてDeep Learning JP
 
最適化超入門
最適化超入門最適化超入門
最適化超入門Takami Sato
 
最適輸送の解き方
最適輸送の解き方最適輸送の解き方
最適輸送の解き方joisino
 
SSII2021 [OS2-01] 転移学習の基礎:異なるタスクの知識を利用するための機械学習の方法
SSII2021 [OS2-01] 転移学習の基礎:異なるタスクの知識を利用するための機械学習の方法SSII2021 [OS2-01] 転移学習の基礎:異なるタスクの知識を利用するための機械学習の方法
SSII2021 [OS2-01] 転移学習の基礎:異なるタスクの知識を利用するための機械学習の方法SSII
 
サポートベクターマシン(SVM)の数学をみんなに説明したいだけの会
サポートベクターマシン(SVM)の数学をみんなに説明したいだけの会サポートベクターマシン(SVM)の数学をみんなに説明したいだけの会
サポートベクターマシン(SVM)の数学をみんなに説明したいだけの会Kenyu Uehara
 
最適輸送入門
最適輸送入門最適輸送入門
最適輸送入門joisino
 
強化学習その3
強化学習その3強化学習その3
強化学習その3nishio
 
機械学習モデルのハイパパラメータ最適化
機械学習モデルのハイパパラメータ最適化機械学習モデルのハイパパラメータ最適化
機械学習モデルのハイパパラメータ最適化gree_tech
 
スパースモデリング、スパースコーディングとその数理(第11回WBA若手の会)
スパースモデリング、スパースコーディングとその数理(第11回WBA若手の会)スパースモデリング、スパースコーディングとその数理(第11回WBA若手の会)
スパースモデリング、スパースコーディングとその数理(第11回WBA若手の会)narumikanno0918
 
Stochastic Variational Inference
Stochastic Variational InferenceStochastic Variational Inference
Stochastic Variational InferenceKaede Hayashi
 
遺伝的アルゴリズム (Genetic Algorithm)を始めよう!
遺伝的アルゴリズム(Genetic Algorithm)を始めよう!遺伝的アルゴリズム(Genetic Algorithm)を始めよう!
遺伝的アルゴリズム (Genetic Algorithm)を始めよう!Kazuhide Okamura
 
不老におけるOptunaを利用した分散ハイパーパラメータ最適化 - 今村秀明(名古屋大学 Optuna講習会)
不老におけるOptunaを利用した分散ハイパーパラメータ最適化 - 今村秀明(名古屋大学 Optuna講習会)不老におけるOptunaを利用した分散ハイパーパラメータ最適化 - 今村秀明(名古屋大学 Optuna講習会)
不老におけるOptunaを利用した分散ハイパーパラメータ最適化 - 今村秀明(名古屋大学 Optuna講習会)Preferred Networks
 
[DL輪読会]Non-Autoregressive Machine Translation with Latent Alignments
[DL輪読会]Non-Autoregressive Machine Translation with Latent Alignments[DL輪読会]Non-Autoregressive Machine Translation with Latent Alignments
[DL輪読会]Non-Autoregressive Machine Translation with Latent AlignmentsDeep Learning JP
 
最近のDeep Learning (NLP) 界隈におけるAttention事情
最近のDeep Learning (NLP) 界隈におけるAttention事情最近のDeep Learning (NLP) 界隈におけるAttention事情
最近のDeep Learning (NLP) 界隈におけるAttention事情Yuta Kikuchi
 
ゼロから始める深層強化学習(NLP2018講演資料)/ Introduction of Deep Reinforcement Learning
ゼロから始める深層強化学習(NLP2018講演資料)/ Introduction of Deep Reinforcement Learningゼロから始める深層強化学習(NLP2018講演資料)/ Introduction of Deep Reinforcement Learning
ゼロから始める深層強化学習(NLP2018講演資料)/ Introduction of Deep Reinforcement LearningPreferred Networks
 
[DL輪読会]近年のオフライン強化学習のまとめ —Offline Reinforcement Learning: Tutorial, Review, an...
[DL輪読会]近年のオフライン強化学習のまとめ —Offline Reinforcement Learning: Tutorial, Review, an...[DL輪読会]近年のオフライン強化学習のまとめ —Offline Reinforcement Learning: Tutorial, Review, an...
[DL輪読会]近年のオフライン強化学習のまとめ —Offline Reinforcement Learning: Tutorial, Review, an...Deep Learning JP
 
深層生成モデルと世界モデル(2020/11/20版)
深層生成モデルと世界モデル(2020/11/20版)深層生成モデルと世界モデル(2020/11/20版)
深層生成モデルと世界モデル(2020/11/20版)Masahiro Suzuki
 

Mais procurados (20)

双対性
双対性双対性
双対性
 
【DL輪読会】Hopfield network 関連研究について
【DL輪読会】Hopfield network 関連研究について【DL輪読会】Hopfield network 関連研究について
【DL輪読会】Hopfield network 関連研究について
 
coordinate descent 法について
coordinate descent 法についてcoordinate descent 法について
coordinate descent 法について
 
最適化超入門
最適化超入門最適化超入門
最適化超入門
 
最適輸送の解き方
最適輸送の解き方最適輸送の解き方
最適輸送の解き方
 
SSII2021 [OS2-01] 転移学習の基礎:異なるタスクの知識を利用するための機械学習の方法
SSII2021 [OS2-01] 転移学習の基礎:異なるタスクの知識を利用するための機械学習の方法SSII2021 [OS2-01] 転移学習の基礎:異なるタスクの知識を利用するための機械学習の方法
SSII2021 [OS2-01] 転移学習の基礎:異なるタスクの知識を利用するための機械学習の方法
 
サポートベクターマシン(SVM)の数学をみんなに説明したいだけの会
サポートベクターマシン(SVM)の数学をみんなに説明したいだけの会サポートベクターマシン(SVM)の数学をみんなに説明したいだけの会
サポートベクターマシン(SVM)の数学をみんなに説明したいだけの会
 
最適輸送入門
最適輸送入門最適輸送入門
最適輸送入門
 
強化学習その3
強化学習その3強化学習その3
強化学習その3
 
機械学習モデルのハイパパラメータ最適化
機械学習モデルのハイパパラメータ最適化機械学習モデルのハイパパラメータ最適化
機械学習モデルのハイパパラメータ最適化
 
スパースモデリング、スパースコーディングとその数理(第11回WBA若手の会)
スパースモデリング、スパースコーディングとその数理(第11回WBA若手の会)スパースモデリング、スパースコーディングとその数理(第11回WBA若手の会)
スパースモデリング、スパースコーディングとその数理(第11回WBA若手の会)
 
Stochastic Variational Inference
Stochastic Variational InferenceStochastic Variational Inference
Stochastic Variational Inference
 
線形計画法入門
線形計画法入門線形計画法入門
線形計画法入門
 
遺伝的アルゴリズム (Genetic Algorithm)を始めよう!
遺伝的アルゴリズム(Genetic Algorithm)を始めよう!遺伝的アルゴリズム(Genetic Algorithm)を始めよう!
遺伝的アルゴリズム (Genetic Algorithm)を始めよう!
 
不老におけるOptunaを利用した分散ハイパーパラメータ最適化 - 今村秀明(名古屋大学 Optuna講習会)
不老におけるOptunaを利用した分散ハイパーパラメータ最適化 - 今村秀明(名古屋大学 Optuna講習会)不老におけるOptunaを利用した分散ハイパーパラメータ最適化 - 今村秀明(名古屋大学 Optuna講習会)
不老におけるOptunaを利用した分散ハイパーパラメータ最適化 - 今村秀明(名古屋大学 Optuna講習会)
 
[DL輪読会]Non-Autoregressive Machine Translation with Latent Alignments
[DL輪読会]Non-Autoregressive Machine Translation with Latent Alignments[DL輪読会]Non-Autoregressive Machine Translation with Latent Alignments
[DL輪読会]Non-Autoregressive Machine Translation with Latent Alignments
 
最近のDeep Learning (NLP) 界隈におけるAttention事情
最近のDeep Learning (NLP) 界隈におけるAttention事情最近のDeep Learning (NLP) 界隈におけるAttention事情
最近のDeep Learning (NLP) 界隈におけるAttention事情
 
ゼロから始める深層強化学習(NLP2018講演資料)/ Introduction of Deep Reinforcement Learning
ゼロから始める深層強化学習(NLP2018講演資料)/ Introduction of Deep Reinforcement Learningゼロから始める深層強化学習(NLP2018講演資料)/ Introduction of Deep Reinforcement Learning
ゼロから始める深層強化学習(NLP2018講演資料)/ Introduction of Deep Reinforcement Learning
 
[DL輪読会]近年のオフライン強化学習のまとめ —Offline Reinforcement Learning: Tutorial, Review, an...
[DL輪読会]近年のオフライン強化学習のまとめ —Offline Reinforcement Learning: Tutorial, Review, an...[DL輪読会]近年のオフライン強化学習のまとめ —Offline Reinforcement Learning: Tutorial, Review, an...
[DL輪読会]近年のオフライン強化学習のまとめ —Offline Reinforcement Learning: Tutorial, Review, an...
 
深層生成モデルと世界モデル(2020/11/20版)
深層生成モデルと世界モデル(2020/11/20版)深層生成モデルと世界モデル(2020/11/20版)
深層生成モデルと世界モデル(2020/11/20版)
 

Semelhante a Or seminar2011final

第11回 配信講義 計算科学技術特論B(2022)
第11回 配信講義 計算科学技術特論B(2022)第11回 配信講義 計算科学技術特論B(2022)
第11回 配信講義 計算科学技術特論B(2022)RCCSRENKEI
 
lispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep Learninglispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep LearningSatoshi imai
 
Why Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuriWhy Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuriYuta Okamoto
 
自然言語処理に適した ニューラルネットのフレームワーク - - - DyNet - - -
自然言語処理に適した ニューラルネットのフレームワーク - - - DyNet - - -自然言語処理に適した ニューラルネットのフレームワーク - - - DyNet - - -
自然言語処理に適した ニューラルネットのフレームワーク - - - DyNet - - -Ogushi Masaya
 
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能準同型暗号の実装とMontgomery, Karatsuba, FFT の性能
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能MITSUNARI Shigeo
 
Sec15 dynamic programming
Sec15 dynamic programmingSec15 dynamic programming
Sec15 dynamic programmingKeisuke OTAKI
 
もしも… Javaでヘテロジニアスコアが使えたら…
もしも… Javaでヘテロジニアスコアが使えたら…もしも… Javaでヘテロジニアスコアが使えたら…
もしも… Javaでヘテロジニアスコアが使えたら…Yasumasa Suenaga
 
SSII2022 [TS3] コンテンツ制作を支援する機械学習技術​〜 イラストレーションやデザインの基礎から最新鋭の技術まで 〜​
SSII2022 [TS3] コンテンツ制作を支援する機械学習技術​〜 イラストレーションやデザインの基礎から最新鋭の技術まで 〜​SSII2022 [TS3] コンテンツ制作を支援する機械学習技術​〜 イラストレーションやデザインの基礎から最新鋭の技術まで 〜​
SSII2022 [TS3] コンテンツ制作を支援する機械学習技術​〜 イラストレーションやデザインの基礎から最新鋭の技術まで 〜​SSII
 
凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜
凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜
凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜Tomoki Yoshida
 
OpenCVの拡張ユーティリティ関数群
OpenCVの拡張ユーティリティ関数群OpenCVの拡張ユーティリティ関数群
OpenCVの拡張ユーティリティ関数群Norishige Fukushima
 
一般化線形混合モデル isseing333
一般化線形混合モデル isseing333一般化線形混合モデル isseing333
一般化線形混合モデル isseing333Issei Kurahashi
 
自然言語処理のための機械学習入門1章
自然言語処理のための機械学習入門1章自然言語処理のための機械学習入門1章
自然言語処理のための機械学習入門1章Hiroki Mizukami
 
"Puzzle-Based Automatic Testing: Bringing Humans into the Loop by Solving Puz...
"Puzzle-Based Automatic Testing: Bringing Humans into the Loop by Solving Puz..."Puzzle-Based Automatic Testing: Bringing Humans into the Loop by Solving Puz...
"Puzzle-Based Automatic Testing: Bringing Humans into the Loop by Solving Puz...nkazuki
 
RubyKaigi2014: Just in Time compiler for CRuby
RubyKaigi2014: Just in Time compiler for CRubyRubyKaigi2014: Just in Time compiler for CRuby
RubyKaigi2014: Just in Time compiler for CRubyimasahiro
 

Semelhante a Or seminar2011final (20)

Gurobi python
Gurobi pythonGurobi python
Gurobi python
 
第11回 配信講義 計算科学技術特論B(2022)
第11回 配信講義 計算科学技術特論B(2022)第11回 配信講義 計算科学技術特論B(2022)
第11回 配信講義 計算科学技術特論B(2022)
 
lispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep Learninglispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep Learning
 
画像処理の高性能計算
画像処理の高性能計算画像処理の高性能計算
画像処理の高性能計算
 
1次式とノルムで構成された最適化問題とその双対問題
1次式とノルムで構成された最適化問題とその双対問題1次式とノルムで構成された最適化問題とその双対問題
1次式とノルムで構成された最適化問題とその双対問題
 
Why Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuriWhy Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuri
 
Boost Tour 1.50.0 All
Boost Tour 1.50.0 AllBoost Tour 1.50.0 All
Boost Tour 1.50.0 All
 
Prosym2012
Prosym2012Prosym2012
Prosym2012
 
自然言語処理に適した ニューラルネットのフレームワーク - - - DyNet - - -
自然言語処理に適した ニューラルネットのフレームワーク - - - DyNet - - -自然言語処理に適した ニューラルネットのフレームワーク - - - DyNet - - -
自然言語処理に適した ニューラルネットのフレームワーク - - - DyNet - - -
 
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能準同型暗号の実装とMontgomery, Karatsuba, FFT の性能
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能
 
Sec15 dynamic programming
Sec15 dynamic programmingSec15 dynamic programming
Sec15 dynamic programming
 
もしも… Javaでヘテロジニアスコアが使えたら…
もしも… Javaでヘテロジニアスコアが使えたら…もしも… Javaでヘテロジニアスコアが使えたら…
もしも… Javaでヘテロジニアスコアが使えたら…
 
SSII2022 [TS3] コンテンツ制作を支援する機械学習技術​〜 イラストレーションやデザインの基礎から最新鋭の技術まで 〜​
SSII2022 [TS3] コンテンツ制作を支援する機械学習技術​〜 イラストレーションやデザインの基礎から最新鋭の技術まで 〜​SSII2022 [TS3] コンテンツ制作を支援する機械学習技術​〜 イラストレーションやデザインの基礎から最新鋭の技術まで 〜​
SSII2022 [TS3] コンテンツ制作を支援する機械学習技術​〜 イラストレーションやデザインの基礎から最新鋭の技術まで 〜​
 
凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜
凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜
凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜
 
OpenCVの拡張ユーティリティ関数群
OpenCVの拡張ユーティリティ関数群OpenCVの拡張ユーティリティ関数群
OpenCVの拡張ユーティリティ関数群
 
一般化線形混合モデル isseing333
一般化線形混合モデル isseing333一般化線形混合モデル isseing333
一般化線形混合モデル isseing333
 
自然言語処理のための機械学習入門1章
自然言語処理のための機械学習入門1章自然言語処理のための機械学習入門1章
自然言語処理のための機械学習入門1章
 
Boost tour 1_40_0
Boost tour 1_40_0Boost tour 1_40_0
Boost tour 1_40_0
 
"Puzzle-Based Automatic Testing: Bringing Humans into the Loop by Solving Puz...
"Puzzle-Based Automatic Testing: Bringing Humans into the Loop by Solving Puz..."Puzzle-Based Automatic Testing: Bringing Humans into the Loop by Solving Puz...
"Puzzle-Based Automatic Testing: Bringing Humans into the Loop by Solving Puz...
 
RubyKaigi2014: Just in Time compiler for CRuby
RubyKaigi2014: Just in Time compiler for CRubyRubyKaigi2014: Just in Time compiler for CRuby
RubyKaigi2014: Just in Time compiler for CRuby
 

Mais de Mikio Kubo

ここが変だよ人道支援ロジスティクス
ここが変だよ人道支援ロジスティクスここが変だよ人道支援ロジスティクス
ここが変だよ人道支援ロジスティクスMikio Kubo
 
サプライ・チェイン・アナリストになるために
サプライ・チェイン・アナリストになるためにサプライ・チェイン・アナリストになるために
サプライ・チェイン・アナリストになるためにMikio Kubo
 
ピカチュウによるPythonオブジェクト入門2
ピカチュウによるPythonオブジェクト入門2ピカチュウによるPythonオブジェクト入門2
ピカチュウによるPythonオブジェクト入門2Mikio Kubo
 
ピカチュウによるPythonオブジェクト入門
ピカチュウによるPythonオブジェクト入門ピカチュウによるPythonオブジェクト入門
ピカチュウによるPythonオブジェクト入門Mikio Kubo
 
久保研究室とは
久保研究室とは久保研究室とは
久保研究室とはMikio Kubo
 
Mickey mouseに会うために
Mickey mouseに会うためにMickey mouseに会うために
Mickey mouseに会うためにMikio Kubo
 
4章在庫の数理
4章在庫の数理4章在庫の数理
4章在庫の数理Mikio Kubo
 

Mais de Mikio Kubo (15)

Hl20160929
Hl20160929Hl20160929
Hl20160929
 
ここが変だよ人道支援ロジスティクス
ここが変だよ人道支援ロジスティクスここが変だよ人道支援ロジスティクス
ここが変だよ人道支援ロジスティクス
 
サプライ・チェイン・アナリストになるために
サプライ・チェイン・アナリストになるためにサプライ・チェイン・アナリストになるために
サプライ・チェイン・アナリストになるために
 
Why python
Why pythonWhy python
Why python
 
Why python
Why pythonWhy python
Why python
 
ピカチュウによるPythonオブジェクト入門2
ピカチュウによるPythonオブジェクト入門2ピカチュウによるPythonオブジェクト入門2
ピカチュウによるPythonオブジェクト入門2
 
ピカチュウによるPythonオブジェクト入門
ピカチュウによるPythonオブジェクト入門ピカチュウによるPythonオブジェクト入門
ピカチュウによるPythonオブジェクト入門
 
Pythonintro
PythonintroPythonintro
Pythonintro
 
Python opt
Python optPython opt
Python opt
 
久保研究室とは
久保研究室とは久保研究室とは
久保研究室とは
 
Mickey mouseに会うために
Mickey mouseに会うためにMickey mouseに会うために
Mickey mouseに会うために
 
Scmbook5 e
Scmbook5 eScmbook5 e
Scmbook5 e
 
4章在庫の数理
4章在庫の数理4章在庫の数理
4章在庫の数理
 
Current trend
Current trendCurrent trend
Current trend
 
Python ehon1
Python ehon1Python ehon1
Python ehon1
 

Or seminar2011final

  • 2. Why Python? • モジュールを読み込め ば何でもできる! • 最適化もできる! import gurobipy (MIP) import scop2 (CP) • import optseq2 (Scheduling) • 空を飛ぶことも!? import antigravity ? http://www.logopt.com/ mikiokubo/ に 20 分の入門ビデオ http://xkcd.com/353 /
  • 3. Python をお薦めする訳 • キーワード(覚えるべき予約後)が 30 程度と少 ない. • 字下げの強要で,誰でも読みやすいプログラム • 短時間で開発可能(行数が短く,モジュール豊 富) • 変数の宣言必要なし • インタープリタ(コンパイルする必要なし;並列 用コンパイラもついている) • メモリ管理も必要なし • 多くのプラットフォームで動作( Windows, Mac, Linux) • オブジェクト指向(すべてがオブジェクト)
  • 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
  • 6. MIP, CP, Scheduling Solvers • 混合整数計画 (MIP) ソルバー : Gurobi • 制約計画 (CP) ソルバー : SCOP (Solver for COnstraint Programming) • スケジューリング問題に特化したソルバー : OptSeq II モデリング ( 定式化)のコツ 使い分けのコツ 「新時代の最適化 -Python 言語を用いた 最適化入門 - 」近代科学社(執筆中)参照
  • 7. 混合整数計画とは Mixed Integer Programming (MIP) • 変数( Variables ) x : 実数,整数, 0-1 整数変数 ( Binary ) • 制約( Constraints) 線形 or ( 凸 ) 二次制約 minimize c’x+x’Qx ( 目的関数 ) subject to Ax=b ( 制約 )
  • 8. Gurobi 入門 (1) • モデルオブジェクトの生成 model = Model("Wine Blending")
  • 9. Gurobi 入門 (2) • 変数オブジェクトの追加 x1 = model.addVar(name="x1") x2 = model.addVar(name="x2") x3 = model.addVar(name="x3") • モデルの更新 ( 制約を追加する前には必須. 怠惰な更新 (lazy update); 高速化のための仕 様. ) model.update()
  • 10. Gurobi 入門 (3) • 目的関数の設定 model.setObjective(15*x1 + 18*x2 + 30*x3, GRB.MAXIMIZE) • 制約の追加 model.addConstr(2*x1 + x2 + x3 <= 60) model.addConstr(x1 + 2*x2 + x3 <= 60) model.addConstr(x3 <= 30) • 最適化 model.optimize()
  • 11. リストを用いたモデル化 • 変数オブジェクトをリストに追加 x=[   ] for i in range(1,4): var=model.addVar(name=“x[%s]”%i) x.append(var) • 制約 “ x1 + x2 + x3 <= 2” の追加 model.addConstr( sum(x) <= 2 ) or model.addConstr( quicksum(x) <= 2 ) X[1] X[2] X[3] ・・・
  • 12. 辞書を用いたモデル化 (1) • 辞書( Dictionary )は,ワインの種類 (“ Dry”, “Medium”, “Sweet”) をキーとし, 変数オブジェクトを値とした写像型 x={ } x[“Dry”]= model.addVar(name=“Dry”) x[“Medium”]= model.addVar(name=“Medium”) x[“Sweet”]= model.addVar(name=“Sweet”) 値 キー 写 “ ニーハオ” “Hello”, Variable Object “Dry   Wine”
  • 13. 辞書を用いたモデル化 (2) • 制約 “ 2 x1 + x2 + x3 <= 30” の追加 model.addConstr( 2*x[“Dry”]+ x[“Medium”] +x[“Sweet”] <=30 ) Blends, Profit = multidict({"Dry":15, "Medium":18, "Sweet":30}) multidict => Blends=["Dry", "Medium“, "Sweet“] Profit[“Dry”]=15, Profit[“Medium”]=18, ...
  • 14. 辞書を用いたワイン製造モデル (1) Blends, Profit = multidict({"Dry":15, "Medium":18, "Sweet":30}) multidict => Blends=["Dry", "Medium“, "Sweet“] List of Keys Profit[“Dry”]=15, Profit[“Medium”]=18, ... Grapes, Inventory = multidict({"Alfrocheiro":60, "Baga":60, "Castelao":30}) Use = { ("Alfrocheiro","Dry"):2, ("Alfrocheiro","Medium"):1, ("Alfrocheiro","Sweet"):1, ("Baga","Dry"):1, .... }
  • 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()
  • 16. k-median 問題 • min-sum 型の施設配置問題 • 顧客数 n=200 ,施設数 k=20 (顧客上から選択) • Euclid 距離,座標は一様ランダム
  • 17. 定式化 弱い定式化
  • 18. Python での実装( 1 ) from gurobipy import * #gurobipy モジュールの読み込み # k-median ソルバーの関数 def solve(n,k,cost): model=Model(“median”) # モデルオブジェクトの生成 y={} # 変数を表す辞書の準備 x={} キー 値 “Hanako”, 写像 “127cm” (1,2) 変数オブジェクト
  • 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
  • 24. 上界と下界の変化 18 16 14 Obj. Func . Va lue 12 10 8 6 4 2 0 0 10 20 30 40 50 60 70 CPU
  • 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?
  • 28. 定式化 最大距離を最小化
  • 29. 上界と下界の変化 1.2 1 0.8 Obj. Fun. Va lue 0.6 0.4 0.2 0 0 50 100 150 200 250 300 350 400 CPU Time 100 顧客, 10 施設 ( k-median は 200 施設, 20 顧客で 3 秒)
  • 30. k- 被覆問題としての定式化 被覆されない顧客数最小化 被覆されなければ1の変数 距離が θ 以下のとき 1 のパラメータ
  • 31. k- 被覆問題 +Binary Search 顧客・施設間の距離の上限 UB ,下限 LB while UB – LB >ε: θ= (UB+LB)/2 if k- 被覆問題の最適値が 0 then UB = θ else LB = θ
  • 33. 知見 • Min-max 型の目的関数は MIP ソルバーでは解 きにくい(双対ギャップが大きい;上界も下 界も悪いので,途中で止めても悪い解!). • 例: Job shop スケジューリングの最大完了時 刻(メイクスパン)最小化 => スケジューリ ング問題に特化したソルバーの方が良い! • k- 被覆問題を用いた二分探索だとある程度 min-max 型の目的関数を回避できる. • min-max 型の問題は,制約計画としてモデル 化して,上限を制約として扱うと良い.
  • 34. 巡回セールスマン問題(TS P) • すべての点をちょうど1回通る最短巡 回路 • 切除平面法で 85,900 点の実際問題(対 称TSP)の最適解
  • 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
  • 41. 部分巡回路除去制約を追加 整数解 連結成分を求めて切除平面を追加
  • 43. 知見 • 式を持ち上げ操作などで強化すると,高速化 され,大きな問題例が解けるようになる.  (そのためには多面体論の知識が多少必要な ので,専門家に相談.ちょっと式をいじるだ けで劇的に改善する場合もある!) • 他にも単品種フロー,多品種フロー定式化な どがある.(下界が強い方が良いとは限らな い! LP のサイズと解きやすさ(退化の具 合)を考慮して定式化を選択!) • 対称な問題なら分枝カット法が良い.
  • 44. 多品目ロットサイズ決定問題 • 段取り費用と在庫費用のトレードオフ を最適化する多期間生産計画 • 多品目で共通の資源を使う容量制約付 き問題は, MIP ソルバーには難問(と 言われてきた) • T=30 期, P=24 品目: Trigeiro, Thomas, McClain ( 1989 年)の最大のベンチ マーク
  • 45. ロットサイズ決定問題 標準定式化のフローモデル 生産量 (t) 在庫量 (t-1) 在庫量 (t) 期 t 需要量 (t) 弱い定式化の原因 生産量 (t)≦ 大きな数 “ Large M” × 段取りの有無 (t) 在庫量( t-1)+ 生産量 (t)= 需要量 (t)+ 在庫量( t) 0-1 変数
  • 46. ロットサイズ決定問題 施設配置定式化のフローモデル s 期に生産して t 期まで在庫される量 期 期 s t 需要量 (t) s 期に生産して t 期まで在庫される量 ≦需要量 (t)× 段取りの有無 (t) ∑期に生産して t 期まで在庫される量 = 需要量 (t) s s ≤t
  • 47. 定式化のサイズと強さの比較 標準定式化 施設配置定式化 変数の数 O(n) 変数の数 2 O(n ) 制約の数 弱い定式化 弱い定式化 強い定式化 O(n) 制約の数 2 追加した O(n ) = 線形計画緩和が (S,l) 不等式 整数多面体と一致 制約の数 (S,l) 不等式 O(2 n ) 切除平面 切除平面 n: 期数 強い定式化
  • 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 でも大丈夫!
  • 50. 知見 • 従来では難問と言われてきたロットサ イズ決定問題でもある程度までは大丈 夫 • 緩和固定法( Federgruen, Meissner,Tzur “Progressive Interval Heuristics for Multi- Item Capacitated Lot-Sizing Problems” 2007 )という MIP ベースのメタ解法を 作ってみたが,同時間通常の探索を行 う「打ち切り分枝限定法」の方が良 い!
  • 51. ビンパッキング問題 8 8 7 7 6 6 5 5 5 5 5 5 4 4 4 4 4 4 3 3 } 2 2 2 2 9 アイテム j=1,…,n のサイズ サイズ B のビン sj
  • 53. ビンパッキング問題の定式化 ビン j を使うとき1 アイテム i をビン j に入れるとき1 強い定式化の ための追加式 解の対称性のためあまり大きい問題例は解けない!
  • 54. 切断問題の定式化 初期パターンの線形緩和問題 切断パターンを使用する回数 [4, 0, 0, 0, 0, 0, 0] [0, 3, 0, 0, 0, 0, 0] [0, 0, 2, 0, 0, 0, 0] [0, 0, 0, 1, 0, 0, 0] [0, 0, 0, 0, 1, 0, 0] [0, 0, 0, 0, 0, 1, 0] [0, 0, 0, 0, 0, 0, 1] 最適双対変数 (1/4,1/3,1/2,1,1,1,1) 初期切断パターン(どのアイテムを何回切断するか)
  • 55. 新しいパターンの生成 ナップサック問題 y=(2, 0, 0, 1, 0, 0, 0)   最適値 1.5 列を追加して 再び求解
  • 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")
  • 58. 列生成法の応用事例 (タンカースケジューリング 問題) • タンカーのパーティションを考慮した 複雑な実際問題 • 海技研からの委託 • 可能なパターンの列挙,集合被覆問題 による選択を 2 回反復した解法 • 従来法( CP ): 9 時間かけて実行不能 • 開発法: 10 分程度で求解
  • 59. グラフ彩色問題 • 解の対称性 • 点数 n=40 ,彩色数上限 Kmax=10 • ランダムグラフ G(n,p=0.5) • 彩色数 8 が最適値
  • 60. 定式化 弱い定式化
  • 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
  • 64. 定式化の改良 対称性の除去(番号の小さい方の色を優先して使う!) 特殊順序集合( SOS: Special Ordered Set ) Type 1 (いずれか 1つの変数が正になることの宣言)の追加 model.addSOS(1, 変数リス ト)
  • 65. 上界と下界の変化(対称性除 12 去) 10 Obj. Func . Va lue 8 6 4 2 0 0 50 1 00 1 50 200 250 300 350 400 450 CPU Optimize a model with 3829 Rows, 410 Columns and 11758 NonZeros Explored 4399 nodes (1013290 simplex iterations) in 384.53 seconds MIPFocus=2 (最適性保証優先) で 67 秒, MIPFocus=3 (下界優先) で
  • 66. 上界と下界の変化( +SOS ) 12 10 Obj. Func . Va l. 8 6 4 2 0 0 5 10 15 20 25 CPU Optimize a model with 3829 Rows, 410 Columns and 11758 NonZerosExplored 109 nodes (58792 simplex iterations) in 22.02 seconds MIPFocus=2 (最適性保証優先) で 65 秒, MIPFocus=3 (下界優先) で 126 秒
  • 67. Fixed-K approach 悪い枝の数を最小化 枝の両端が同じ色(悪い枝)だと 1
  • 68. Fixed-K Approach +Binary Search 彩色数 K の上界 UB ,下界 LB while UB – LB >1: K= [ (UB+LB)/2 ] [ ] : Gauss の記号 if Fixd-K 定式化の最適値が 0 then UB = K else LB = K
  • 69. Improved Formulation Fixed-K Approach +Binary Search
  • 70. 知見 • 解の対称性のある問題は,下界の改善がしに くいので,分枝限定法では解きにくい(モダ ンなソルバーは群論などを用いた工夫を入れ てはいるが,あまり機能しない問題もある) • 対称性を除く工夫を入れると多少は改善 • SOS ( Special Ordered Set )制約の宣言は損 はない(ただし,探索手法の変更との相性は 悪い.) • K を固定すると解きやすくなり,二分探索は 有効
  • 71. 多目的最適化 • 非劣解の集合をどのように生成するか? ( Gurobi は分枝限定法で見つかった複数の 解を出力) • 線形和によるスカラー化 • 制約に変換してスライドさせる方法 • 理想点からの距離を最小化する方法
  • 72. 非劣解 とスカラー化法 第二目的関数 この領域の解は A に優越される スカラー化の A 目的関数の方向 スカラー化が見逃す非劣解 第一目的関数
  • 75. Gurobi Objects GRBError Variable addVar Model Column addSOS addConstr Constraint SOS Callbacks LinExpr QuadExpr
  • 76. Model Object = Model(“name of model” ) Methods Attributes • AddVar • Params • AddConstr • ObjVal • optimize • ModelSense • update • Runtime • getVars • Status • relax • SolCount ... ...
  • 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
  • 78. 変数追加メソッド addVar の 引数 • lb ( 下限 ) :規定値 =0 • ub ( 上限 ) :規定値 =GRB.INFINITY (無限 大) • obj ( 目的関数の係数 ) :=0 • vtype ( 変数の種類 ): GRB.CONTINUOUS (連 続変数; “ C” でも可) , GRB.BINARY ( 2 値 変数;“ B” ) , GRB.INTEGER (整数変 数;“ I” ) , GRB.SEMICONT ( 0 もしくはあ る範囲内の連続変数;“ S” でも可) , GRB.SEMIINT ( 0 もしくはある範囲内の整 数変数;“ N” でも可) • name ( 名前 ): =“”
  • 79. 制約追加メソッド addConstr の引 数 • l hs (左辺):線形制約オブジェク トか定数 • sense (制約の向き): GRB.LESS_EQUAL (≦;“ <” でも可) , GRB.EQUAL (=; “ =” でも可) , GRB.GREATER_EQUAL (≧;“ >” でも 可) • rhs (右辺):線形制約オブジェクトか 定数
  • 80. モデルのその他の主要メソッ ド • optimize( コールバック関数):最適化実行 • update :モデルの変更を Gurobi に知らせる • getVars :変数オブジェクトを入れたリスト を得る • relax :緩和問題を生成 • computeIIS :既約不整合部分系(実行不能に なっている原因の制約と変数; Irreducible Inconsistent Subsystem : IIS )を計算 • addSOS ( 1 or 2, 変数リスト,重み ( option )):特殊順序集合( Special Ordered Set : SOS )を追加
  • 81. パラメータの設定 書式: setParam(“ パラメータ名” , 値) model.Params. パラメータ名 = 値 例:混合整数計画( MIP )の相対誤差 (終了条件);規定値は 10-4 setParam(“MIPGap”,0.0) model.Params.MIPGap=0.0
  • 82. よく使うパラメータ • TimeLimit :計算時間上限(秒) • MIPGap :相対誤差上限(規定値は 10-4 ) • MIPFocus : MIP 探索戦略( 0= バランス ,1= 暫定解改良 ,2= 最適性の保証 ,3= 限界値改 良) • SolutionNumber :探索中に発見された解の番 号 • LPMethod :線形計画の解法( 0= 主単体, 1= 双対単体, 2= 内点) • OutputFlag :出力制御( 0=Off , 1=On )
  • 83. 属性( attributes ) 書式: オブジェクト .setAttr(“ 属性名” , 値) オブジェクト . 属性名 = 値 例:変数 var の目的関数の係数を 100 に 変更 var.setAttr(“Obj”,100) var.Obj=100
  • 84. よく使う属性( 1 ) • モデル – ObjVal :最適目的関数値(最適化後のみ) – ModelSense :目的関数の方向( 1= 最小化, -1= 最 大化) – Runtime :計算時間(最後の求解時の) – Status :モデルの状態(1から 1 3まで; 2=OPTIMAL, 3=INFEASIBLE, 4=UNBOUNDED, 9=TIME_LIMIT, 11=INTERRUPTED, 13=SUBOPTIMAL) – SolCount :探索で見つかった解の数
  • 85. よく使う属性(2) • 変数 – LB , UB :下限,上限 – Obj :目的関数の係数 – Vtype :変数の種類(“ C”= 連続,“ B”=2 値,“ I”= 整数,“ S” =半連続 ,“ N”= 半整数 – VarName :変数名 – X :解の値 – Xn :パラメータ SolutionNumber で指定された番号の解の値 – RC :被約費用(連続最適化のみ) • 制約 – Sense :制約の向き(“ <” ,“ >” ,“ =” ) – RHS :右辺定数 – ConstrName :制約名 – Pi :双対変数(連続最適化のみ) – Slack :余裕変数の値
  • 86. SCOP Objects addVariable(s) Variable Model Linear addConstraint Quadratic Alldiff 詳細については http://www.logopt.com/scop/
  • 87. Model Object = Model(“name of model” ) Methods Attributes • AddVariable(s) • Params • AddConstraint • variables • optimize • constraints
  • 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
  • 89. OptSeq Objects addActivity Attribute addMode Model addResource Mode Resource addTemporal Temporal 詳細については http://www.logopt.com/OptSeq/
  • 90. Model Object = Model(“name of model” ) Methods Attributes • AddActivity • Params • AddResource • activities • AddTemporal • modes • optimize • resources • write • temporals
  • 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

Notas do Editor

  1. bracket
  2. Brace
  3. Brace