2013-05-10 4 views
1

Можно ли использовать в условных операторах AMPL, таких как «if (...) then ...»? Ниже показано, как я пытался это сделать.Использование условных операторов для распознавателя CPLEX

subject to c1a {k in K, o in O, n in N: n!=t[k,o]}: 
sum{e in E} 
    (a[n,e]*x[e,k,o]) - 
sum{e in E} 
    (b[n,e]*x[e,k,o]) = 
      (if (r[n,k]==1 and f[n,o]==1) 
       then d[k,o]*(1-f[k,o]) 
       else 0); 

Мои Ampl возвращаются ко мне ошибку следующим образом:

CPLEX 11.2.0: Constraint _scon[1] is not convex quadratic since it is an equality constraint. 

У вас есть какие-либо идеи хо разрешить эту проблему?

ответ

1

Можно использовать выражение if-then-else с CPLEX, если условие (выражение между if и then) не содержит переменных. CPLEX также поддерживает так называемые «ограничения индикаторов» (см. here), которые используют оператор импликации (==>) и несколько похожи на if-then-else, но допускают переменные в состоянии.

Что касается вашего примера, неясно, какие имена соответствуют переменным и какие ограничения, но ошибка указывает на то, что проблема связана не с if-then-else, а потому, что у вас есть квадратичное ограничение в форме, не поддерживаемой CPLEX (см. раздел Квадратичные ограничения на стр. 33 из ILOG AMPL CPLEX System User's Guide для получения информации о принятой форме).

+0

краткой информации: индикатор ограничения поддерживает только двоичные переменные –

1

вы можете изменить ваш решатель CPLEX иметь дело только с выпуклыми и квадратичными ограничениями и используются бет по умолчанию в разрешении Ampl, так что вы можете попытаться repload вашего мода и Даты файлов, а затем выбрать другой решатель следующим образом:

ampl: option solver " ipopt"; 
ampl: solve; 

или

ampl: option solver " couenne"; 
ampl: solve; 
Смежные вопросы