Arrays 尝试使用集合数组在Minizing上设置约束

Arrays 尝试使用集合数组在Minizing上设置约束,arrays,constraint-programming,minizinc,Arrays,Constraint Programming,Minizinc,我有一个问题,我应该创建一组团队,只有一个简单的约束,其中有两个集合数组,其中两个成员必须在一起,而另一个不应该在一起。我是Minizing的新手,所以我很难使用带有集合数组的决策变量。团队规模也必须为n 例如: GroupsThatMustBePaired = [{1,3},{4,5}] GroupsThatShouldNot = [{2,3}] Output = [{1,3},{4,5},{2,6}..etc] 有什么帮助吗 使用集合变量一开始可能有点棘手,但是如果你能回到你在数学中学习

我有一个问题,我应该创建一组团队,只有一个简单的约束,其中有两个集合数组,其中两个成员必须在一起,而另一个不应该在一起。我是Minizing的新手,所以我很难使用带有集合数组的决策变量。团队规模也必须为n

例如:

GroupsThatMustBePaired = [{1,3},{4,5}]
GroupsThatShouldNot = [{2,3}]

Output = [{1,3},{4,5},{2,6}..etc]

有什么帮助吗

使用集合变量一开始可能有点棘手,但是如果你能回到你在数学中学习集合的时候,那么这些概念应该非常熟悉

下面是一个如何编写模型的示例。它有一些额外的限制,以确保“团队”包含所有人,没有人两次,并且具有最大容量 包括“所有不相交的.mzn”

int的集合:成员=1..6;
整数集:组=1..3;
成员集的数组[int]:GroupSthatBepaired=[{1,3},{4,5}];
一组成员的数组[int]:GroupsThatShouldNot=[{2,3}];
var成员集合的数组[组]:团队;
%团队成员只能是一个团队的一部分
约束所有不相交(团队);
%每个人都必须是团队的一部分
约束数组_union(团队)=成员;
%每组最大人数

对所有(g组)的约束(卡片(团队[g])非常感谢!这是一个很大的帮助。你知道我可以使用哪些资源来进行更多的练习吗?特别是使用集合变量。你可以看看Minizing教程中的集合示例:。Minizing的一般练习来自实际制作模型。我认为将重点放在建模上而不是放在特定方面是明智的关于MiniZinc。如果你在MiniZincHey方面没有太多的经验,Coursera上的三个MiniZinc课程是一个很好的起点,非常感谢!我还有一个快速的问题。我正在计算锦标赛的总竞争,一个球员与另一个互补性非常好的球员组队。因此我们的有效性组={[4,5],[6] }.竞争是根据有效性组中有多少人配对来计算的。所以如果玩家1(第一排对应于玩家i)将4和5组合在一起,然后分数为2。我想进行intersect,但我遇到了如何迭代的问题。有什么想法吗?@DavidGoliath欢迎这样做;既然答案解决了您的问题,请接受它-参见
set of int: MEMBERS = 1..6;
set of int: GROUPS = 1..3;
array[int] of set of MEMBERS: GroupsThatMustBePaired = [{1,3},{4,5}];
array[int] of set of MEMBERS: GroupsThatShouldNot = [{2,3}];

array[GROUPS] of var set of MEMBERS: teams;

% Team members can only be part of one team
constraint all_disjoint(teams);
% Everyone must be part of a team
constraint array_union(teams) = MEMBERS;
% Maximal number of people per group
constraint forall(g in GROUPS) ( card(teams[g]) <= 2 );

% Eliminate bad groups
constraint forall(g in GROUPS, i in index_set(GroupsThatShouldNot)) (
  not (GroupsThatShouldNot[i] subset teams[g])
);

% Enforce good groups
constraint forall(i in index_set(GroupsThatMustBePaired)) (
  exists(g in GROUPS) (
    GroupsThatMustBePaired[i] subset teams[g]
  )
);