Minizinc“var set of int:x”而不是“set of int:x”

时间:2016-11-05 13:50:59

标签: syntax-error minizinc satisfiability

我在高尔夫球手问题中有一系列的设置(每周都应该组成一个小组,这样就不会有两个玩家不止一次一起玩,每个人每周只玩一次):

JLabel label = new JLabel();
panel.add(label);
panel.setLayout(null);
frame.add(panel);
panel.addMouseListener(new MouseAdapter() {
    public void mouseClicked(MouseEvent e) {
        int x = e.getX();
        int y = e.getY();
        label.setText("X: "+x+" \t Y: "+y); // this sets the JLabel's text
        label.setBounds(x, y, label.getText().length()*2, 20);
    }
});
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(200, 200);
frame.setVisible(true);

我的约束如下(我不确定一切是否正常):

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

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

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

2 个答案:

答案 0 :(得分:0)

首先:var是一个决策变量。所有Minizinc程序的目标都是决定所有决策变量的价值。您不知道值是什么,并且您正在尝试查找值。任何不是var的东西都只是一个已知的数字。 (无视套装的使用)

在Minizinc中没有实现决策变量(min(X[g,w]))的var。原因是在没有min的情况下使用X[g,w] < X[g+1,w]更有意义。为什么只限制所有数字的两个集合中的最小数字。 I.e {1,3,5}&lt; {1,4} 1 < 1

的{1,4}

(我希望MiniZinc已经开始了,所以我不会说谎,我不确定)

答案 1 :(得分: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..)