2017-11-30 6 views
0

작업 상점 문제와 비슷한 것을 모델링하려고합니다. 작업을 수행하는 데 다양한 수의 작업을 사용하는 여러 가지 방법으로 수행 할 수있는 여러 작업이 있습니다.MiniZinc에 누락 된 값이있는 선택적 매개 변수

그 정보를 표현하기 위해이 데이터 구조를 설정 한 : jobOptions[j, o, index]이있는 경우

enum Job; 
enum Option; 
int: maxTasks; 
set of int: TaskIndex = 1..maxTasks; 

enum Task; 

array[Job, Option, TaskIndex] of opt Task: jobOptions; 

, 그것은 작업 j의 옵션 oindex 번째 작업입니다. 누락 된 경우 해당 작업에 대한 해당 옵션은 최대 작업 수를 사용하지 않으며 빈 슬롯 중 하나입니다.

이 배열을 어떻게 초기화 할 수 있는지보고 싶지 않습니다. 그것은 2 차원 배열 인 경우는 3 차원이기 때문에, 나는 배열을 array3d의 세 가지 버전이 있기 때문에, 그러나

jobOptions = array3d(Job, Option, TaskIndex, [ 
    % Job 1 
    T1, T2, % Option 1 
    T3, <>, % Option 2 
    % Job 2 
    T2, T4, % Option 1 
    <>, <>, % No second option 
    |]; 

이 실패 같은 것을하고 싶은,

jobOptions = [| 
    T1, T2 | 
    T3, <> 
    |]; 

을 할 수 (par) int, var intvar opt int.<>var opt int이므로 (par) opt int 인 네 번째 버전이 필요합니다.

나는 처음에 "정사각형이 아닌"배열을 만들

array[Job] of array[int] of array[int]: jobOptions 

처럼 뭔가를 시도,하지만 만약 가능하다면, 내가 올바른 구문을 알아낼 수 없습니다.

선택 요소가 누락 된 3d 매개 변수 배열을 초기화하는 방법이 있습니까? 또는이 데이터를 표시하는 더 좋은 방법이 있습니까?

답변

1

업데이트 :이 문제는 MiniZinc 컴파일러의 develop 분기에서 해결되었습니다. 다음 릴리스 >2.1.6에서는 선택적 매개 변수 유형에 array3d 함수를 사용할 수 있어야합니다.


opt 파라미터의 함수 array3d 현재 컴파일러 누락 특징이다. 나는 GitHub 저장소에서 이슈를 만들 것을 제안 할 것이다 : https://github.com/MiniZinc/libminizinc/issues

대체로 대체 변수 (array[Job, Option, TaskIndex] of var opt Task: jobOptions;)로 유형을 변경하는 것이 좋습니다. 이것은 유형 검사에 이상적이지는 않지만 매개 변수 버전과 같이 지정할 수 있습니다 (현재 버전의 array3d에서도 작동합니다). 또한 할당 된 변수는 컴파일러에서 매개 변수로 작동합니다. 형식 검사기에 문제가 생기면 항상 fix 내장 함수를 호출하여 매개 변수에 바인딩 할 수 있습니다.

그러나이 로컬로 시도 할 때 나는 컴파일러에서 세그먼트 화 오류가 실행중인 것 같습니다. 동일한 것을 시도해보고 동일한 문제가 발생하면 GitHub 저장소에서 문제를보고하십시오. https://github.com/MiniZinc/libminizinc/issues