ExcelとPythonのソルバーを使っての線形最適化問題演習ー4 情報処理試験2種問題
『平成10年秋 情報処理試験2種』の問題を参考に、
ExcelとPythonのソルバーを使って問題を解いてみる。
(問題)
ある工場で製品A、Bを生産している。
製品Aを1トン製造するのに、原料P,Qをそれぞれ4トン、9トン必要とし、
製品Bについてもそれぞれ8トン、6トン必要とする。
また、製品A,Bは1トンあたり2万円、3万円の利益を生む。
しかし、原料はPは40トン、Qは54トンしかない。
利益を最大にする製品A,Bの生産量をソルバーを使用して求めなさい。
まず、Excel のソルバーで解く
問題を表にまとめると以下のようになる
各セルに設定された式を表示
ソルバーを使えるようにする。(「ファイル」-「オプション」-「アドオン」-「ソルバーアドオン」をアクティブにする)
「データ」-「ソルバー」をクリックして、下記のように設定する
上記のように設定後、「解決」をクリックする
(解)
製品A を 4トン、 製品B を 3トン 生産すると、最大利益が 170,000 円 となる
次に、Python のソルバーで解を求める
ソルバーを使えるモジュール Pulp をインポートする(まだのときは、pip install pulp でインストールする)
jupyter notebook 上で作成する
# Python上で数理最適化問題を簡単にコーディングできるモデリングAPI、モデリング言語 pulp をインポート
import pulp
lp = pulp.LpProblem('lp-test4', pulp.LpMaximize)
# 求める生産数の設定(製品Aの生産量 xA,、製品Bの生産量 xB)
# xA >= 0, xB >= 0
xA = pulp.LpVariable('xA', 0)
xB = pulp.LpVariable('xB', 0)
# 評価関数の設定
lp += 20000 * xA + 30000 * xB
# 制約条件の設定
lp += 4 * xA + 8 *xB <= 40
lp += 9 * xA + 6 * xB <= 54
# 最適化問題の確認
print(lp)
# 求解
lp.solve()
# 結果
print('製品Aの生産量:%d トン' % xA.value())
print('製品Bの生産量:%d トン' % xB.value())
print('')
print('最大利益:{:,.0f} 円'.format(20000 * xA.value() + 30000 * xB.value()))
「Shift」+「Enter」で実行すると
lp-test4:
MAXIMIZE
20000*xA + 30000*xB + 0
SUBJECT TO
_C1: 4 xA + 8 xB <= 40
_C2: 9 xA + 6 xB <= 54
VARIABLES
xA Continuous
xB Continuous
製品Aの生産量:4 トン
製品Bの生産量:3 トン
最大利益:170,000 円
となり、Excelのソルバーと同じ結果を得る