Линейное программирование: найти все оптимальные вершины
мне было интересно, есть ли хороший способ (предпочтительно с помощью JuMP) получить все оптимальные решения линейной программы (если есть несколько оптимальных решений).
пример
минимизировать статистическое расстояние (расстояние Колмогорова) между двумя распределениями вероятностей.
min sum_{i=1}^{4} |P[i] - Q[i]| over free variable Q
P = [0.25,0.25,0.25,0.25]
sum_i P[i] = 1
Q[1] + Q[4] = 1
sum_i Q[i] = 1 -> Q[2],Q[3] = 0
Примечание мы можем сформулировать оптимизацию как линейную программу, цель становится
min S >= sum_i S[i]
S[i] >= P[i]-Q[i]
S[i] >= Q[i]-P[i]
нет уникального решения этой проблемы, вместо этого подпространство оптимального решения охватывает
Q1 = [0.75,0,0,0.25]
Q2 = [0.25,0,0,0.75]
оба имеют минимальное расстояние 0,5, любая выпуклая комбинация этих двух решений является оптимальным.
мне было интересно, есть ли хороший способ найти все эти оптимальные экстремальные точки (точки, которые охватывают оптимальное подпространство)?
почему меня это интересует; точки, которые дают максимальное коэффициент Bhattacharyya (вогнутая) функция, лежит где-то посередине оптимальное подпространство статического расстояния.
до сих пор я пытался найти оптимальные пары P,Q (ссылаясь на пример,который я дал), сделав алгоритм в пользу минимизации расстояния между P[i], Q[i], добавив вес 1.001 к этому члену в сумме. Кажется, это работает в некоторой степени, хотя я вряд ли могу знать наверняка.
3 ответов
существует интересный способ перечислить все возможные оптимальные решения LP (или, скорее, все оптимальные базы LP), используя стандартный решатель MIP. В основном алгоритм:
step 1. solve LP/MIP
step 2. if infeasible or if objective starts to deteriorate: stop
step 3. add cuts (constraints) to the model to forbid current optimal solution
step 4. goto step 1
см., например,здесь.
LP решатели не предназначены для перечисления всех оптимальных решений. Как только вы знаете оптимальное целевое значение, вы можете определить многогранник, содержащий все оптимальные решения, а затем использовать алгоритм перечисления вершин для сбора возможно очень большого набора экстремальных точек этого многогранника. Все оптимальные решения являются выпуклыми комбинациями этих экстремумов. От Джулии вы можете использовать фантик на cdd.
Я не знаю о Джулии, но есть инструмент под названием PPL что вы можете использовать для определения всех вершин многогранника решения после решения линейной программы.
см. мой ответ здесь на аналогичный вопрос: найти все альтернативные основные решения, используя существующий инструмент линейного программирования.