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

How to get the index of element in IntVar using java choco3 API?

我正在尝试解决会议安排问题。我定义了一个矩阵 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] 的索引。

为了在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

任何有关如何解决此问题的想法都将不胜感激。谢谢!

arithm约束可以link一个变量和一个整数,或者两个变量在一起,或者两个变量和一个整数在一起。 在您的情况下,(Arrays.asList(agent_cal[a])).indexOf(m) returns 是一个整数,(Arrays.asList(agent_cal[a+1])).indexOf(m) 也是一个整数,并且没有 API 表示两个整数必须相等,因为它们不是变量。 我相信您想获得 agent_cal 变量矩阵的第 m^th 列,并且 link 变量 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]));
    }
}