Calculer l'écart d'optimalité relative dans le problème MIP GAMS
Je veux calculer l'écart d'optimalité relative d'un problème MIP et je veux également interrompre les exécutions à un certain moment d'exécution. cette méthode:
F(1)
abs(mymodel.objest - mymodel.objval)/max(abs(mymodel.objest),abs(mymodel.objval))
n'est pas cohérent avec l'écart que le GAMS calcule en log. GAMS utilise "Meilleur entier" pour trouver l'écart et non la valeur objective actuelle. laquelle est correcte? et comment puis-je enregistrer le "meilleur entier" actuel dans un paramètre (comme .objval).
et enfin calculer l'écart d'optimalité relative dans un algorithme de cintreuses, c'est bien ainsi ?
rgap = (upperBound - lowerBound)/(1 + abs(upperBound));
Ce que GAMS calcule à l'aide de la "solution 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) a calculé l'écart en utilisant mymodel.objval (mymodel.objval return "Final Solve") donc l'écart calculé est %13 et la valeur mymodel.objval est 5.633016E+7 (l'écart calculé GAMS est %98). j'ai donc besoin d'enregistrer "MIP Solution" dans un paramètre pour l'exporter dans un fichier Excel.
Réponses
Il existe différentes formules pour calculer l'écart d'optimalité relatif. Cela dépend du solveur que vous utilisez, lequel est appliqué. Vous trouverez des informations à ce sujet dans la description de l'option GAMS optCR . Le manuel du solveur que vous utilisez pourrait avoir plus de détails sur la formule réellement appliquée.
EDIT après la mise à jour de la question :
Comme vous l'avez écrit mymodel.objval
renvoie la Final Solve
valeur. Si vous souhaitez voir la MIP Solution
valeur à la place (comme le fait le lien Cplex en interne), vous pouvez désactiver la résolution finale. Cependant, si Final Solve
et MIP Solution
sont tellement différents que dans votre exemple, cela indique souvent un problème (généralement, ils sont (presque) identiques). Souvent, cela indique un modèle mal mis à l'échelle. Peut-être pourriez-vous améliorer la situation en resserrant les tolérances Cplex (voir options Cplex epopt
, eprhs
, epint
) et en activant une mise à l'échelle agressive (option Cplex scaind 2
). Activation mipkappastats
(https://www.gams.com/latest/docs/S_CPLEX.html#CPLEXmipkappastats) et quality
(https://www.gams.com/latest/docs/S_CPLEX.html#CPLEXquality) pourrait vous donner plus d'informations. DataCheck=2
(https://www.gams.com/latest/docs/S_CPLEX.html#CPLEXdatacheck) peut présenter des problèmes.