如何使用 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 的一个实例。我想为每次会议设置约束条件;所有参加会议的代理人都必须在同一时间段将其列入日历。例如,如果 agent0
和 agent1
参加会议 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 变量 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]));
}
}
我正在尝试解决会议安排问题。我定义了一个矩阵 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]
的索引。
为了在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 变量 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]));
}
}