生産計画問題の異なるバリエーションを編集して解く

NAG Library for Python Example集

このページは、NAGライブラリのJupyterノートブックExampleの日本語翻訳版です。オリジナルのノートブックはインタラクティブに操作することができます。

生産計画問題の異なるバリエーションを編集して解く

このノートブックの正しいレンダリング

このノートブックでは、方程式と参照のためにlatex_envs Jupyter拡張機能を使用しています。ローカルのJupyterインストールでLaTeXが正しくレンダリングされない場合は、この拡張機能をインストールしていない可能性があります。詳細は https://jupyter-contrib-nbextensions.readthedocs.io/en/latest/nbextensions/latex_envs/README.html をご覧ください。

問題の説明

工場が2種類の化学物質\(A_1\)\(A_2\)を製造できる状況を考えます。工場の目標は、以下の状況下で利益を最大化するために、各化学物質の量\(x_1\)\(x_2\)を決定することです: - \(A_1\)の1単位は40kg、\(A_2\)の1単位は80kgの重さがあります; - 輸送能力に合わせて、1日の総生産量は16000kgを超えることはできません; - 工場は\(A_1\)の1単位につき2ドル、\(A_2\)の1単位につき4.5ドルの利益を生み出します; - 両製品はそれぞれのプロセスの一部として同じ機械を使用する必要があります;A1の1単位は1.2分の機械時間を必要とし、\(A_2\)の1単位は3分を必要とします;機械は1日1500分しか機能しません; - \(A_1\)の1単位は6平方メートルの包装材料を使用し、\(A_2\)の1単位は10平方メートルを使用します;1日に6000平方メートルの包装材料が利用可能です; - \(A_2\)の生産は1日100単位に制限されています。

化学物質は流体とみなされるため、量\(x_1\)\(x_2\)は整数値に限定されないことに注意してください。

この問題は線形計画問題として定式化できます:

\[\begin{equation*} \begin{array}{lll} \underset{x\in\Re^n}{\mbox{maximize}} & 2x_1+4.5x_2&\\[0.6ex] \mbox{subject to} & 1.2x_1 + 3x_2 \leq 1500, &\text{ (機械時間制約)} \\[0.6ex] & 6x_1+10x_2 \leq 6000, & \text{ (包装材料制約)} \\[0.6ex] & 40x_1+80x_2 \leq 16000, & \text{ (輸送制約)} \\[0.6ex] & 0 \leq x_1, & \text{ (容量制約)} \\[0.6ex] & 0 \leq x_2 \leq 100 & \text{ (容量制約)} \\[0.6ex] \end{array} \end{equation*}\]

# NAG最適化モデリングスイートを使用して線形プログラムを定義し解く

from naginterfaces.library import opt
from naginterfaces.base import utils

infbnd = 1.0e20
    
# 変数の数で最適化モデルのハンドルを初期化する
handle = opt.handle_init(2)

# 線形目的関数を定義する
opt.handle_set_linobj(handle, cvec=[2.0, 4.5])

# 箱型制約
opt.handle_set_simplebounds(
    handle,
    bl=[0.0, 0.0],
    bu=[infbnd, 100])

# 線形制約を設定する
opt.handle_set_linconstr(
    handle,
    bl=[-infbnd, -infbnd, -infbnd],
    bu=[1500.0, 6000.0, 16000.0],
    irowb=[1, 1, 2, 2, 3, 3],
    icolb=[1, 2, 1, 2, 1, 2],
    b=[1.2, 3.0, 6.0, 10.0, 40.0, 80.0]
)

# アルゴリズムのオプションをいくつか設定する
for option in [
        'Print Options = NO',
        'Print Level = 1',
        'Task = Max',
        'Print Solution = X',
]:
    opt.handle_opt_set(handle, option)

# 省略された反復出力のために明示的なI/Oマネージャーを使用する:
iom = utils.FileObjManager(locus_in_output=False)

# 問題を解く
res = opt.handle_solve_lp_ipm(handle, io_manager=iom)
 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単位に制限されています。

問題は以下のようになります:

\[\begin{equation*} \begin{array}{lll} \underset{x\in\Re^n}{\mbox{maximize}} & 2x_1+4.5x_2+7x_3&\\[0.6ex] \mbox{subject to} & 1.2x_1 + 3x_2 + 5x_3 \leq 1500, &\text{ (machine time constraint)} \\[0.6ex] & 6x_1+10x_2+12x_3 \leq 6000, & \text{ (packaging material constraint)} \\[0.6ex] & 40x_1+80x_2+120x_3 \leq 16000, & \text{ (transport constraint)} \\[0.6ex] & 0 \leq x_1, & \text{ (capacity constraint)} \\[0.6ex] & 0 \leq x_1 \leq 100 & \text{ (capacity constraint)} \\[0.6ex] & 0 \leq x_3 \leq 50 & \text{ (capacity constraint)} \\[0.6ex] \end{array} \end{equation*}\]

# 問題を編集して新しい工場の生産能力を考慮する
# 変数を追加する
opt.handle_add_vars(handle, nadd=1)

# 新しい変数に対する箱型制約
opt.handle_set_bound(handle, comp='X', idx=3, bli=0.0, bui=50.0)

# 線形目的関数の要素を追加する
opt.handle_set_linobj_coeff(handle, idxci=3, ci=7.0)

# 線形制約係数を追加
opt.handle_set_linconstr_coeff(handle, idlc=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)

# 問題をもう一度解いてください
res = opt.handle_solve_lp_ipm(handle, io_manager=iom)
 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単位しか処理できず、これは線形計画に以下の制約を追加することになります: \[\begin{equation*} \begin{array}{ll} x_2+x_3 \leq 100 & \text{ (規制制約)} \\[0.6ex] \end{array} \end{equation*}\]

# 線形制約を追加する
opt.handle_set_linconstr(
    handle,
    bl=[-infbnd],
    bu=[100.0],
    irowb=[1, 1],
    icolb=[2, 3],
    b=[1.0, 1.0]
)

# 問題をもう一度解いてください
res = opt.handle_solve_lp_ipm(handle, io_manager=iom)
 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

新しい規制により、\(A_1\)を150単位、\(A_2\)を50単位、\(A_3\)を50単位生産することで、最大利益875ドルを達成できます。

opt.handle_free(handle)
関連情報
MENU
Privacy Policy  /  Trademarks