Я имею дело с небольшими проблемами MILP, для которых я установил максимальное количество итераций. Я хотел бы определить случаи, для которых мы уверены, что достигли оптимума.
При вызове m.solve(disp=True)
, если решатель останавливается рано, он отображает предупреждение:
Предупреждение: достигнуто максимальное количество итераций MINLP, возвращая лучшее решение
Я хотел бы проверить программно , находимся ли мы в такой ситуации. Я попытался
1) просмотреть документацию, но там указано, что m.options.SOLVESTATUS
всегда равно 1, а m.options.APPINFO
всегда равно 0 с момента, когда решатель нашел возможное решение.
2)
optimum = m.options.ITERATIONS < m.options.MAX_ITER
но это не работает, потому что на самом деле m.options.ITERATIONS
не делает то, что я думал (это всегда намного ниже, чем m.options.MAX_ITER
).
3 ) поднять и затем поймать предупреждение:
import warnings
warnings.filterwarnings("error")
try:
self.model.solve()
optimum = True
except:
optimum = False
Но это тоже не работает (ошибка не возникает).
Итак, у меня есть 2 вопроса:
1) Как проверить количество итераций, использованных решателем?
2) Как определить, проверял ли решатель каждого кандидата и, таким образом, нашел лучший экземпляр?