ExcelとPythonのソルバーを使っての線形最適化問題演習ー2
日花弘子著『仕事に役立つExcelビジネスデータ分析』(SB Creative)に載っている問題を参考に、
ExcelとPythonのソルバーを使って問題を解いてみる。
(問題)
製品A、製品B という製品が2つある
製品A を1つ 1000円で、5個以上 購入する
製品B を1つ 500円で、5個以上 購入する
購入金額は 10,000円 以内にしたい
製品Aと製品B の購入数合計を最大にするには、それぞれ何個づつ購入すればよいか?
またそのときの支払い金額はいくらになるか?
まず、Excel のソルバーで解く
問題を表にまとめると以下のようになる
各セルに設定された式を表示
ソルバーを使えるようにする。(「ファイル」-「オプション」-「アドオン」-「ソルバーアドオン」をアクティブにする)
「データ」-「ソルバー」をクリックして、下記のように設定する
上記のように設定後、「解決」をクリックする
(解)
製品A 5個、 製品B 10個、 合わせて 15個 購入して、支払い金額は 10,000円となる
次に、Python のソルバーで解を求める
ソルバーを使えるモジュール Pulp をインポートする(まだのときは、pip install pulp でインストールする)
jupyter notebook 上で作成する
# Python上で数理最適化問題を簡単にコーディングできるモデリングAPI、モデリング言語 pulp をインポート
import pulp
lp = pulp.LpProblem('lp-test2', pulp.LpMaximize)
# 求める購入数の設定(製品Aの購入数 xA,、製品Bの購入数 xB)
# xA >= 5, xB >= 5
xA = pulp.LpVariable('xA', 5)
xB = pulp.LpVariable('xB', 5)
# 評価関数の設定
lp += xA + xB
# 制約条件の設定
lp += 1000 * xA + 500 * xB <= 10000
# 最適化問題の確認
print(lp)
# 求解
lp.solve()
# 結果
print('製品Aの購入数:%d 個' % xA.value())
print('製品Bの購入数:%d 個' % xB.value())
print('購入数合計:%d 個' % (xA.value() + xB.value()))
print('')
print('支払い金額:{:,.0f} 円'.format(1000 * xA.value() + 500 * xB.value()))
「Shift」+「Enter」で実行すると
lp-test2:
MAXIMIZE
1*xA + 1*xB + 0
SUBJECT TO
_C1: 1000 xA + 500 xB <= 10000
VARIABLES
5 <= xA Continuous
5 <= xB Continuous
製品Aの購入数:5 個
製品Bの購入数:10 個
購入数合計:15 個
支払い金額:10,000 円
となり、Excelのソルバーと同じ結果を得る