MIP問題GAMSで相対的な最適性のギャップを計算する
MIP問題の相対的な最適性のギャップを計算したい。また、特定の実行時に実行を中止したい。この方法:
F(1)
abs(mymodel.objest - mymodel.objval)/max(abs(mymodel.objest),abs(mymodel.objval))
GAMSがログで計算するギャップと一致していません。GAMSは「ベスト整数」を使用して、現在の目標値ではなくギャップを見つけます。どちらが正しいですか?現在の「最良の整数」をパラメータ(.objvalなど)に保存するにはどうすればよいですか。
そして最後に、ベンダーアルゴリズムで相対的な最適性のギャップを計算するのはこの方法で正しいですか?
rgap = (upperBound - lowerBound)/(1 + abs(upperBound));
GAMSが「MIPソリューション」を使用して計算するもの
MIP Solution: 3334501534.000555 (1625 iterations, 0 nodes)
Final Solve: 56330158.829040 (2561 iterations)
Best possible: 48915652.476336
Absolute gap: 3285585881.524219
Relative gap: 0.985330
F(1)はmymodel.objval(mymodel.objval return "Final Solve")を使用してギャップを計算したため、計算されたギャップは%13、mymodel.objval値は5.633016E + 7(GAMSで計算されたギャップは%98)です。そのため、「MIP Solution」をパラメータに保存して、Excelファイルにエクスポートする必要があります。
回答
相対的な最適性のギャップを計算するためのさまざまな式があります。どちらを適用するかは、使用するソルバーによって異なります。これに関するいくつかの情報は、GAMSオプションoptCRの説明にあります。使用するソルバーのソルバーマニュアルには、実際に適用される式の詳細が記載されている場合があります。
質問が更新された後の編集:
あなたが書いmymodel.objval
たようにFinal Solve
値を返します。MIP Solution
代わりに(Cplexリンクが内部で行うように)値を表示したい場合は、最終的な解決を非アクティブ化できます。ただし、Final Solve
とMIP Solution
が例のように大きく異なる場合、これは多くの場合、何らかの問題の兆候です(通常、それらは(ほぼ)同一です)。多くの場合、これはモデルのスケーリングが不十分であることを示しています。たぶん、あなたはCPLEX公差を締めて、状況を改善することができます(CPLEXオプションepopt
、eprhs
、epint
)と積極的なスケーリングを活性化(CPLEXオプションscaind 2
)。アクティベートmipkappastats
(https://www.gams.com/latest/docs/S_CPLEX.html#CPLEXmipkappastats)とquality
(https://www.gams.com/latest/docs/S_CPLEX.html#CPLEXquality)より多くの情報を提供できます。DataCheck=2
((https://www.gams.com/latest/docs/S_CPLEX.html#CPLEXdatacheck)いくつかの問題が発生する可能性があります。