第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
ダウンロード

PowerPoint - LOG OPT HOME