我正在尝试解决会议安排问题。我已经定义了一个矩阵IntVar[][] agent_cal
,它是要安排会议的每个代理的日历。我的初始化如下:
agent_cal=VF.boundedMatrix( "agents' calendar",
mAgents,
timeslots,
-1,
nMeetings-1,
solver);
其中给出了mAgents,timeslots,nMeetings,solver是Solver的一个实例。我想为每次会议设置约束;参加会议的所有代理商必须在同一时段的日历中使用它。例如,如果agent0
和agent1
参加会议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
如何解决这个问题的任何想法都将非常感激。谢谢!
答案 0 :(得分:1)
算术约束可以将变量和整数,或两个变量链接在一起,或者将两个变量和一个整数链接在一起。
在您的情况下,(Arrays.asList(agent_cal[a])).indexOf(m)
返回一个整数,(Arrays.asList(agent_cal[a+1])).indexOf(m)
也是如此,并且没有API表示两个整数必须相等,因为它们不是变量。
我相信您希望得到agent_cal
变量矩阵的第m列,并将变量a
和a+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]));
}
}