Принуждение CPLEX к переходу на оптимальное решение LP

Я решаю классическую проблему сетевого потока с помощью CPLEX (используя Java). Он содержит ограничение Ax = b (A - матрица инцидентности узла и дуги, x - переменная решения для потоков ссылок, а b - заданные правые части). Меня интересуют теневые призы увеличения / уменьшения b в одном измерении.

В невырожденной задаче теневые цены задаются двойственными переменными на ограничении Ax = b. Однако моя проблема вырождена. Таким образом, одно оптимальное решение может быть выражено несколькими комбинациями базисных и небазисных переменных. Каждая из этих комбинаций должна иметь разные двойственные переменные.

По крайней мере, один из этих двойников должен дать мне теневую цену увеличения b, другой дуал предоставит теневую цену уменьшения b. (Согласно W.Powell (1989): «Обзор результатов чувствительности для линейных сетей и новое приближение для уменьшения эффектов вырождения»)

Мой вопрос: после решения LP с CPLEX и получения первого набора двойников, как мне заставить CPLEX выполнить замену базисных и небазисных переменных, чтобы я мог получить еще один набор двойников?


person user3530856    schedule 18.09.2014    source источник


Ответы (1)


Все обсуждение ниже относится к двойной проблеме.

Неосновные переменные с нулевой приведенной стоимостью могут входить в базис на положительном уровне и формировать альтернативные оптимальные решения. Таким образом, если оптимальное целевое значение задачи равно z * и c'x является связанной целевой функцией, вы можете добавить ограничение c'x = z*, изменить целевую функцию на другую, позволить симплексу выполнить одну итерацию и повторить итерацию. Каждая итерация после второй должна (i) генерировать новое оптимальное решение или (ii) генерировать уже сгенерированное оптимальное решение, и в этом случае мы можем изменить целевую функцию и выполнить итерацию.

Этот метод описан здесь со ссылкой на C Функции API:

Для линейных программ уменьшенные до нуля затраты для небазовых переменных указывают на существование альтернативного оптимального базиса. Кроме того, вы можете использовать подпрограммы CPXgetgrad и CPXgetx, чтобы определить, является ли связанная опорная точка вырожденной (в этом случае значения решения остаются неизменными, но изменяется базис) или нет (в этом случае меняются и значения решения, и базис). Обратите внимание, что снижение затрат на резервные переменные является отрицательным из связанных двойных переменных. Кроме того, процедура CPXaddrows предоставляет простой способ перечислить альтернативные оптимальные решения. Предположим, что оптимальное целевое значение исходной задачи - z *, а c'x - соответствующая целевая функция. Используйте CPXaddrows, чтобы добавить следующее ограничение:

c'x = z*

Измените целевую функцию на другую цель; установить предел симплексной итерации 1 (один) (или предел решения 1 в случае MIP); затем несколько раз оптимизируйте проблему. Каждое возможное решение этой модифицированной проблемы является оптимальным решением исходной проблемы. Эта процедура предоставит некоторые, но не обязательно все, альтернативные оптимальные решения исходной проблемы. Обратите внимание, что этот метод добавления ограничения также будет работать на непрерывной модели с квадратичной целью, тогда как метод фиксации небазовых переменных с нулевыми сокращенными затратами не может быть легко распространен на нелинейные цели. Поскольку CPLEX решает выпуклые квадратичные программы, ограничение на квадратичную цель должно быть неравенством, а не равенством, как описано выше в случае линейной цели. Поскольку при переходе приложения от одного альтернативного оптимального решения к другому могут изменяться только небазовые переменные с уменьшенными затратами, равными 0 (нулю), вы также можете перечислить альтернативные оптимальные решения, используя подпрограммы CPXgetdj и CPXgetpi для определения небазовых структурных переменных и резервов с ненулевыми значениями. снижение затрат. Затем установите для этих структурных переменных их текущие значения с помощью CPXchgbds и исправьте переменные резерва с помощью CPXchgsense. Установите предел симплексной итерации равным 1 (один); поменять цель как раньше; и вы можете перечислить некоторые, но не все альтернативные оптимальные решения.

Другой способ, очень похожий, состоит в том, чтобы добавить небольшой случайный вектор к соответствующим коэффициентам целевой функции (т. Е. «Нарушить» цель), решить проблему и убедиться, что новая вершина не совпадает со старой вершиной и что она дает то же значение целевой функции, что и у старой вершины (если нет, возмущайте еще раз и повторите). Этот метод хорошо описан в этом посте от Пола Рубина.

Для проблем MIP CPLEX предоставляет пул решений, в котором хранится определенное количество уже найденных решений, и функцию populate, которая ищет другие решения. Этот пост (снова Пол Рубин) объясняет, как это работает в Java API.

Обновить

Продолжение комментария ниже:

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

Значение целевой функции останется прежним, поскольку мы добавляем ограничение, согласно которому цель должна быть равна своему оптимальному значению (c'x = z*). Когда я говорю «сгенерируйте новое оптимальное решение» выше, я имею в виду новый набор оптимальных двойственных значений, то есть другой оптимальный двойственный базис. Первичное решение останется тем же (при условии, что основная задача является вырожденной и для нее не существует нескольких оптимальных решений).

  1. После изменения основы я хочу переоценить двойственные переменные. Если я добавлю c'x = z * в качестве ограничения, все мои двойники будут равны 0.

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

  1. Я бы хотел воздержаться от решения, поскольку это то, чего я пытаюсь избежать в первую очередь: я мог бы напрямую рассчитать теневые цены, решив мою проблему с возмущенным b.

Это правда, но в этом случае нам нужно решить проблему 2 * n раз, где n - это размер b: нам нужно заменить каждый компонент b на b - 1 и b + 1 за раз.

Мне неизвестен какой-либо метод, который может сделать то, что вы ищете, без разрешения .. Я нашел соответствующее сообщение Тобиаса Ахтерберга, главного разработчика CPLEX, который, по сути, описывает тот же метод. Кроме того, эта статья восстанавливает оптимальное первичное решение из оптимального двойного решения с помощью разрешение LP снова. Это возможно без решения, если вы воспользуетесь структурой сетевого потока вашей проблемы, но это потребует создания индивидуального алгоритма для этой конкретной проблемы. Несколько лет назад я проделал нечто подобное для составления большого количества размеров, и это требует некоторых усилий.

Надеюсь, это поможет!

person Ioannis    schedule 19.09.2014
comment
Спасибо за быстрый ответ. Я не совсем уверен, правильно ли я все понял, но думаю, что не могу использовать это для моей проблемы. Несколько вещей: 1. Мне нужно, чтобы мое оптимальное решение оставалось неизменным, даже если есть другие решения. Я только хочу, чтобы основание изменилось в вырожденном случае. 2. После изменения основы я хочу переоценить двойственные переменные. Если я добавлю c'x = z * в качестве ограничения, он установит для всех моих двойников значение 0. 3. Я хотел бы воздержаться от разрешения, поскольку это то, чего я пытаюсь избежать в первую очередь: я мог бы напрямую рассчитать теневые цены решив мою проблему с возмущенным б - person user3530856; 19.09.2014
comment
@ user3530856 Спасибо за комментарий. Думаю, я понимаю ваше беспокойство. Я обновил ответ и надеюсь пролить еще немного света. - person Ioannis; 22.09.2014