へっぽこヘタレシステム管理者の管理人です。
python勉強6日目です。
先日に引き続き・・・
pythonで線形計画法についてもう少し勉強します。
もうすでに訳が分かりません。
かなりしんどいですが・・・もう少しだけ頑張ってみようかと思います。
さて今回はpulpを使った線形計画でもう少し難しいことにトライしてみようかと思います。
もう少し難しい線形計画法にトライ
もう少し難しい線形計画法にトライします。
配送コストを求める問題
店 a | 店 b | 店 c | 供給量 | |
---|---|---|---|---|
工場 x | 10 | 6 | 16 | 8 |
工場 y | 8 | 8 | 4 | 16 |
需要量 | 12 | 4 | 8 |
よくある最小のコストを求める問題です。
工場(x と y) の供給量と
さらに各店舗(a と b と c)の需要量と
各店舗に配送した場合のコストが定められています。
各工場から各店舗にそれぞれ何個配送すれば最も安価に配送できるかを求める問題です。
求める回答は次のとおりです
最小 = 10 * xa + 6 * xb + 16 * xc + 8 * ya + 8 * yb + 4 * yc
制約条件は次のとおりです
xa + xb + xc = 8
ya + yb + yc =16
xa + ya = 12
xb + yb = 4
xc + yc = 8
となります。
とりあえず頑張ってコードを書いてみます。
#puloをインポート
import pulp
#問題を定義
problem = pulp.LpProblem('test',pulp.LpMinimize)
#変数を定義
xa = pulp.LpVariable('xa',lowBound=0,cat=pulp.LpInteger)
xb = pulp.LpVariable('xb',lowBound=0,cat=pulp.LpInteger)
xc = pulp.LpVariable('xc',lowBound=0,cat=pulp.LpInteger)
ya = pulp.LpVariable('ya',lowBound=0,cat=pulp.LpInteger)
yb = pulp.LpVariable('yb',lowBound=0,cat=pulp.LpInteger)
yc = pulp.LpVariable('yc',lowBound=0,cat=pulp.LpInteger)
#目的関数
problem += 10 * xa + 6 * xb + 16 * xc + 8 * ya + 8 * yb + 4 * yc
#制約を定義
problem += xa + xb + xc == 8
problem += ya + yb + yc == 16
problem += xa + ya == 12
problem += xb + yb == 4
problem += xc + yc == 8
print(problem)
#解く
status = problem.solve(pulp.PULP_CBC_CMD(msg=0))
#status = problem.solve() #pulp.PULP_CBC_CMD(msg=0)を記述しないとログが出る
#結果の出力
print('status', pulp.LpStatus[status])
print('xaの数 =', xa.value())
print('xbの数 =', xb.value())
print('ccの数 =', xc.value())
print('yaの数 =', ya.value())
print('ybの数 =', yb.value())
print('ycの数 =', yc.value())
print('最小のコスト =', problem.objective.value())
test:
MINIMIZE
10*xa + 6*xb + 16*xc + 8*ya + 8*yb + 4*yc + 0
SUBJECT TO
_C1: xa + xb + xc = 8
_C2: ya + yb + yc = 16
_C3: xa + ya = 12
_C4: xb + yb = 4
_C5: xc + yc = 8
VARIABLES
0 <= xa Integer
0 <= xb Integer
0 <= xc Integer
0 <= ya Integer
0 <= yb Integer
0 <= yc Integer
status Optimal
xaの数 = 4.0
xbの数 = 4.0
ccの数 = 0.0
yaの数 = 8.0
ybの数 = 0.0
ycの数 = 8.0
最小のコスト = 160.0
コメント