2013-06-03 3 views
1

내 모델 파일에 다음과 같은 문제가 있습니다. CPLEX solver가 먼저 대괄호로 묶인 작업을 수행하고 곱 해졌 으면합니다. 바와 같이 .... 일반적인 수학이다하지만이 제약 내 모델 파일을 실행하면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는 집합입니다; 델타, 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 [1, 전자]에 의해 괄호의 첫 번째 다중 요소 해석하고 다음 시도 볼에 추가합니다. 내 질문은 :이 상황을 피하는 방법?

답변

2

AMPL의 expand 명령은 제약 조건 표현을 단순화합니다. 특히, like terms을 결합합니다. 예를 들어 : a * (b - c) = a * b - a * c :

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

인쇄 귀하의 경우에는

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

AMPL은 또한/뺄셈보다 곱셈의 distributivity 사용합니다. 이것은 CPLEX 및 많은 다른 해결사가 제약 조건 표현을 특정 형식으로 만 수락하기 때문에 필요합니다. 선형 표현 a1 * x1 + a2 * x2 + ... + an * xn이고 CPLEX의 C API를 사용하여 임의의 표현 트리를 전달할 방법이 없습니다.