MIP問題GAMSで相対的な最適性のギャップを計算する

Aug 16 2020

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ファイルにエクスポートする必要があります。

回答

1 Lutz Aug 17 2020 at 14:16

相対的な最適性のギャップを計算するためのさまざまな式があります。どちらを適用するかは、使用するソルバーによって異なります。これに関するいくつかの情報は、GAMSオプションoptCRの説明にあります。使用するソルバーのソルバーマニュアルには、実際に適用される式の詳細が記載されている場合があります。

質問が更新された後の編集:

あなたが書いmymodel.objvalたようにFinal Solve値を返します。MIP Solution代わりに(Cplexリンクが内部で行うように)値を表示したい場合は、最終的な解決を非アクティブ化できます。ただし、Final SolveMIP Solutionが例のように大きく異なる場合、これは多くの場合、何らかの問題の兆候です(通常、それらは(ほぼ)同一です)。多くの場合、これはモデルのスケーリングが不十分であることを示しています。たぶん、あなたはCPLEX公差を締めて、状況を改善することができます(CPLEXオプションepopteprhsepint)と積極的なスケーリングを活性化(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)いくつかの問題が発生する可能性があります。