食料配分 最適化
ある地域には限られた食料があり、それを異なる需要地域に配分する必要があります。
各地域の需要と供給が与えられており、最適な食料の配分計画を見つける必要があります。
制約条件として、供給される食料の総量が限られているとします。
解法
PuLPを使用してこの問題を解くためのソースコードは下記の通りです。
1 | from pulp import * |
①問題の定義
probという名前の最小化問題を定義するためのLpProblemオブジェクトを作成しています。
②供給地域と需要地域のリスト
供給地域のリストと需要地域のリストは、具体的な地域名のリストです。
このリストには、供給地域と需要地域の名前を含める必要があります。
③供給量と需要量のデータ
供給量と需要量は、各地域の供給量と需要量を示すデータです。
辞書型データとして、地域名をキーにして供給量と需要量を指定します
④変数の設定
xは、地域間の食料の配分量を表す変数です。
LpVariable.dicts()関数を使用して変数を作成します。
変数の名前は”x”であり、供給地域のリストと需要地域のリストの組み合わせで定義されます。
変数の下限は0であり、連続変数として設定されます。
⑤目的関数の定義
probの目的関数を定義しています。
目的関数は、地域間の食料の総配分量を最小化するように設定されています。
lpSum()関数を使用して、変数xの総和を求めています。
⑥制約条件の定義
制約条件を定義しています。
各供給地域からの食料の総量は、その地域の供給量以下でなければなりません。
各需要地域の需要量は、その地域の需要量以上でなければなりません。
これらの制約条件は、forループを使用して各地域ごとに定義されます。
⑦最適化の実行
最適化の実行を行います。
PuLPのsolve()関数を使用して、定義した問題を解きます。
⑧結果の表示
最適化結果を表示します。
LpStatus[prob.status]を使用して、最適化の状態を表示します。
また、変数の値と最適な目的関数の値を表示します。
結果
上記のコードを実行すると次のような結果が表示されます。
[実行結果]
Status: Optimal x_地域A_地域X = 0.0 x_地域A_地域Y = 100.0 x_地域A_地域Z = 0.0 x_地域B_地域X = 0.0 x_地域B_地域Y = 50.0 x_地域B_地域Z = 150.0 x_地域C_地域X = 120.0 x_地域C_地域Y = 30.0 x_地域C_地域Z = 0.0 Optimal Cost: 450.0
最適化の状態が「Optimal」であることを示しています。
つまり、制約条件の下で最適解が見つかったことを意味します。
最適化の結果として求められた配分プランは次のようになります:
🔹地域Aは地域Yに100.0単位の食料を供給します。
🔹地域Bは地域Yに50.0単位、地域Zに150.0単位の食料を供給します。
🔹地域Cは地域Xに120.0単位、地域Yに30.0単位の食料を供給します。
これにより、全体の食料の配分量が最小化され、総配分量は450.0となります。