Перечислите некоторые крайние точки вблизи оптимального решения

Я ищу простой способ получить множество «хороших» решений в задачах 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 (концертная технология). Кто-нибудь знает, существует ли такой эквивалент, или может предложить мне другой способ ответить на мою первоначальную проблему?

Большое спасибо 🙂 !

Реми Л.

1

Решение

Есть один интересный способ сделать его подходящим для использования с пулом решений Cplex. Используйте двоичные переменные для кодирования текущего базиса, например, basis[k] = 0 то есть неосновный и basis[k] = 1 указывающая переменная (или строка) k является базовой. Конечно у нас есть sum(k, basis[k]) = m (количество рядов). Наконец мы имеем x[k] <= basis[k] * upperbound[k] (т.е. если неосновная, то ноль — при условии положительных переменных). Когда мы добавляем это в модель LP, мы получаем MIP и можем перечислять (все или некоторые, оптимальные или почти оптимальные) базы, используя пул решений Cplex. Увидеть Вот а также Вот.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]