さまざまな要素 (鉄、水銀など) とのブレンドの問題に PuLp を使用しようとしています。しかし、最大/最小の利益/コストの代わりに、制約の使用率を最大化する必要があります。したがって、Excelでは次のようなものがありました(疑似コードで):
max Sum (for each Element: (Sumproduct([DecisionVariables] * [Values]) / [MaximumAllowedValueForThisElement]))
このような目的関数を使用したことはありませんが、Excel では機能するようです。
今度は、PuLP で同じ問題をモデル化したいと考えています。私が必要とするのは、次のようなものだと思います:
for Element in ELEMENTS:
prob += lpSum(DecisionVariable[Concentrate]*dic[Element][Concentrate]/ MaxAmount[Element] for Concentrate in CONCENTRATES)
ここで、ELEMENTS はすべての要素を含むリスト、CONCENTRATES は 0 から 100 までの値のリスト、dic[Element][Concentrate] は各要素とそのすべての濃縮物からの値を格納します。
上記のコードでは、ループごとに目的関数が上書きされます。古い目的関数を上書きする代わりに、append() などのようなものが必要で、それぞれの loops=lpSums を prob variable?class? に追加します。
私は一般的にプログラミングにかなり慣れていません。私の問題は、私の(:Dも不足している)PuLPスキルよりも、Pythonプログラミングスキルの欠如に関連していると思います。しかし、PuLP のドキュメントには何も見つかりませんでした。少なくとも、接続できるものは何もありませんでした。
編集:問題を紹介するための小さなテーブルが含まれています:
+------------------------------+-------------------------------------------+----+------------------------------+---------------+----------------------+---------------+---------------+-------------------------------+
| Utilization [%] | Sumproduct[Quantity] = [LHS] | | Constrains[Quantity] = [RHS] | Concentrate | Element 1 [%] | Element 2 [%] | Element 3 [%] | Decision Variables [Quantity] |
+------------------------------+-------------------------------------------+----+------------------------------+---------------+----------------------+---------------+---------------+-------------------------------+
| u1 = z1 / MaxAmount Element1 | z1 = Col Element1 * Col Decison Variables | <= | MaxAmount Element1 | Concentrate 1 | % Element 1 in Con 1 | | | X1 |
| u2 = z2 / MaxAmount Element2 | z2 = Col Element2 * Col Decison Variables | <= | MaxAmount Elemen2 | Concentrate 2 | % Element 1 in Con 2 | | | X2 |
| u3 = z3 / MaxAmount Element3 | z3 = Col Element3 * Col Decison Variables | <= | MaxAmount Elemen3 | Concentrate 3 | % Element 1 in Con 3 | | | X3 |
+------------------------------+-------------------------------------------+----+------------------------------+---------------+----------------------+---------------+---------------+-------------------------------+
「要素 2」および「要素 3」の列には、「要素 1」の列と同じ情報、つまり濃縮物 1/2/3 におけるそれぞれの要素の % シェアが保存されます。
目的関数は、すべての使用率 (u1+u2+u3) の合計を最大化することです。そのため、各要素に与えられた制約をできるだけ多く利用するために、各濃縮物の使用量を決定しようとしています. 私の PuLp コードに戻ると、「u1」に相当するものを PuLp の「LpProblem クラス」に追加できると思いますが、これらの LpSum の複数を「LpProblem クラス」に追加する方法がわかりません。ループ。