第4回 線形計画 2000年11月 第4回 線形計画 1 内容 •線形計画と図式解法 •辞書と単体法 •番外編 Excelによる線形計画 2000年11月 第4回 線形計画 2 線形計画法の大まかな歴史 1947年 単体法 Dantzig 比較的単純な方法 1979年 楕円体法 Khachian 多項式時間解法,非実際的 1984年 内点法 Karmarkar 理論的には多項式時間解法,実際的に効率的 2000年11月 第4回 線形計画 3 丼チェーン店長の悩み トンコケ丼,コケトン丼,ミックス丼の3種類 トンコケ丼を1杯作るには,200グラムの豚肉と100グラムの鶏肉 コケトン丼を1杯作るには,100グラムの豚肉と200グラムの鶏肉 ミックス丼は,豚肉,鶏肉,牛肉を100グラムずつミックス 豚,鶏,牛の肉は,最大1日あたり6キログラム,6キログラム,3 キログラム 販売価格は,トンコケ丼1杯1500円,コケトン丼1杯1800円,ミッ クス丼1杯3000円 お店の利益を最大にするためには,あなたは丼を何杯ずつ作るよ うに指示を出せばよいのだろうか? 2000年11月 第4回 線形計画 4 丼チェーン店長の悩み(図) 種類 トンコケ丼 豚 2 1 1 60 鶏 1 2 1 60 牛 0 0 1 30 利益 (百円) 15 18 2000年11月 コケトン丼 ミックス丼 使用可能量 (百グラム) 第4回 線形計画 30 5 定式化 トンコケ丼の数:x1(杯) コケトン丼の数:x2 (杯) ミックス丼の数:x3 (杯) 収益の合計:15x1+18x2+30x3 (百円) 材料の使用可能量の上限 豚肉: 2 x1 x2 x3 60 鶏肉: x1 2 x2 x3 60 (百グラム) 牛肉: x3 30 変数 目的関数 制約式 丼の数は非負 x1 0, x2 0, x3 0 2000年11月 第4回 線形計画 6 定式化 最大化 15 x1 18 x2 30 x3 条件 2 x1 x2 x3 60 x1 2 x2 x3 60 x3 30 x1 , x2 , x3 0 線形 変数の加減算より構成 すべての式が線形な問題 線形計画問題 変数の組 解 全ての制約式を満たす解 実行可能解 最適解 目的関数を最大にする実行可能解 最適解における目的関数値 2000年11月 最適目的関数値(最適値) 第4回 線形計画 7 定式化 2 x1 x2 x3 60 豚肉の使用可能量を表す制約式 制約式を等号で満たすような集合 {(x1, x2, x3) | 2x1 + x2 + x3 = 60} 半空間 (3次元の場合)平面 (4次元以上の場合)→超平面 2 x1 x2 x3 60 全ての制約式を満たす領域→半空間の共通部分 実行可能領域 2000年11月 第4回 線形計画 8 直感的理解 60 x3 平面 2x1 + x2 + x3 = 60 60 30 x1 2000年11月 (a) 第4回 線形計画 x2 9 直感的理解 60 x3 平面 x1 + 2x2 + x3 = 60 30 60 2000年11月 x2 x1 (b) 第4回 線形計画 10 直感的理解 x3 平面 x3 = 30 30 x2 x1 2000年11月 第4回 線形計画 11 直感的理解 x3 丼チェーン店の例題の 実行可能領域 30 多面集合 30 30 x1 2000年11月 x2 (d) 第4回 線形計画 12 多面集合 n x1 , x2 , x3 | aij x j bi , i 1,2,, m j 1 数式による表現 有界な多面集合→多面体 2000年11月 第4回 線形計画 13 多面集合 線形計画問題の目的 ↓ 実行可能領域の中で目的関数が最大の点を求めること ↓ 目的関数を等式に直す x3 z = 15x1 + 18x2 + 30x3 (10,10,30) zを固定したとき,この制約は平面 ↓ 実行可能領域との共通部分が なくならないように zを大きくする 端点 x2 x1 2000年11月 第4回 線形計画 14 定理1:多面集合の端点 多面集合Pを与えたとき,ベクト ルxが, xと異なるP内 の2つのベクトル y, z Pとスカラー 0,1によってx y 1 z と書き表せないとき, xはPの端点と呼ばれる. 多面集合が有界である 端点でない z x y 必ず端点を持つ P z 2000年11月 x y 端点 多面集合が直線を含まない (直線と半直線・線分は異なることに注意) 第4回 線形計画 15 端点を持たない多面集合の例 有界でない多面集合 2000年11月 第4回 線形計画 16 最適解が端点でない例 直線上は全て最適解 P 目的関数の方向ベクトル 直線上の両端は端点なので 端点の中に最適解が存在することは 保証される 2000年11月 第4回 線形計画 17 定理2 線形計画問題に最適解が存在し,線形計画問題の制約からな る多面集合が少なくとも1つの端点を持つならば,多面集合 の端点の中に最適解が存在する. 2000年11月 第4回 線形計画 18 ちょっと練習 丼チェーン店の例題の制約を表す多面体の全ての端点 (8つ)を求めてみよう. x3 それぞれの平面の式は 2x1 + x2 + x3 = 60 x1 + 2x2 + x3 = 60 x3 = 30 x1 = x2 = x3 = 0 (10,10,30) x2 x1 2000年11月 第4回 線形計画 19 さらに練習 丼チェーン店の例題の制約を表す多面体の全ての端点 (8つ)に対応する目的関数値を求めてみよう. x3 (10,10,30) x2 x1 2000年11月 第4回 線形計画 20 最適解 最適解 目的関数値:1230(対応する端点は(10,10,30)) 丼チェーンの店長は,トンコケ丼を10杯,コケトン丼を10杯, ミックス丼を30杯作るよう指示すればよい. 1日あたり123000円の利益をあげることができる. 2000年11月 第4回 線形計画 21 実際には 実際には,全ての端点を数え上げてその目的関数 を計算することは非効率的. 効率的に最適解を算出したほうがよい. 2000年11月 第4回 線形計画 22 単体法 適当な端点から出発して目的関数値を改良する端 点に移動 ↓ 最小木問題で勉強した改善法の考え方 目的関数の方向 1947年 Dantzigが単体法を考案 太陽(目的関数)の暖かさに誘 われた蟻さんが多面体の縁を たどって移動 2000年11月 第4回 線形計画 23 余裕変数 制約式を等式に直すために余裕(スラック)変数を 導入 標準形 最大化 15 x1 18 x2 30 x3 条件 2 x1 x2 x3 60 最大化 15 x1 18 x2 30 x3 z 条件 x1 2 x2 x3 s2 60 x1 2 x2 x3 60 x3 s3 30 x3 30 x1 , x2 , x3 , s1 , s2 , s3 0 x1 , x2 , x3 0 2000年11月 2 x1 x2 x3 s1 60 第4回 線形計画 24 余裕変数を含めた端点と目的関数値 x1 0 x2 0 x3 0 s1 60 s2 60 s3 30 目的関数値(百円) 0 30 0 20 0 0 30 20 0 0 0 0 30 0 30 0 30 30 0 0 30 30 30 30 0 450 540 660 900 15 0 10 0 15 10 30 30 30 0 15 0 15 0 0 0 0 0 1125 1170 1230 いずれもちょうど3つの変数が0になっている 2000年11月 第4回 線形計画 25 基底変数 0に固定した変数→非基底変数 それ以外の変数→基底変数 基底解 m本の等式制約,n個の変数 m個の変数が基底変数 n-m個の非基底変数 2000年11月 第4回 線形計画 26 基底解 x3 基底解 端点解 x2 x1 2000年11月 丸が基底解 黒丸は端点解 全ての変数が非負である基底解 →実行可能基底解 第4回 線形計画 27 単体法 実行可能基底解を次々と生成することによって 最適解を得る方法 基底解を表すには色々な流儀 今回は辞書による方法を採用 モダン 2000年11月 第4回 線形計画 28 初期辞書 非基底変数 (=0) 初期辞書 z =0 +15x1 +18x2 +30x3 s1=60 -2x1 -x2 -x3 s2=60 -x1 -2x2 -x3 s3=30 -x3 基底変数 x1=x2=x3=0 s1=60, s2=60, s3=30 z=0 を表す 2000年11月 辞書表現 平たく言えば等式の集合 これを改善する 第4回 線形計画 29 改善 改善=zの値を増加 x3を1大きくすれば zは30増加 z =0 +15x1 +18x2 +30x3 x1を1大きくすれば zは15増加 x2を1大きくすれば zは18増加 x3だけを増加 2000年11月 第4回 線形計画 30 改善 x1, x2を固定しx3をどこまで大きくできる? s1=60 -x3 s2=60 -x3 s3=30 -x3 s1,s2,s3は非負より x3=30まで このときs3=0となる よってx3を基底変数としs3を非基底変数とする 2000年11月 第4回 線形計画 31 辞書の変形 初期辞書 z =0 +15x1 +18x2 +30x3 s1=60 -2x1 -x2 -x3 s2=60 -x1 -2x2 -x3 s3=30 -x3 どうなる? 等式変形を使う 2000年11月 次の辞書 z =?? +??x1 +??x2 +??s3 s1=?? +??x1 +??x2 +??s3 s2=?? +??x1+??x2 +??s3 x3=?? +??s3 第4回 線形計画 32 辞書の変形 次はここに注目 1反復後の辞書 z =900+15x1+18x2-30s3 s1=30 -2x1 -x2 +s3 s2=30 -x1 -2x2 +s3 x3=30 -s3 2000年11月 第4回 線形計画 33 ちょっと練習 x2を基底変数としてみよう. どれを非基底変数とする? 改善後の辞書は? 2000年11月 第4回 線形計画 34 辞書を用いた単体法の法則 法則1:非基底変数のうち最も改善効果の大きい変数を選び, それを基底変数にするように辞書を変形する 法則2:最も改善効果の大きい変数が複数ある場合には, 添え字の最も小さいものを選ぼう(巡回対策) 法則3:辞書の変形の際に,基底変数から非基底変数にでき るものが複数ある場合には,やっぱり添え字の最も小さいも のを選ぼう(退化対策) わかりづらい場合には 非基底変数→=の右側の変数 基底変数→=左側の変数 と読み替えても可 2000年11月 第4回 線形計画 35 さらに練習 3反復後の辞書を作ってみよう 2000年11月 第4回 線形計画 36 最終辞書 もう改善できそうに ないので終了 z 1230 4 s1 7 s2 19 s3 2 1 1 x1 10 s1 s2 s3 3 3 3 1 2 1 x2 10 s1 s2 s3 3 3 3 x3 30 s3 2000年11月 第4回 線形計画 37 番外編 Excelによる線形計画 2000年11月 第4回 線形計画 38 Excelに書く 次は変数を導入 2000年11月 第4回 線形計画 39 変数を導入 トンコケ丼の生産量x1を表す コケトン丼の生産量x2を表す 次は目的関数の設定 2000年11月 ミックス丼の生産量x3を表す 第4回 線形計画 40 目的関数の設定 次は制約条件の設定 2000年11月 第4回 線形計画 41 豚肉の使用量の制約 2000年11月 第4回 線形計画 42 鶏肉の使用量の制約 2000年11月 第4回 線形計画 43 牛肉の使用量の制約 これでシート上で必要な準備は整った,次はソルバーの使い方 2000年11月 第4回 線形計画 44 初めてのソルバー 2000年11月 第4回 線形計画 45 ソルバーとは OKを選択すれば 使えるようになる 2000年11月 第4回 線形計画 46 ソルバーの起動 2000年11月 第4回 線形計画 47 ソルバーの設定 2000年11月 第4回 線形計画 48 ソルバーの設定 2000年11月 第4回 線形計画 49 ソルバーの設定 2000年11月 第4回 線形計画 50 ソルバーの設定 2000年11月 第4回 線形計画 51 ソルバーの実行 準備が整ったら実行 2000年11月 第4回 線形計画 52 ソルバーの結果 これはどちらでも良い 2000年11月 第4回 線形計画 53 流通最適化工学 追加資料 Excel 2010でのソルバー起動法 • ファイル/(下部の)オプション/アドイン (Excel2007ではOfficeボタン,Excel2003で はツール/アドイン) • ソルバーアドインをクリックして,下部の管 理でExcelアドインの設定ボタンを押す. • 上部リボンのデータの右端にソルバーが できているので,それをクリック 2000年11月 第4回 線形計画 54 GurobiソルバーとPythonで求解! Gurobi (1) MIP solver Developed by: Zonghao Gu, Edward Rothberg,Robert Bixby Free academic license!計算機センターでGurobiを一度起動した後, Python IDLEで記述 • “gurobipy” モジュールの読み込み from gurobipy import * • モデルオブジェクト model をModelクラスから生成(引数はモデ ルの名前 55 2000年11月 第4回 線形計画 model = Model(“Product Mix") Gurobi (2) • 変数オブジェクトをmodelオブジェクトのaddVarメ ソッドを用いて生成(引数は名前;省略可) x1 = model.addVar(name="x1") x2 = model.addVar(name="x2") x3 = model.addVar(name="x3") • モデルの更新(制約を追加する前に必ず呼ぶ) model.update() 2000年11月 第4回 線形計画 56 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() 2000年11月 第4回 線形計画 57 Pythonのリストを用いた記述 • 変数オブジェクトをリストxに追加 x=[] for i in range(3): var=model.addVar() x.append(var) • 制約 “x1 + x2 + x3 <= 2”の記述 model.addConstr( sum(x) <= 2 ) もしくは model.addConstr( quicksum(x) <= 2 ) (高速版) 2000年11月 第4回 線形計画 58 Pythonの辞書を用いた記述 • 名前(“TonKoke”, “KokeTon”, “Mix”) を変数 オブジェクトの写像する辞書 x={} x[“TonKoke”]= model.addVar() x[“KokeTon”]= model.addVar() x[“Mix”]= model.addVar() • 制約“2x1 + x2 + x3 <= 30”の追加 model.addConstr( 2*x[“TonKoke”]+ x[“KokeTon”] +x[“Mix”] <=30 ) 2000年11月 第4回 線形計画 59 辞書を用いたデータ入力 Bowels, Profit = multidict({“TonKoke”:15, “KokeTon”:18, “Mix”:30}) => Bowels=[“TonKoke”, “KokeTon“, “Mix“] キー(丼)のリスト Profit[“TonKoke”]=15, Profit[“KokeTon”]=18, ... 利益の辞書 Meats, Inventory = multidict({“Pork":60, “Chiken":60, “Beef":30}) 肉のリスト Meetsと使用可能量の辞書の同時生成 Use = { (“Pork”,“TonKoke”):2, (“Pork”,“KokeTon”):1, (“Pork”,”Mix“):1, (“Chicken”,“TonKoke”):1, .... } 肉と丼のタプル(組)をキー,使用量を値とした辞書 2000年11月 第4回 線形計画 60 辞書を用いた最適化 x = {} # 変数を保管する辞書 for j in Bowels: # 丼ごとに変数の生成 x[j] = model.addVar() model.update() #モデルの更新 model.setObjective(quicksum(Profit[j]*x[j] for j in Bowels), GRB.MAXIMIZE) #目的関数の最大化 for i in Meats: model.addConstr(quicksum(Use[i,j]*x[j] for j in Bowels) <= Inventory[i]) #制約の追 model.optimize() print “Obj=”,model.ObjVal #最適値の表示 2000年11月 第4回 線形計画 61
© Copyright 2025 ExpyDoc