2017-11-10 13 views
1

문제는 일부 사람들이 고정 된 크기의 그룹으로 골프를 치는 일정을 찾는 것입니다. 모든 플레이어가 한 번에 한 그룹에 속해 있음을 보장해야합니다. 여기 Minizinc lazyfd 솔루션이 제한을 무시합니다.

내 코드입니다 :

int: gr;    % number of groups 
int: sz;    % size of groups 
int: we;    % number of weeks 

int: n=gr*sz;  % number of players 

set of int: G=1..gr; % set of group indices 
set of int: P=1..n; % set of players 
set of int: W=1..we; % set of weeks 

% test instance 
gr = 2; 
sz = 2; 
we = 2; 

array[G,W] of var set of P: X; 
    %X[g,w] is the set of people that form group with index g in week w 


% forall group x, |x| = sz 
constraint forall (g in G, w in W) 
    (card (X[g,w]) = sz); 

% one person cannot play in two groups simultaneously 
constraint forall (g in G, w in W, p in X[g,w], g2 in (g+1..gr)) 
    (not(p in X[g2,w])); 

solve satisfy; 
내 문제는 지금은 얻을 내가 사용하는 경우 G12 즉, 해결사

$ minizinc -b lazy this.mzn 

을 lazyfd 즉

무시하는 것 같다
X = array2d(1..2 ,1..2 ,[1..2, 1..2, 1..2, 1..2]); 
---------- 

내 두 번째 제약. 게으른 옵션을 사용하지 않고 G12 한편 는, 즉

$ minizinc this.mzn 

맞습니다

X = array2d(1..2 ,1..2 ,[1..2, 1..2, 3..4, 3..4]); 
---------- 

을 산출한다. G12 MIP 및 Gecode도 올바른 결과를 제공합니다.

어떻게 가능합니까? 그리고 내가 어떻게 그것에 의존 할 수 있도록 게으른 해결사를 사용할 수 있습니까? 아니면 어떻게 든 엉망이 된 내 설치입니까?

+0

는 '버그'처럼 보입니다. [여기] (https://github.com/MiniZinc/libminizinc/issues)보고하십시오. '게으른'엔진이 아닌 다른 엔진을 쓰지 않는 이유는 무엇입니까? –

+0

성능이 내 이유 였지만 성능은 버그에서 비롯된 것 같습니다 ... 게으른 해결사 만 합리적인 시간 내에 문제를 해결할 수있는 좀 더 복잡한 예제가있었습니다. 처음에는 그 사실을 몰랐습니다. 잘못된 해결책! – JTSkywalker

+0

이 예제에서'fd' 엔진은 1 초 이내에 다른 배열 배열을 '36'찾았고'지연 엔진'은 다른 배열을'777 '찾습니다. 그래서 예, 버그 또는 엔진 자체의 다른 본질적인 제한 때문에 제가 잘 모르고 있기 때문입니다. –

답변

2

G12/lazyFD는 여러 곳에서 파손 된 것으로 알려져 있습니다. 문제는 G12 솔버가 더 이상 개발되지 않고 곧 배포판에서 제거 될 가능성이 높다는 것입니다.

나는 Chuffed를 대안으로 제안 할 것입니다. Chuffed는 게으른 절 생성을 사용하여 C++로 작성된 FD 솔버입니다. 그것은 정확해야하며 G12 솔버를 더 잘 수행 할 것입니다 (적어도 솔루션이 정확할 때).

Chuffed 및 기타 MiniZinc 해결사는 software page of the MiniZinc website에서 찾을 수 있습니다.