2016-11-05 32 views
0

我在Golfers问题中设置了一组数组(每周都应该组成一个组,一次,每个人都确切地扮演着每星期一次):Minizinc“var set of int:x”,而不是“set of int:x”

int: gr; %number of groups 
set of int: G=1..gr; 
int: sz; %size of groups 
set of int: S=1..sz; 
int: n=gr*sz; %number of players 
set of int: P=1..n; 
int: we; % number of weeks 
set of int: W=1..we; 

include "globals.mzn"; 

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

我的约束如下(我不知道,如果一切正常,尚未):

constraint forall (g in G, w in W) (card (X[g,w]) = sz); %Each group should have size sz 

constraint forall (w in W, g,h in G where g > h) (disjoint(X[g,w], X[h,w])); % Nobody plays twice in one week 

constraint forall (w,u in W where w > u) (forall (g,h in G) (card(X[g,w] intersect X[h,u]) <= 1)); % Two players never meet more than once 

constraint forall (w in 2..we) (w+sz-1 in X[1,w] /\ 1 in X[1,w]); %Symmetries breaking: week permutations 

constraint forall (w in W, g in 1..gr-1) (min(X[g,w]) < min(X[g+1,w])); %Symmetries breaking: group permutations 

constraint forall (g in G, s in S) (s+sz*(g-1) in X[g,1]); 

solve satisfy; 

output [ show(X[i,j]) ++ if j == we then "\n" else " " endif | i in 1..gr, j in 1..we ]; 

我的问题在于限制数量5.我不能在“var set of int:x”上使用min,我应该在“set of int:x”上使用它。不幸的是,我不明白这两者之间的区别(从我读过的内容来看,这可能与定义每组的大小有关,但我不确定)。

有人可以向我解释这个问题并提出解决方案吗?我会非常感激。谢谢!

回答

0

我已经找到了解决方案 - 在这种情况下,我们应该创建一组元素来使max函数成为可能。

constraint forall (w in 2..we) (max([i | i in X[1,w-1]]) < max([i | i in X[1,w]])); %Symmetries breaking: week permutations 

constraint forall (w in W, g in 1..gr-1) (min([i | i in X[g,w]]) < min([i | i in X[g+1,w]]));% Symmetries breaking: group permutations (I have been trying to speed up the constraint above, but it does not work with var set of int..) 
0

首先:A var是一个决策变量。所有Minizinc计划的目标都是确定所有决策变量的价值。你不知道这些值是什么,你正试图找到这些值。任何不是var的只是一个已知的数字。 (不考虑使用集合)

在Minizinc中并未实现决策变量(var)的min(X[g,w])。原因将是使用X[g,w] < X[g+1,w]没有最小值更有意义。为什么只限制所有数字中的最低数字。即{1,3,5} {< 1,4} insted的的1 < 1

(我希望MiniZinc对套<,所以我不会说谎,我不知道)

+0

嗨:)谢谢你的答案。 如果我们限制所有的数字,我们不仅会删除对称性,还会删除“好”的解决方案。通过制定我想在周群组排列中摆脱的约束条件。 例如,如果我们得到一个包含{1,2,6} {3,4,5} {7,8,9}组的星期,那么条件将不会被满足。我不明白,为什么它不应该。 – Kuba

相关问题