プログラム初心者がpythonを勉強する方法!その5・pulpで数理最適化・線形計画法にトライしてみる!

スポンサーリンク
050-VBA

へっぽこヘタレシステム管理者の管理人です。

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摂取量
栄養素x412>=20
栄養素y125>=15
単価24 

上の表に示す 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

本日はここまで。

ブログ開設に必要なドメイン取得、サーバーレンタル、ASPの登録等は、こちらのサイトから!

コメント

タイトルとURLをコピーしました