このページは、nAGライブラリのJupyterノートブックExampleの日本語翻訳版です。オリジナルのノートブックはインタラクティブに操作することができます。
生産計画問題の異なるバリエーションを編集して解く
このノートブックの正しいレンダリング
このノートブックでは、方程式と参照のためにlatex_envs
Jupyter拡張機能を使用しています。ローカルのJupyterインストールでLaTeXが正しくレンダリングされない場合は、この拡張機能をインストールしていない可能性があります。詳細は
https://jupyter-contrib-nbextensions.readthedocs.io/en/latest/nbextensions/latex_envs/README.html
をご覧ください。
問題の説明
工場が2種類の化学物質
化学物質は流体とみなされるため、量
この問題は線形計画問題として定式化できます:
# nAG最適化モデリングスイートを使用して線形プログラムを定義し解く
from naginterfaces.library import opt
from naginterfaces.base import utils
= 1.0e20
infbnd
# 変数の数で最適化モデルのハンドルを初期化する
= opt.handle_init(2)
handle
# 線形目的関数を定義する
=[2.0, 4.5])
opt.handle_set_linobj(handle, cvec
# 箱型制約
opt.handle_set_simplebounds(
handle,=[0.0, 0.0],
bl=[infbnd, 100])
bu
# 線形制約を設定する
opt.handle_set_linconstr(
handle,=[-infbnd, -infbnd, -infbnd],
bl=[1500.0, 6000.0, 16000.0],
bu=[1, 1, 2, 2, 3, 3],
irowb=[1, 2, 1, 2, 1, 2],
icolb=[1.2, 3.0, 6.0, 10.0, 40.0, 80.0]
b
)
# アルゴリズムのオプションをいくつか設定する
for option in [
'Print Options = NO',
'Print Level = 1',
'Task = Max',
'Print Solution = X',
]:
opt.handle_opt_set(handle, option)
# 省略された反復出力のために明示的なI/Oマネージャーを使用する:
= utils.FileObjManager(locus_in_output=False)
iom
# 問題を解く
= opt.handle_solve_lp_ipm(handle, io_manager=iom) res
E04MT, Interior point method for LP problems
Status: converged, an optimal solution found
Final primal objective value 8.500000E+02
Final dual objective value 8.500000E+02
Primal variables:
idx Lower bound Value Upper bound
1 0.00000E+00 2.00000E+02 inf
2 0.00000E+00 1.00000E+02 1.00000E+02
最適な配分は、A1を200単位、A2を100単位生産し、総利益は850$となります。
工場拡張:新しい化学物質A3を生産可能
A3に関する以下のデータが利用可能です: - A3の1単位は共通機械で5分かかります; - A3の1単位は12平方メートルの包装材料を使用します; - A3の1単位は120kgの重さがあります; - A3の1単位は7$の利益を生み出します; - A3の生産は1日50単位に制限されています。
問題は以下のようになります:
# 問題を編集して新しい工場の生産能力を考慮する
# 変数を追加する
=1)
opt.handle_add_vars(handle, nadd
# 新しい変数に対する箱型制約
='X', idx=3, bli=0.0, bui=50.0)
opt.handle_set_bound(handle, comp
# 線形目的関数の要素を追加する
=3, ci=7.0)
opt.handle_set_linobj_coeff(handle, idxci
# 線形制約係数を追加
=1, icolbj=3, bij=5.0)
opt.handle_set_linconstr_coeff(handle, idlc=2, icolbj=3, bij=12.0)
opt.handle_set_linconstr_coeff(handle, idlc=3, icolbj=3, bij=120.0)
opt.handle_set_linconstr_coeff(handle, idlc
# 問題をもう一度解いてください
= opt.handle_solve_lp_ipm(handle, io_manager=iom) res
E04MT, Interior point method for LP problems
Status: converged, an optimal solution found
Final primal objective value 9.000000E+02
Final dual objective value 9.000000E+02
Primal variables:
idx Lower bound Value Upper bound
1 0.00000E+00 5.00000E+01 inf
2 0.00000E+00 1.00000E+02 1.00000E+02
3 0.00000E+00 5.00000E+01 5.00000E+01
新しい最適解は、A_1を50単位、A_2を100単位、A_3を50単位生産し、総利益は900$となります。
新規制:追加制約
後日、規制の変更により、製品A_2とA_3は市場に送られる前に厳格な品質保証テストを受ける必要が生じました。現在、工場は1日あたり合計100単位しか処理できず、これは線形計画に以下の制約を追加することになります:
# 線形制約を追加する
opt.handle_set_linconstr(
handle,=[-infbnd],
bl=[100.0],
bu=[1, 1],
irowb=[2, 3],
icolb=[1.0, 1.0]
b
)
# 問題をもう一度解いてください
= opt.handle_solve_lp_ipm(handle, io_manager=iom) res
E04MT, Interior point method for LP problems
Status: converged, an optimal solution found
Final primal objective value 8.750000E+02
Final dual objective value 8.750000E+02
Primal variables:
idx Lower bound Value Upper bound
1 0.00000E+00 1.50000E+02 inf
2 0.00000E+00 5.00000E+01 1.00000E+02
3 0.00000E+00 5.00000E+01 5.00000E+01
新しい規制により、
opt.handle_free(handle)