LPの問題を形式化するとき、多くの場合、マルチインデックス変数を処理する必要があります。大きな寸法の問題を扱う場合、これは率直に言って一般的なことです。
目的関数(線形形式も線形最適化基準)および制約(線形等式および不等式の形式)におけるこのようなマルチインデックス変数の相互関係は、プログラムで生成する必要があります。PuLP(Python用のLPライブラリポート)を使用する場合、このような生成には2つの主要なアプローチが使用されます。
- Pythonリストジェネレーターを使用してマトリックスA(制約マトリックス)を明示的に生成します。:たとえば、このような数独問題
- 暗黙的な形式の辞書を介してインデックスにバインドされたシンボリック変数の生成。これは、dictまたはPuLPプラグインを使用して手動で行うことができます
ほぼすべての次元の古典的なLP問題は、これらの方法のいずれかで簡単に形式化できますが、制約の新しい構造を開発する場合(特に、変数の相互関係のロジックがより複雑になる場合、変数の意味が新しくなる場合、一部のインデックスが破棄されるか、新しいインデックスが導入されます)変数のグループの集約/分解など)では、Pythonコード自体でマルチインデックス変数を簡単に追跡する必要がありますが、これは上記のアプローチには直接ありません。
この問題を解決するには、PuLP-MiAアドオン(機能の簡単な説明が記載されたリポジトリへのリンク)を使用することをお 勧めします。
著者は、これが複雑な制限構造を持つLP問題の形式化と解決で発生するすべての問題の解決策であるとは考えていませんが、長年の実践(特に変更が長い時間間隔で発生する場合)では、主に次の便利さのために、このアプローチは十分に証明されています。
- 既存の変数の作成/バインドは自動的に行われます
- 変数名とそのインデックスの明示的な関連付け
- 変数名-任意の文字列
- インデックス-数値
- インデックスの数は条件付きで無制限です(インデックスがまったくない場合があります)
- LP問題を解決した結果は、辞書の形式で表示されます。ここで、キーはゼロ以外のマルチインデックス変数です(動作は変更できます)。
おそらく、このアドオンは、運用の長期的な研究において誰かにとって非常に役立つでしょう。MITライセンス。従来、pipを介してインストールされていました 。
PS読み終えた人にとっては、まだ小さいでしょう
一連の制限を形成する例))
from itertools import product
from pulp_mia import Task, Constraint
i_set = list(range(5))
j_set = list(range(5))
m_set = list(range(2))
g_set = list(range(4))
s_set = list(range(5))
k_set = list(range(5))
task = Task(debug=True)
for i, m, g, s, k in product(i_set, m_set, g_set, s_set, k_set):
a_new = Constraint('<=')
for j in j_set:
a_new.setCoeff(('x', i, j, m, g, s, k), 1)
a_new.setBValue(1)
task.addConstraint(a_new)
print(task)
#TASK info:
# NAME: test-task
# SIZE: 5000 x 1000
(残りについては、アドオンの簡単な説明を参照してください )
PPSはい、内部のどこかに通常の辞書があります。