Calcule la brecha de optimización relativa en el problema MIP GAMS
Quiero calcular la brecha de optimización relativa de un problema MIP y también quiero cancelar las ejecuciones en un tiempo de ejecución determinado. este método:
F(1)
abs(mymodel.objest - mymodel.objval)/max(abs(mymodel.objest),abs(mymodel.objval))
no es consistente con la brecha que GAMS calcula en log. GAMS utiliza el "Mejor entero" para encontrar la brecha y no el valor objetivo actual. ¿Cuál es el correcto? y ¿Cómo puedo guardar el "Mejor entero" actual en un parámetro (como .objval).
y, finalmente, calcular la brecha de optimización relativa en un algoritmo de dobladores es correcto de esta manera?
rgap = (upperBound - lowerBound)/(1 + abs(upperBound));
Qué calcula GAMS usando "Solución 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) brecha calculada usando mymodel.objval (mymodel.objval devuelve "Final Solve"), por lo que la brecha calculada es %13 y el valor de mymodel.objval es 5.633016E+7 (la brecha calculada de GAMS es %98). así que necesito guardar "Solución MIP" en un parámetro para exportarlo a un archivo de Excel.
Respuestas
Existen diferentes fórmulas para calcular la brecha de optimalidad relativa. Depende del solucionador que use, cuál se aplica. Puede encontrar información sobre esto en la descripción de la opción optCR de GAMS . El manual del solucionador del solucionador que usa podría tener más detalles sobre la fórmula realmente aplicada.
EDITAR después de que se actualizó la pregunta:
Como escribiste mymodel.objval
devuelve el Final Solve
valor. Si desea ver el MIP Solution
valor en su lugar (como lo hace internamente el enlace Cplex), puede desactivar la resolución final. Sin embargo, si Final Solve
y MIP Solution
son tan diferentes como en su ejemplo, a menudo es una indicación de algún problema (por lo general, son (casi) idénticos). A menudo, esto indica un modelo a escala deficiente. Tal vez podría mejorar la situación ajustando las tolerancias de Cplex (consulte las opciones de Cplex epopt
, eprhs
, epint
) y activando el escalado agresivo (opción de Cplex scaind 2
). Activando mipkappastats
(https://www.gams.com/latest/docs/S_CPLEX.html#CPLEXmipkappastats) y quality
(https://www.gams.com/latest/docs/S_CPLEX.html#CPLEXquality) podría darle más información. DataCheck=2
(https://www.gams.com/latest/docs/S_CPLEX.html#CPLEXdatacheck) podría mostrar algunos problemas.