변수와 변수 사이에 선형 제약 조건 목록이 있습니다. 각 변수에 대해 유효한 값의 시작 목록이 포함 된 집합이 있습니다. Minizinc를 사용하여 어떻게 시작 값의 집합을 제약 조건을 만족시킬 수있는 값으로 줄일 수 있습니까? 내가 xy
에 대한 모든 솔루션 solve satisfy
항목 및 인쇄 이것을 실행하면 (수평 라인이 제거 포함)각 변수가 취할 수있는 모든 값을 확인하십시오.
array[1..2] of var int: xy;
array[1..2] of set of int: xyvalid = [ {1, 5, 7}, 0..9 ];
constraint forall(i in 1..2)(xy[i] in xyvalid[i]);
constraint xy[1] + xy[2] = 7;
, 내가 얻을 :
간단한 예를 들어 내가 달성하기 위해 노력하고있어 설명하기
내가을 원하는 무엇[1, 6]
[5, 2]
[4, 3]
[3, 4]
어떻게 든이 경우 [ {1, 3, 4, 5}, {2, 3, 4, 6} ]
동일 것이라고 xypossible
를 호출, VAR 세트의 배열을 얻을 수 있습니다. xypossible[1]
의 가능한 모든 값에 대해 유효한 솔루션을 생성하는 xypossible[2]
에 값이 있음을 확인하고 그 반대의 경우를 확인한 다음 모든 세트의 전체 카디널리티를 최대화하도록 해결하는 일련의 제약 조건을 정의 할 수 있습니다. xypossible
하지만 내 실제 데이터는 수십 개의 선형 제약이있는 수백 개의 변수로 잠재적으로 코드를 작성할 때 추악하고 실행하기가 어려울 때 유용합니다.
모델로 할 수있는 방법이 없다면 솔버가 자체 작업을 수행하는 과정에서 유효한 값을 식별 한 결과로 정보를 캡처 할 수있는 방법이 있습니까?
var int : xy 집합의 배열 [1..2]로 모델링 해 보았습니까? 세트를 찾으려고합니다. – Kobbe
나는 궁극적으로 그렇게 할 것이라고 기대하지만 적절한 양의 데이터가 주어지면 효율적으로 배열을 생성하는 모델을 지정하는 방법을 모르겠습니다. – ConMan