Я ищу простой способ получить множество «хороших» решений в задачах LP (не MIP) с помощью CPLEX, а не только (одно из) оптимальных базовых решений. Под «хорошими» решениями я подразумеваю, что соответствующие объективные значения не так далеки от реального оптимального значения. Такой пул решений может помочь лицу, принимающему решение …
Точнее, учитывая определенный многогранник Axe<= b с x> = 0 и целевой функцией z = cx Я хочу максимизировать, после запуска LP я могу получить оптимальное значение z *. Затем я хочу перечислить все крайние точки многогранника, заданные набором ограничений
Ax <= b
cx >= z* - epsilon
x >= 0
когда эпсилон является заданным допуском.
Я знаю, что CPLEX предлагает способ создания пула решений (см. Вот), но он не будет работать, потому что этот метод предназначен для MIP: он перечисляет все решения IP (или одно решение для каждого данного набора фиксированных целочисленных переменных, если проблема — MIP).
Интересным эффективным способом является посещение смежных решений оптимального базового решения, то есть всех смежных крайних точек: если я предполагаю, что многогранник не является вырожденным, для каждой пары базовой переменной x_B и неосновной переменной x_N я вычисляю решение, полученное, когда x_B покидает базис и x_N входит в базис. Затем я бросаю решения с помощью CX < z * -epsilon, а для остальных я повторяю процедуру. [Я знаю, что мог бы улучшить этот алгоритм, но это общая идея].
рутина CPPXpivot Callable Library может помочь сделать эту операцию поворота, но я не нашел эквивалента в C ++ API (концертная технология). Кто-нибудь знает, существует ли такой эквивалент, или может предложить мне другой способ ответить на мою первоначальную проблему?
Большое спасибо 🙂 !
Реми Л.
Есть один интересный способ сделать его подходящим для использования с пулом решений Cplex. Используйте двоичные переменные для кодирования текущего базиса, например, basis[k] = 0
то есть неосновный и basis[k] = 1
указывающая переменная (или строка) k является базовой. Конечно у нас есть sum(k, basis[k]) = m
(количество рядов). Наконец мы имеем x[k] <= basis[k] * upperbound[k]
(т.е. если неосновная, то ноль — при условии положительных переменных). Когда мы добавляем это в модель LP, мы получаем MIP и можем перечислять (все или некоторые, оптимальные или почти оптимальные) базы, используя пул решений Cplex. Увидеть Вот а также Вот.
Других решений пока нет …