2013-06-03 160 views
1

我的模型文件中存在以下問題:我想CPLEX解算器首先在括號內執行操作,然後相乘。正如通常的數學.... 但是當我運行這個約束我的模型文件:AMPL中的操作順序

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; 

其中,E,K,O是一組; 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; 

這裏可以看到,從支架由B [L,E]第一個乘法元素CPLEX解算器,然後嘗試添加它們。我的問題是:如何避免這種情況?

回答

2

AMPL中的expand命令簡化了約束表達式。特別是,它結合了like terms。例如:

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

打印

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

在你的情況AMPL使用倍增了加法/減法的distributivitya * (b - c) = a * b - a * c。這是必要的,因爲CPLEX和許多其他求解器只接受某種形式的約束表達式,例如一個線性表達式a1 * x1 + a2 * x2 + ... + an * xn,並且無法將任意表達式樹傳遞給它(至少使用CPLEX中的C API)。