2016-04-18 4 views
0

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

Minimize 
obj: [ a^2 - 2 a * b + b^2 ]/2 
Subject To 
c1: a + b >= 10 
c2: a <= 100 
End 

Я использую Python API, чтобы решить проблему следующим образом:

import cplex 

cpx = cplex.Cplex() 
cpx.read('quadratic_obj_so.lp') 
# use the dual simplex 
cpx.parameters.lpmethod.set(cpx.parameters.lpmethod.values.dual) 
cpx.solve() 
print cpx.solution.get_values()[0:15] 
print cpx.solution.status[cpx.solution.get_status()] 
print cpx.solution.get_objective_value() 

И для приведенного выше примера я тогда получить (показывать только итерации 16-18):

Itn  Primal Obj  Dual Obj Prim Inf Upper Inf Dual Inf 
    16 1.4492800e-19 -1.0579911e-07 3.81e-14 7.11e-15 5.17e-25 
    17 9.0580247e-21 -2.6449779e-08 1.91e-14 3.55e-15 2.33e-25 
    18 5.6612645e-22 -6.6124446e-09 5.45e-14 7.11e-15 6.46e-27 

[73.11695794600045, 73.11695794603409] 
optimal 
0.0 

так a и b равны, который имеет смысл, так как я стараюсь, чтобы минимизировать их расстояние и сдерживает является CLE исполнилось.

Однако моя актуальная проблема является гораздо более сложным, и я получаю:

Itn  Primal Obj  Dual Obj Prim Inf Upper Inf Dual Inf 
92 1.4468496e+06 1.2138985e+06 1.80e+02 2.64e-12 5.17e-02 
    93 1.4468523e+06 1.2138969e+06 2.23e+02 2.17e-12 1.08e-02 
    94 1.4468541e+06 1.2138945e+06 2.93e+02 2.31e-12 5.62e-02 
    * 1.4457132e+06 1.2138598e+06 7.75e+00 7.61e-09 2.76e-02 

num_best 
1445714.46525 

У меня сейчас несколько вопросов относительно выхода, которые тесно связаны:

1) Очевидно, что это не цель значение для двойного симплекса. Почему это, поскольку я установил решателя как двойной симплекс ?!

2) Как мне получить доступ к результатам для двойного симплекса? Поскольку объективное значение меньше, я был бы более заинтересован в этих результатах.

3) Означает ли статус num_best, что все ограничения выполнены, то есть решение является действительным, но не гарантировано оптимальным?

4) Primal Obj и Dual Obj отличаются довольно много. Есть ли какая-либо стратегия, чтобы свести к минимуму их разницу?

+0

Я не думаю, что этот журнал из двойного симплекса, а скорее из метода барьера. Также обратите внимание, что решение QP обычно не выполняется с помощью метода Simplex LP. –

+0

@ErwinKalvelagen: спасибо за ваш комментарий! Что бы вы рекомендовали вместо этого? – Cleb

+0

Сначала я бы рассмотрел возможные варианты переформулировки. Постарайтесь максимально логично вывести логику из объектива в линейные ограничения (например, (x + y)^2 можно записать в виде z^2 с z = x + y). Также посмотрите на масштабирование. Попробуйте параметр Cplex 'numericalEmphasis'. –

ответ

1
  1. Насколько я знаю, get_objective_value всегда возвращает наилучшую первичную границу (независимо от lpmethod).
  2. Информация о двойном решении может быть получена с помощью get_dual_values.
  3. Состояние решения num_best означает, что решение доступно, но нет доказательств оптимальности (см. here). Это, наверное, самый важный момент в отношении остальных вопросов здесь.
  4. Вы можете попробовать включить параметр numerical emphasis, чтобы узнать, помогает ли это. Существуют также различные допуски, которые вы можете настроить (например, optimality tolerance).

Обратите внимание, что все ссылки, которые я использовал выше, предназначены для C Callable Library (которую API-интерфейс Python вызывает внутри) для CPLEX 12.6.3.

+0

Спасибо за подробный ответ (я подтвердил это и принял позже)! Что касается точки 3, чтобы сделать это уверенным: возвращаемое решение действительно (ни одна из границ не нарушена), но он не может быть проверен, является ли он оптимальным. Это верно? К настоящему моменту я думаю, что было бы лучше выразить разницу между переменными не как '(x1 - x2)^2 + (x2-x3)^2 + ...', а как 'abs (x1-x2) + abs (x2-x3) + ... '. Разумеется, последнее выражение должно быть линеаризовано. Знаете ли вы какие-либо примеры, где сумма абсолютных различий была минимизирована? – Cleb

+0

Нет, с условием статуса num_best, я не думаю, что вы можете предположить, что решение действительно. Если я правильно понял, вы можете найти [this] (http://orinanobworld.blogspot.com/2012/07/modeling-absolute-values.html) блог по интересующим абсолютным значениям. В объектно-ориентированном API (C++, Java, .NET) вы можете использовать [abs] (http://www.ibm.com/support/knowledgecenter/api/content/nl/en-us/SSSA5P_12.6.3/ilog .odms.cplex.help/refjavacplex/html/ilog/concert/IloModeler.html # abs (ilog.concert.IloIntExpr)). – rkersh

+0

Хорошо, спасибо, эта запись в блоге действительно полезна. У вас было время, чтобы проверить пункт 1)? – Cleb

Смежные вопросы