線形計画問題の実行可能な解決策を生成する1つのアルゴリズムがあります。ただし、これはコーナーポイントではない可能性が非常に高いです。このため、制限付きシンプレックスソルバーの最初の実行可能なソリューションとして直接使用することはできません。このソリューションから使用可能なコーナーポイントを効率的に見つけるにはどうすればよいですか?
簡単に言うと、実現可能な内部ポイントからシンプレックス法を開始するにはどうすればよいですか?
線形計画問題の実行可能な解決策を生成する1つのアルゴリズムがあります。ただし、これはコーナーポイントではない可能性が非常に高いです。このため、制限付きシンプレックスソルバーの最初の実行可能なソリューションとして直接使用することはできません。このソリューションから使用可能なコーナーポイントを効率的に見つけるにはどうすればよいですか?
簡単に言うと、実現可能な内部ポイントからシンプレックス法を開始するにはどうすればよいですか?
回答:
線形最適化に関するすべての本では、シンプレックス法を2段階のアルゴリズムとして説明しています。1つ目は、実行可能なコーナーを開始点として見つけるためのもので、2つ目は最適を見つけるためのものです。最初は二重問題を使用します。見てみましょう「線形最適化の概要」:D. BertsimasとJN Tsitsiklis、たとえば。
そして、彼らの交差点を取る。直感的には、この頂点は実行可能であるはずですが、これについてもう少し考える必要があることは認めます。
残念ながら、Wolfgang Bangerthのソリューションが動作することは保証されていません。
シンプレックス法のフェーズIには、実際にはさまざまなアプローチがあります。特に、主シンプレックスシンプレックス反復を使用するフェーズIアルゴリズムと、デュアルシンプレックス反復を使用する他のフェーズIアルゴリズムがあります。これは、既知の実現可能なソリューションを利用するために簡単に適応できる非常に一般的なアプローチです。このバージョンは、フェーズIでデュアルシンプレックス法を使用し、フェーズIIでプライマリシンプレックス法を使用しますが、フェーズIでプライマリシンプレックス反復を使用し、フェーズIIでデュアルシンプレックス反復を使用するバリアントがあります。ここで説明するアプローチは、線形計画法に関する多くの教科書で説明されています。たとえば、Robert Vanderbeiのテキストを参照してください。
私たちが解決していると仮定します
従う
ここで、サイズ ×です。簡単にするために、の行が線形独立であると仮定します(これは、ランクを明らかにする因数分解によって実現できます)。
最初の解からこれを行う簡単な方法は、既知の実行可能な解の境界から最も離れている変数を基本変数として選択し、が非特異であることを確認することです。非特異にするには、基底を変更する必要がある場合があります。ここでのポイントは、多くの可能なベースがあるということですが、これは基本的な変数として、実行可能なソリューションから正しいと思われる変数を持っています。
方程式を解いて、基本変数の値を取得します。
目的関数を双対実行可能関数に変更することで、この問題を克服します。下限の各非基本変数について、目的関数係数から大きな正の量減算します。上限の非基本変数ごとに、大きな正の量を係数に追加します。これにより、辞書が二重に実行可能になります。
目的関数のこの変更のポイントは、主要な実現可能性に向けて取り組むことですが、元の目的関数に関して最適性に向かって移動することです。あなたは欲しいあなたが二重の実現可能性を持っていることを十分な大きさであることを、しかし、あなたはあなたができるように、元の目的関数から多くの影響として保存しておきたいです。
双対シンプレックス法を実行して、主実行可能(ブール内のすべての基本変数)と双対実行可能(すべての削減コストに望ましい兆候があります)の両方である基本解を取得します。このソリューションは、フェーズIの問題に最適です。
変更されたフェーズI目的関数を元の目的関数で置き換えます。これで、基本的には実現可能ですが(目的関数を変更しても影響はありません)、双対実行不可能である基本的なソリューションが得られます。最適に戻すために、主シンプレックス反復を実行します。
このアプローチの明らかな代替策は、フェーズIの開始時に右側のbを変更し、フェーズIで主シンプレックス反復を使用して最適性を得てから、フェーズIIの元の右側を元に戻し、デュアルシンプレックス反復を使用することです。フェーズII。
私は同様の質問の解決策を探していました:非常に大規模なスパース線形プログラムでは、テストされたシンプレックス法のみが機能しますが、デフォルトの0解決策が実行可能である場合のみです。(Matlabのlinprogのような)フェーズ1アルゴリズムは悪いようです。そして、フェーズ1のソースコードは非常に複雑なので、遺伝的アルゴリズムなどの他のアルゴリズムで置き換えることができるため、回避策は、元の問題の線形変換を行うことです。そのため、新しい変数では、提供される最初の実行可能な解は0です。これは0は、独自の方法を使用せずにフェーズ1で使用され、別の開始点を見つけます。
このメソッドをテストする際、linprog.m、simplex.m、simplexpresolve.m、simplexphaseone.mをステップ実行することにより、不等式制約のみが使用される場合、元の変数にデフォルトの0が使用されることが確認されます。スラック変数は違いをとります。したがって、線形変換によってx0がシンプレックスにこっそり入り、ユーザーが指定したx0が意図的に阻止されます。次に、「デフォルトの開始点は実行可能であり、フェーズ1をスキップします」というメッセージが表示されます。一方、GAは通常、2倍または3倍の時間を使用することにより、線形プログラムに近いソリューションを0.01%に見つけることができるため、特に制約が人工的に作成された場合、これらの制約、目的、および境界の線形変換の努力に値しない場合があります。 。