へっぽこヘタレシステム管理者の管理人です。
python勉強5日目です。
だんだんと難易度が上がってきて、かなり付いていくのがヤバくなってきました。
さて今回はpulpを使って数理最適化と線形計画にトライしてみようかと思います。
pulpとは
【pulp】は、python で数理最適化のモデルを記述するためのモジュール
線形計画問題を解く【Python パッケージ】で、目的関数と制約条件が1次式で表される最適化問題を解決することができる。
とのことです。
とりあえず【pulp】をコマンドプロンプトからインストールします。
pip install pulp
連立方程式を解いてみる
それでは、試しに連立方程式を解いてみます。
問題は
リンゴ と もも を合わせて18個買いました。
リンゴは1個100円で、ももは1個200円です。
合計金額は、2800円でした。
リンゴとももはそれぞれ何個買いましたか?
リンゴ=x もも=y
x+y=18
100*x+200*y=2,800
#pulpをインポート
import pulp
#問題を定義
problem = pulp.LpProblem('test',pulp.LpMaximize)
#変数を定義
x = pulp.LpVariable('x',lowBound=0,cat=pulp.LpContinuous)
y = pulp.LpVariable('y',lowBound=0,cat=pulp.LpContinuous)
#制約を定義
problem += x + y == 18
problem += 100 * x + 200 * y == 2800
#解く
status = problem.solve()
#結果の出力
print('status',pulp.LpStatus[status])
print('x =',x.value(),'y =',y.value())
status Optimal
x = 8.0 y = 10.0
回答が出力されます。
リンゴ(x)=8個
もも(y)=10個
と正解が出ました。
線形計画法にトライ
次に線形計画法にトライします。
栄養素 | ||||
食品a | 食品b | 食品c | 摂取量 | |
栄養素x | 4 | 1 | 2 | >=20 |
栄養素y | 1 | 2 | 5 | >=15 |
単価 | 5 | 2 | 4 |
上の表に示す 3 種類の食品 (a, b, c) を使って、2 種類の栄養素 (x, y) の摂取量を満たす一番安い組み合わせを求めてみます。
求める最小コストは次の式となります。
最小値 = 5 * a + 5 * b + 4 * c
制約条件は次のとおりです。
4 * a + 1 * b + 2 * c >= 20
1 * a + 2 * b + 5 * c >= 15
a b c は正の整数
以上をコード化すると次となります。
#pulpをインポート
import pulp
#問題を定義
problem = pulp.LpProblem('test',pulp.LpMinimize)
#変数を定義
a = pulp.LpVariable('a',lowBound=0,cat=pulp.LpInteger)
b = pulp.LpVariable('b',lowBound=0,cat=pulp.LpInteger)
c = pulp.LpVariable('c',lowBound=0,cat=pulp.LpInteger)
#目的関数
problem += 5 * a + 2 * b + 4 * c
#制約を定義
problem += 4 * a + 1 * b + 2 * c >= 20
problem += 1 * a + 2 * b + 5 * c >= 15
print(problem)
#解く
status = problem.solve(pulp.PULP_CBC_CMD(msg=0))
#status = problem.solve() #pulp.PULP_CBC_CMD(msg=0)を記述しないとログが出る
#結果の出力
prin('status', pulp.LpStatus[status])
print('aの数 =', a.value())
print('bの数 =', b.value())
print('cの数 =', c.value())
print('最小のコスト =', problem.objective.value())
実行すると次の解答が出力されました。
test:
MINIMIZE
5*a + 2*b + 4*c + 0
SUBJECT TO
_C1: 4 a + b + 2 c >= 20
_C2: a + 2 b + 5 c >= 15
VARIABLES
0 <= a Integer
0 <= b Integer
0 <= c Integer
status Optimal
aの数 = 4.0
bの数 = 1.0
cの数 = 2.0
最小のコスト = 30.0
本日はここまで。
コメント