Как попросить второе лучшее решение для MIP с использованием JuMP

У меня есть проблема со смешанным целочисленным программированием. Я могу использовать JuMP, чтобы найти оптимальное решение. Но как мне найти второе лучшее решение? Или третий лучший и т. Д.

Это может потенциально быть другим столь же оптимальным решением, или это может быть худшее решение, или это может быть :Infeasible - Там может быть не большинство решений.

Я знаю, что для задачи, подобной TSP, я могу найти дополнительные решения, постепенно удаляя ссылки, которые находятся на оптимальном пути (т. Е. Устанавливая расстояния между некоторыми городами как бесконечные). Для задачи с планировочным типом я также могу постепенно установить доступность временных интервалов, используемых на оптимальном пути, который должен быть запрещен.

Но есть ли общий способ сделать это, не кодируя себя проблемными методами, запрещающими это решение?

2 ответа

Вы можете добавить разрез, чтобы запретить только что найденное оптимальное решение и решить его снова. Скажем, ваша модель имеет бинарные переменные x(i), Позволять a(i):=x*(i) быть оптимальным решением, найденным ранее. Затем добавьте линейное ограничение:

sum(i, x(i) * a(i)) - sum(i, x(i) * (1-a(i))) <= sum(i, a(i)) - 1

и решить снова. (Эта вещь получена здесь). Если x это общая целочисленная переменная, все становится сложнее.

Некоторые решатели, такие как Cplex и Gurobi, также имеют так называемый пул решений, который также может сделать это.

У меня такой же вопрос для PuLP в Python.

Как мы можем получить второе (или несколько последующих) лучших решений, используя PuLP в Python?