2013-07-26 5 views
2

변수를 사용하여 행렬 값을 식별해야합니다. 내가하고 싶었던 것은 같은 변수를 정의하는 것입니다 :AMPL에서 변수를 색인으로 사용하십시오.

var a in A; # to say that the variable takes value from index A

을하고 내가 좋아하는 무언가로 사용하고 싶었 :

M1[a] >= 10; 
M2[a] <= 100; 

그러나 AMPL 불평 : 지수

변수 표현

배열 또는 행렬의 요소를 가리키면 무엇입니까? riable? 감사합니다.

답변

3

AMPL은 아래 첨자에 변수를 아직 허용하지 않습니다. 그러나 그들을 에뮬레이션하는 방법이 있습니다.

s.t. c: exists{i in A} (M1[i] >= 10 and i = a); 

이없는 매우 효율적이지만 작은 문제를 위해 잘 작동합니다 : 예를 들어, 다음과 같이 M1[a] >= 10을 에뮬레이트 할 수 있습니다. 위의 제약 조건 (또는 일단 추가 된 변수)을 포함하는 문제를 해결하려면 ilogcp 또는 gecode과 같은 제약 프로그래밍 솔버가 필요합니다. 자세한 내용은 LOGIC AND CONSTRAINT PROGRAMMING EXTENSIONS을 참조하십시오. AMPL위한 ilogcp 드라이버

새로운 버전은 예를 들어, element 제약을 지원 element({i in 0..2} x[i], y)x[y]가 동등하고 IloElement 제약로 번역

include cp.ampl; 
var x{i in 0..2} >= i integer; 
var y in 0..2 integer; 
minimize o: element({i in 0..2} x[i], y); 
option solver ilogcp; 
solve; 

.

+0

인덱스를 변수와 비교하고 있습니까? 허용됩니까? 나는 이것을 곧 시도 할 것이고, 당신을 감사한다. – HAL9000

+0

@ HAL9000 네, 그렇습니다. 집합'A'는 물론 숫자를 포함해야합니다. – vitaut

+0

그러나 CPLEX와 함께 일하는 유일한 해결책은 내 LP를 MILP로 재구성하는 것입니다. – HAL9000

관련 문제