如何使用java choco3 API获取IntVar中的元素索引?

时间:2015-10-19 18:54:52

标签: java constraint-programming

我正在尝试解决会议安排问题。我已经定义了一个矩阵IntVar[][] agent_cal,它是要安排会议的每个代理的日历。我的初始化如下:

agent_cal=VF.boundedMatrix( "agents' calendar",
                                       mAgents,
                                     timeslots,
                                            -1,
                                   nMeetings-1,
                                       solver); 

其中给出了mAgents,timeslots,nMeetings,solver是Solver的一个实例。我想为每次会议设置约束;参加会议的所有代理商必须在同一时段的日历中使用它。例如,如果agent0agent1参加会议m,则出现m的agent_cal[agent0]索引必须等于m出现的agent_cal[agent1]索引。< / p>

为了在choco中表达这一点,我编写了以下代码:

for (int m = 0; m < nMeetings; m++) {
    ArrayList<Integer> as = meet_attend.get(m);
    for (int a = 0; a < as.size() - 2; a++) {
        solver.post(ICF.arithm(
                    (Arrays.asList(agent_cal[a])).indexOf(m),
                                "=",
                    (Arrays.asList(agent_cal[a+1])).indexOf(m)));
    }
}

我得到的是以下错误:

Solve.java:136: error: cannot find symbol
              solver.post(ICF.arithm((Arrays.asList(agent_cal[a])).indexOf(m),"=",(Arrays.asList(agent_cal[a+1])).indexOf(m)));
                                                                                         ^
symbol:   variable Arrays
location: class Solve
Solve.java:136: error: cannot find symbol
                solver.post(ICF.arithm((Arrays.asList(agent_cal[a])).indexOf(m),"=",(Arrays.asList(agent_cal[a+1])).indexOf(m)));
                                        ^
  symbol:   variable Arrays
  location: class Solve
2 errors

如何解决这个问题的任何想法都将非常感激。谢谢!

1 个答案:

答案 0 :(得分:1)

算术约束可以将变量和整数,或两个变量链接在一起,或者将两个变量和一个整数链接在一起。 在您的情况下,(Arrays.asList(agent_cal[a])).indexOf(m)返回一个整数,(Arrays.asList(agent_cal[a+1])).indexOf(m)也是如此,并且没有API表示两个整数必须相等,因为它们不是变量。 我相信您希望得到agent_cal变量矩阵的第m列,并将变量aa+1链接到同一列中。 如果是这样,你可以这样做:

import org.chocosolver.util.tools.ArrayUtils; 
//....
for (int m = 0; m < nMeetings; m++) {
    IntVar[] colm = ArrayUtils.getColumn(agent_cal, m);
    ArrayList<Integer> as = meet_attend.get(m);
    for (int a = 0; a < as.size() - 2; a++) {
        solver.post(ICF.arithm(
                colm[a],
                "=",
                colm[a+1]));
    }
}