저는 minizinc로 첫 제약 프로그래밍을 시도하고 있습니다. 나는 n
개의 슬롯과 n
명의 사람들로 각 슬롯에 다른 사람을 할당하여 일정을 잡으려고합니다. 나는 array of var int
을 사용하여 각 슬롯에 다른 사람을 보장하기 위해 alldifferent()
을 사용하여 일정을 모델링했습니다. 크기 n
의 별도의 array
, names
는 다음과 같이 자신의 이름이 포함되어 있습니다 :다른 배열의 Minizinc 제약
% Pseudo enum
set of int: NameIndex = 1..2;
int: Forename = 1;
int: Surname = 2;
int: n = 4; % Number of slots and people
set of int: slots = 1..n;
array[slots, NameIndex] of string: names = [| "John", "Doe"
| "Ann", "Jones"
| "Fred", "Doe"
| "Barry", "Doe" |];
% The schedule
array[slots] of var slots: schedule;
% Every person is scheduled:
include "alldifferent.mzn";
constraint alldifferent(schedule);
% How to constrain by a value from names, say alphabetic order by forename.
% Want to compare each value in schedule to the next one.
%constraint forall (i in 1..n-1) (names[schedule[i],Forename] < names[schedule[i+1],Forename]);
solve satisfy;
output [show(i) ++ ": " ++ show(names[schedule[i], Forename]) ++ " " ++ show(names[schedule[i], Surname]) ++ "\n"
| i in slots]
% should be:
% | i in schedule]
가 어떻게 이름과 값으로 schdule을 제한 할 수 있습니까? 위 내 (깨진) 예는 forall
제약 주석 때, 내가합니다 (Minizinc IDE를 사용하여) 수에서 :
in call 'forall'
in array comprehension expression
with i = 1
in binary '<' operator expression
in array access
cannot find matching declaration
나는 찾을 수없는 선언을 이해하지 때까지 오류를 따릅니다. 출력 블록 show()
의 값은 이름에서 꽤 행복하게 배열에 인덱스 할 때 값이됩니다.
무엇이 누락 되었습니까? 이름을 모델링하는 더 좋은 방법이 있습니까? 사람들의 추가 '속성'으로 이름을 확장하고 추가 제약 조건을 만들기를 희망합니다. 나는 모델과 나의 모든 제약이 아주 순진하다고 확신한다!
이렇게 설명 할 수 있습니다! 전처리는 문제가되지 않습니다. 나는 문자열을 지원하는 CP 해결사가 거의 없다고 생각합니다 ([검색 결과]와 같은) (https://arxiv.org/abs/1608.03650))? – aejh
논문 "MiniZinc with Strings"는 전통적인 CP 솔버에서 var 문자열의 첫 번째 구현에 대해 설명합니다 (Gecode에서 관련 실험 구현이 있지만 공식 출시되지는 않았습니다). 일부 전용 문자열 해석기가 있지만 문자열을 지원하는 경향이 있지만 기존의 전역 제약 조건이있는 var int :가 아닙니다. – hakank