前回の記事では、さまざまな整数および組み合わせプログラミング モデルをリストしました。離散制約を持つ線形プログラム、整数変数を持つ線形プログラム、および連続変数と整数変数を組み合わせた非線形プログラムもあります。これらのモデルの解法も非常に豊富ですが、今回はその中から最適な解法をご紹介します。
ポータル:離散最適化モデル
1
完全な列挙メソッド
モデルに離散変数が少数しかない場合、最も効率的な解決策は多くの場合、最も簡単な方法です。つまり、すべての可能性を列挙することです。これは全列挙法 (total enumeration)と呼ばれ、離散変数値のすべての組み合わせを試し、それぞれの場合に最適な連続変数の値を計算して離散最適化問題を解決します。
たとえば、スイス スチールの「オール オアナッシング」の場合は次のようになります。
この場合、離散決定変数は 2 つだけであり、線形計画モデルを前後 4 回実行するだけで済みます。指数関数的に増加する離散変数の場合、このアプローチは明らかに考慮すべきアプローチではなくなります。
2
リラックスモデル
緩和は、離散最適化モデルの関連するより単純なモデリングを見つけることによって、元の問題を解決します。特定の離散モデルにおいて、緩和モデルは制約、目的関数、またはその両方を弱めます。
ケース:バイソンブースター
バッファロー・ブースターズ・クラブは、次の地域フェアで地元のスポーツチームのために資金を集める方法を決定している彼らを支援しており、選択肢の 1 つは、1 枚あたり 20 ドルのカスタム T シャツと 1 枚あたり 30 ドルのスウェットシャツです。過去のデータによると、展示品はショー終了前に売り切れます。
シャツの製造に使用される材料は地元の実業家から寄付されたものですが、ヘルパーは特注の装備をレンタルする必要があります。T シャツを作るのに使用する機材のレンタルは、ショー中に 550 ドル、スウェットシャツを作るのに 720 ドルかかります。展示スペースも考慮すべき点です。ショーでは、ブースターズには展示スペースとして 300 平方フィートの壁しかありませんでした。各 T シャツの面積は 1.5 平方フィート、スウェットシャツの面積は 4 平方フィートです。それでは、どの計画が最大の純利益を生み出すのでしょうか?
上記のシナリオに従って、離散最適化モデルに変換されます。
完全列挙法を使用すると、次のように最適なソリューションを簡単に取得できます。
次に、制約を緩和して最適解の変化を確認します。次の 3 つの状況がリストされています。
緩和モデルは、元のモデルよりも扱いやすいという原則に従う必要があり、これにより、より詳細な分析が可能になります。これによると、機種特性は変わっていないため、容量を2倍にしただけでは十分ではありません。2 番目のスラックは、2 つのシャツ生産決定のリンクを解除するため、もう少し効率的です。
3 番目のケースは、すべての制約の緩和の中で最も有名で一般的に使用される 1 つである線形計画緩和 (線形計画緩和)を説明しており、連続緩和 (連続緩和)とも呼ばれます。
連続緩和は制約の緩和です。他の制約はすべて保持されますが、離散変数は連続変数として扱われます。
すべての緩和が制約の緩和であるわけではなく、場合によっては目的関数も弱まることがあります。完全な緩和モデルを定義します。
最適化問題 (R) と最適化問題 (P) について、(i) P のすべての実行可能な解が R でも実行可能であり、(ii) R の P の各実行可能な解の目標値が P の目標値と異なる場合、の目標が最適化問題 R と等しいかそれより優れている場合、最適化問題 R は最適化問題 P の緩和です。
数学的表記で表すと次のようになります。
さらに、緩和が実行不可能であれば、その元のモデルも実行不可能であると結論付けます。
次のベン図は、元の問題と緩和された問題の間の実行可能な解の関係を示しています。
緩和モデルは、元の問題に対する最適解の境界を提供することに注意してください (最大の問題は上限であり、最小の問題は下限です)。たとえば、EMS モデルで、すべての離散変数を連続変数に変更して緩和モデルを取得する場合、シンプレックス法を使用して最適解を簡単に取得できます。
その最適値は 6 です。言い換えると、元の問題では、需要を満たすために少なくとも 6 つの EMS 物流ステーションが必要です。
どのような状況下で緩和モデルが元の問題に最適な解決策を与えることができるかを調査し、結論を出したいと思います。
制約緩和モデルの最適解が元のモデルでも実現可能な場合、この解は元のモデルの最適解になります。
この結論に達するのは難しいことではありません。以前に機械学習の双対問題を説明したときに推論しましたが、ロジックは一貫しているため、ここでは繰り返しません。
ただし、EMS のケースから、緩和された最適解は元のモデルの実行可能な解ではない可能性があり、実際のモデルのいくつかの制約に違反することがわかります。ただし、何も得られないわけではありません。緩和モデルから元のモデルの境界が得られるため、元のモデルのヒューリスティックなソリューションを構築するための開始点が得られます。
たとえば、EMS の緩和モデルの最適解では、元のモデルのヒューリスティックな解を得るには、離散値を満たさない変数を丸めるだけで済みます (切り上げまたは切り捨ては制約に応じて異なります)。) を満たすことが可能ですが、EMS では制約はすべて符号以上であるため、切り上げても制約が満たされるため、ヒューリスティックな解が得られます。
ヒューリスティック最適解は必ずしも最適解である必要はありませんが、制約を満たさなければなりません。精度の低いシナリオでは、ヒューリスティックな最適解を使用することが効率的な方法である場合があります。
3
分岐限定検索
完全な列挙法はほとんどのモデルでは実現可能ではありませんが、これらのソリューションを部分セットまたは列挙戦略サブセットに分割して処理し、緩和モデルと組み合わせることで、分岐限定アルゴリズム (分岐限定アルゴリズム) を取得できます。
このアルゴリズムは、最適解が得られたことを確認するまで一連の解を繰り返し検索するか、停止して、これまでに得られた完全なモデルの最適な解を最適解として近似します。
リバーエナジー株式会社の事例を使って詳しく説明します。
River Energy は現在 4 台の発電機を生産しており、今後数時間で予想される 700 MW のピーク需要を満たすためにどの発電機を稼働させるかを決定したいと考えています。以下の表は、各発電機の稼働コスト (1 時間あたり数千ドル) とその出力容量 (メガワット) を示しています。
これをナップザック問題として考えます。
列挙法により、モデルの最適解は x1=x3=1、x2=x4=0 であり、最小コストは 12,000 ドルであることがわかります。
分枝限定法は、部分解を介して検索します。いわゆる部分解は、いくつかの不変の決定変数と、その他の自由または不確実な決定変数 (# で示されます) を修正することです。各部分解は、完全な解のクラス、つまりこれらの解を暗黙的に定義します。部分解の完全形(完全形)と呼ばれます。
たとえば、Energy River の場合、x=(1,#,0,#) は部分解を表し、x2 と x4 は自由変数です。この部分分解の完全な形式は次のとおりです。
(1,0,0,0),(1,0,0,1),(1,1,0,0),(1,1,0,1)
後の 3 つは、モデルのすべての制約が満たされるため、実現可能な完了と呼ばれます。
さらに、部分解の固定変数に対応する制限付きモデル(つまり、自由変数で構成されるモデル)を候補問題と呼び、候補問題の緩和問題を使用して候補問題のヒューリスティック解を求めます。 。
したがって、線形計画法 (0-1 整数計画法) に基づいた分岐限定法が得られます。
Energy River の事例を通じてこのアルゴリズムを理解します。アルゴリズムを実行するブランチ ツリーは次のとおりです。
t=0、すべての変数を自由変数とします。つまり、部分分解とターゲット値は次のとおりです。
候補問題は元の問題であり、対応する緩和モデルは次のとおりです。
内点法を使用して最適値を見つけると、次のようになります。
ステップ 5 に進み、最適解がすべてのバイナリ制約 (コンポーネント x4 はスコア) を満たさない場合は、ステップ 6 に進んで分岐します。
まずコンポーネント x4=0 と x=1 を修正して、2 つのアクティブな解を取得します。
ステップ 1 に戻り、まず最初の候補問題と候補問題の緩和モデルを確認します。
緩和モデルの最適解:
モデルのすべての 2 項制約を満たすと、解は部分解の最適な実現可能な完全な形式となり、最良の解を更新します。
この時点で、ソリューションは終了し、ラベルが適用されます。ステップ 1 に戻り、2 番目のアクティブな解決策を確認し、対応する候補問題と緩和モデルを作成します。
最適な解決策は次のとおりです。
再度分岐して 2 つのアクティブな解を生成します (この時点では t=3)。
ステップ 1 に戻ると、最初のアクティブな解に対応する候補問題と緩和モデルは次のとおりです。
最適な解決策は次のとおりです。
再度分岐します (上にアクティブなソリューションがあることに注意してください。後で見逃さないようにしてください)。新しいアクティブなソリューションは次のとおりです。
この時点 t=4 で、ステップ 1 に戻ります。自由変数は 1 つだけ残っています。最初のアクティブな解は簡単に得られます。最適解は 17 で、最適解14より大きく、ステップ 4 の境界で終了します。 。同じ 2 番目のアクティブなソリューションの最適なソリューションは 14.3 で、これもステップ 4 で区切られて終了します。
この時点 t=6 で、アクティブな解 (#,0,#,0) に戻り、最適な解 9.67 を取得し、分岐を続けてアクティブな解を取得します。
2 番目のアクティブなソリューションは制約を満たしていないため、実行不可能です。最初のアクティブなソリューションを見てください。最適なソリューションは 11 です。分岐を続けます。この時点でのアクティブなソリューションは次のとおりです。
最適値は 12 で、アクティブな解決策はもうありません。反復が停止し、最適解 (1,0,1,0) が得られます。
これが線形計画法に基づく分岐限定法のロジックです。しかし、プロセスは改善できる可能性があります。原則は次のとおりです。
分枝限定探索で終了できない各部分解の緩和された最適解は、通常、分岐前に丸められて、完全なモデルの実行可能な解が形成されます。この実現可能なソリューションが他の既知のソリューションよりも優れている場合は、新しい最適なソリューションが提供されます。
前回の記事でNASA の資本予算のケースを使用して説明し、分枝限定法を使用してケースを解決します (深度前方最適バックトラッキング)。次の結果が得られます。
NASA の場合、切り捨てられる (実行可能領域を保証する)必要があります。つまり、緩和された最適解の小数部分は 0 になります。たとえば、ノード 5 では、候補問題の緩和された最適解は次のようになります。 787 によると、アルゴリズム ロジックは次の分岐に進む必要がありますが、最初に丸めを行って最適解よりも大きい丸められた解 725 を取得し、最適解を 725 に更新します。
したがって、ステップ 5 とステップ 6 の間に 1 つのステップを挿入するだけで済みます。
3
その他の終了条件
上記は、分岐限定検索アルゴリズムの全体的な一般的なロジックを示していますが、さらに議論する必要がある終了の問題がまだいくつかあります。説明のために、いくつかの用語を導入する必要があります。
他のノードから直接分岐したノードを子ノード(child)と呼び、分岐したノードが親ノード(parent)となります。
分岐原理によれば、親バウド原理があります。最小 (大きい) 値を求めるモデルの場合、部分解に対応する親ノードの緩和の最適値は、子ノードの下限 (上限) の目標値です。 .)境界
これから、親ノード境界終了の方法を取得できます。分岐限定検索で新しい最適解が見つかったとき、終了していない部分解に対して、その親ノード境界が新しい最適解よりも高くない場合は、新しい最適解の方が優れています。の場合、この部分的な解決策は直ちに終了できます。
NASA のケースの分岐プロセスを使用して、次のことを導入します。
t=19終了後、ノード12の子ノードまで探索が始まりますが、すでにノード15で最適解765が決定されており、ノード12の緩和最適解は757であるため、すぐに終了できます。
次の表に、子ノードに対応する最適な親ノードの制限と現在の最適なソリューションを示します。
最適解を得るのは簡単です. ここで, 最適な親ノード制限の計算ロジックに注意する必要があります:これは現在のノード時間におけるアクティブな子ノードの緩和解の制限です. アクティブなノードとは現在のノード時間で分岐がまだ完了していないノード。
たとえば、ノード 6 の場合、最適な親ノードの制限を計算するには、まず樹状図内のすべてのアクティブな子ノード (1、3、4、5、6) を見つけます。これらのノードの緩和解の境界は次のとおりです (最大値モデルは上限):
反復最適解と最適な親ノード境界に従って、早期停止のヒューリスティックを取得できます。
分枝限定検索のどの段階でも、アクティブな部分解の最適解値と最適な親ノード境界との差は、最適解を近似最適解として受け入れる最大誤差を表します。
たとえば、NASA の場合、t=6 で得られた最良の解は 755 です。この時点で、最適な親ノードの制限は 798.75 (これが最良の最良の解である可能性があります) であり、その誤差を計算します。
t=16 では、この誤差はすでにかなり小さくなっています。場合によっては、計算効率を向上させるために、通常は少数回反復するだけで許容可能な近似解が得られます。これは早期に停止するために必要な前提条件です。
以上、区切り検索に関わるアルゴリズムの詳細(丸め等を含む)と終了条件(実行不可能終了、区切り終了、解決終了、親ノード境界終了、早期停止)を基本的に紹介しました。しかし、ここで議論すべき重要な問題がまだ残っています。それは、アルゴリズムの最初のステップでの反復探索のために (複数のアクティブなソリューションを前提として) アクティブなソリューションを選択する方法です。
4
深さ優先、最適優先、深さ順の最適なバックトラッキング
River Energy の場合は、深さ優先の原則を使用します。各サイクルで、最も部分的な固定を備えたアクティブな部分ソリューションを選択します。
NASA のケースでは、深さ順方向最良の逆方向の原則が使用されます。ノードの分岐後には最も深いアクティブ パーツ ソリューションを選択しますが、ノードの終了後は最適な親ノード制限を持つアクティブ パーツ ソリューションを選択します。
さらに、最良の第一原理の使用もあります。つまり、サイクルの各段階で、最良の親ノード境界を持つアクティブな部分のソリューションを選択します。
これらの原則を採用して反復する場合、まだ一意ではない部分的な解決策に直面して、次の統一原則、つまり最近接子の原則に従います。
最も深いまたは最適な親ノード境界を持つ部分解が一意でない場合は、最後の固定変数値を持ち、親ノードの線形計画緩和の対応するコンポーネントの値に最も近い子ノードの部分解を選択します。
次に、Python を使用して 3 つの優先原則の分岐限定法を実装し、NASA の場合の結果を比較します。
深さ順の最適なバックトラッキングの結果を示します。
上記のテーブルの各行には、親ノード、現在の固定変数、緩和された解と状態を含む各ノードの情報が記録されます。最適解はノード 17 で得られます。
分岐限定探索アルゴリズムの場合、分岐前に有効不等式を見つけて緩和モデルを解くこともできます。これは分岐およびカット法に拡張されます。ここでは紹介しません。後で機会があれば追加します。
コード開発の付録:
ここでの開発の一般的な考え方は、テーブルを使用して各ノードの情報を記録することです。ノード、親ノード、ノードの固定変数、スラック解、スラック値、丸め解、最適解などが含まれ、フィールド「ステータス」を使用してノードが分岐しているか終了しているかなどの情報を動的に更新します。分岐の数を記録します (最大 2)。各ループは関数を使用して内部の情報を更新します。
次に、3 つの分岐原則の関数を記述し、パラメータ優先度を使用してそれらを受け取り、3 つの異なる原則の関数をそれぞれ指定します。元の問題は一般に不等式制約であるため、これまでに開発したアルゴリズム (シンプレックスなど) はすべて標準線形計画法に基づいています。したがって、初期化メソッドは標準線形計画法の係数に渡され、元の問題の緩和モデル行列、右係数ベクトルとターゲット係数ベクトル、そして渡せるパラメータ prime_n を使用して元の問題の変数の数を宣言します。計算プロセスでは元の問題パラメータのみを確認する必要があるだけです。
深さ優先バックトラッキングには最適な優先順位があるため、パラメーターの状態を使用して最適な優先順位を実装するかどうかを制御します。
次に、いくつかの詳細、最も近い子ノードの原理と、2 つの関数で記述された最適な親ノード境界終端の原理に注目してください。
最後に、ループする main 関数を作成します。内部の細部にも注目してください。
また、各線形計画法の解を実行する機能もあり、以前に開発した単体法を利用し、毎回初期基底を確認する手動手法を追加し、単体法の第1段階と第2段階を自動で実行します。ここでは内点法も使用できますが、このアルゴリズムでは初期基底の各成分が 0 より大きい必要があります。より大きい解と一致するように線形方程式系の一般解を解く効率的なプログラムが必要になる場合があります。 0よりも。シンプレックス法の手動フェーズは線形独立グループを見つけることであるため、コードでの実装は簡単です。したがって、シンプレックス方式が選択されました。