Порядок работы в AMPL

У меня есть следующая проблема в моем файле модели: я хотел бы, чтобы решатель CPLEX сначала выполнял действия в скобках, а затем умножался. Как обычная математика.... Но когда я запускаю свой файл модели с этим ограничением:

subject to c4a {e in E, k in K, o in O}:
f[k,o] = 0
==>     
    delta[e,k,o] - p[k,e] * (sum{l in K}(b[l,e]*(1-f[l,o]))) = 0 
else  
    delta[e,k,o] = 0;

где Е,К,О множества; delta, f — бинарные переменные; а остальное - параметр. У меня есть проблема, которую я описал ранее с этими скобками: "(1-f[l,o])". Когда я пытаюсь разрешить пример файла данных, я получаю следующую ошибку:

CPLEX 11.2.0: logical constraint _slogcon[1] is not an indicator constraint.
expand _slogcon[1];
subject to c4a['1_2',2,'o1']:f[2,'o1'] == 0 ==> delta['1_2',2,'o1'] - (3 - f[2,'o1'] - f[3,'o1'] - 
f[4,'o1']) == 0 else delta['1_2',2,'o1'] == 0;

Здесь вы видите, что решатель CPLEX сначала умножает элементы из скобок на b[l,e], а затем пытается их сложить. Мой вопрос: как избежать этой ситуации?


person Michał Rowicki    schedule 03.06.2013    source источник


Ответы (1)


Команда expand в AMPL упрощает выражения ограничений. В частности, он объединяет похожие термины. Например:

var x;
var y;
subject to c: 2 * (x + y) + 3 * x = 0;
expand c;

отпечатки

subject to c:
    5*x + 2*y = 0;

В вашем случае AMPL использует дистрибутивность умножения над сложением/вычитанием: a * (b - c) = a * b - a * c. Это необходимо, поскольку CPLEX и многие другие решатели принимают выражения ограничений только в определенной форме, например линейное выражение a1 * x1 + a2 * x2 + ... + an * xn и нет возможности передать ему произвольные деревья выражений (по крайней мере, используя C API в CPLEX).

person vitaut    schedule 04.06.2013