Джулия прервать решатель модели и возобновить его

У меня проблема с оптимизацией на Atom, используя Julia.

Я использую решатель Gurobi:

m=Model(solver=GurobiSolver())
...
solve(m)

Для достижения оптимального значения моей модели может потребоваться от нескольких часов до нескольких дней вычислений, поэтому я хотел бы знать, могу ли я сделать следующее во время выполнения функции detect ():

1. Interrupt upon interrupting/stopping Julia
2. Interrupt if the objective function returns a sufficiently good result
3. Interrupt after a set time

а затем отобразить и сохранить текущее достигнутое состояние, чтобы я мог возобновить вычисления позже.


person user3548298    schedule 02.12.2017    source источник
comment
Я не думаю, что ты сможешь. Вам нужно будет сохранить все дерево. Раньше в Cplex было что-то называлось endtree / starttree, но от этой опции отказались. В unix вы можете сохранить процесс и перезапустить его, используя что-то вроде CRIU.   -  person Erwin Kalvelagen    schedule 03.12.2017


Ответы (2)


Заявление об ограничении ответственности:

Это очень широко и упускает много деталей, почему упоминаются вещи, которые не имеют значения (Атом в качестве редактора).

Также: считайте это обоснованным предположением.

Сможет сделать

  • показать что-нибудь и подождать в терминале
  • продолжить после ввода пользователем

Это должно быть легко достижимо путем определения обратного вызова, который проходит через ваши условия и действует в соответствии с ними (например, ожидая несколько секунд или ввода пользователя).

Остается выбрать одно: коды обратного вызова Гуроби типов < strong> where, который решит, когда будет вызван ваш обратный вызов.

Для прохождения ваших условий вы захотите использовать значения для what (см. Выше).

Жизнеспособные кандидаты:

POLLING 0   Periodic polling callback
MIPSOL  4   Found a new MIP incumbent

Теперь опрос не позволит вам запрашивать какие значения. Это делает его бесполезным для вашей задачи, и мы не будем его рассматривать. Единственное преимущество состоит в том, что он, вероятно, очень часто вызывается без потенциально огромной разницы во времени между вызовами.

MIPSOL позволит вам получить доступ к интересным переменным, таким как MIP_OBJBST (текущая лучшая цель) и т. д.

Основное предположение здесь: Gurobi не имеет ограничения по времени обратного вызова и убивает ваш обратный вызов (аналогично мерам безопасности). Я не думаю, что есть что-то подобное (по крайней мере, без предупреждения в документации)!

Не могу сделать

Как правило, вы не можете сохранить все состояние Гуроби ( ссылка относится к Гуроби 7). С точки зрения программной инженерии это не слишком удивительно (не невозможно, но потенциально сложно).

Сможет сделать

Вы можете выключить компьютер (спящий режим!) во время решения или в состоянии ожидания в обратном вызове. Теперь я повторю это еще раз: мы говорим о гибернации операционных систем. Либо приостановка к оперативной памяти (ПК будет потреблять меньше энергии), либо приостановка на диск (полностью отключена).

Сейчас:

  • this will destroy internal-timings (which you can observe in the verbose output)
    • not sure if relevant for you (maybe in interaction with your callback!)
    • warning: i could imagine that there are some statistics / interactive-learning based heuristic decisions (approach A worked in this part of the tree good; do A again) based on timings (as operations are harder to count)
      • it's not impossible that those statistics are completely taken off-balance by hibernation!
  • это зависит в основном от вашей операционной системы
  • this is probably not guaranteed to work or recommended by the Gurobi-devs, but might work (and does run; but it's harder to evaluate the impact on the solution-process)
    • we already saw, that things might change during sleep (time) and assumptions on these things are the potential problem

Сможет сделать

Используя обратные вызовы и запросы к внутренним состояниям, как упомянуто выше, вы можете использовать свой собственный тип сериализации для аутсорсинга текущего лучшего решения и, возможно, большего.

Эти вещи, наиболее важным из которых является начальный вектор MIP, который вы можете позже использовать для полностью недавно начатого процесса оптимизации.

Вам нужно решить, как сериализовать эти данные. База данных, HDF5, текстовые файлы и т. Д.!

Чтение и повторное использование должны соответствовать документам Гуроби.

Сейчас:

  • starting from a feasible MIP-solution (your best found yet) is not as good as reusing the whole internal state (we are losing a lot of solving-process dependent information)
    • but it should help a lot in general (probably depends much on the problem itself)
  • вы можете попытаться сохранить и повторно добавить привязку к цели как ограничение, но я не думаю, что это сильно поможет
person sascha    schedule 03.12.2017
comment
Я обнаружил, что параметры SolutionLimit и TimeLimit делают то, что я искал. - person user3548298; 09.12.2017

Установите SolutionLimit или TimeLimit в качестве параметров GurobiSolver

person user3548298    schedule 09.12.2017