好的,我花了最后 2 个小时试图完成这项工作,但我已经没有想法了。
我开发了一个 OPL 模型,就像 ILOG 附带的示例一样。我正在做的是我通过 C++ 接口程序加载数据集 + 模型,我最终想要的是对解决方案进行后处理,将其保存到文件中,并将其发送给其他求解器等。
该模型工作得很好,使用opl.printSolution()
. 但是,当我尝试手动访问数据结构时,似乎信息丢失了,我不知道为什么。
我感兴趣的变量在模型中定义如下:
tuple Mode {
int opId;
int mch;
int pt;
};
{Mode} Modes = ...;
dvar interval modes[md in Modes] optional size md.pt;
成功返回后,cp.solve()
我尝试使用以下代码解析数据:
IloIntervalVarMap modes = opl.getElement("modes").asIntervalVarMap();
IloTupleSet Modes = opl.getElement("Modes").asTupleSet();
int index = 0;
for (IloTupleIterator iter(Modes); iter.ok(); ++iter){
IloTuple t = *iter;
printf("Tuple Values [%d,%d,%d]\n",
(int) t.getIntValue((IloInt) 0),
(int) t.getIntValue((IloInt) 1),
(int) t.getIntValue((IloInt) 2));
//Fetch the mode in solution to find out what is its deal
int t_uid = (int) t.getIndex();
IloIntervalVar t_val = modes.get(t);
float t_start = (float) t_val.getStartMin();
float t_end = (float) t_val.getEndMin();
bool t_present = (bool) t_val.isPresent();
float t_size = (float) t_val.getSizeMin();
printf("\t Map Values %f %f %f \n", t_start, t_end, t_size);
if (t_val.isPresent()){
printf("Found Present Mode - Index %d\n", t_uid);
}
}
当我使用 打印解决方案opl.printSolution()
时,modes
如下所示:
modes = [<0 0 0 0> <1 0 123 123> <0 0 0 0> <1 123 253 130>
<0 0 0 0> <0 0 0 0> <1 581 731 150>
<0 0 0 0> <0 0 0 0> <0 0 0 0> <1 253 398 145>
<1 174 388 214> <0 0 0 0> <1 398 464 66>
<0 0 0 0> <0 0 0 0> <1 481 576 95>
<0 0 0 0> <1 500 620 120> <0 0 0 0>
<1 87 174 87> <0 0 0 0> <0 0 0 0> <1 245 350 105>
<0 0 0 0> <0 0 0 0> <1 260 360 100>
<0 0 0 0> <0 0 0 0> <1 398 563 165>
<1 0 87 87> <0 0 0 0> <0 0 0 0> <1 87 260 173>
<1 350 495 145> <0 0 0 0> <0 0 0 0>
<1 87 257 170> <1 388 516 128> <0 0 0 0>
<0 0 0 0> <1 516 581 65> <0 0 0 0>
<0 0 0 0> <1 581 681 100> <0 0 0 0>
<0 0 0 0> <0 0 0 0> <1 581 746 165>
<1 253 398 145> <0 0 0 0> <0 0 0 0>
<1 475 598 123> <0 0 0 0> <0 0 0 0>
<1 620 740 120> <0 0 0 0> <0 0 0 0>
<0 0 0 0> <1 701 751 50> <0 0 0 0>
<1 0 145 145> <1 598 722 124> <0 0 0 0>
<0 0 0 0> <0 0 0 0> <1 145 323 178>
<1 360 500 140> <0 0 0 0> <0 0 0 0>
<1 0 245 245> <0 0 0 0> <1 257 481 224>
<0 0 0 0> <0 0 0 0> <1 323 501 178>
<1 551 701 150> <0 0 0 0> <0 0 0 0>
<1 145 295 150> <1 295 475 180> <0 0 0 0>
<0 0 0 0> <1 501 551 50> <1 576 726 150>
<0 0 0 0>];
但是,当我查询结构时,访问的所有 intervalvar 变量似乎都被重置了。t_val.isPresent()
方法总是返回 false,而开始和结束时间设置为 -2 的小异常(当我查询 MinStart 时间时异常值为 0...)。它们的大小虽然 ( tval.getSizeMin/Max()
) 是正确的。
我做错了什么还是这是一个错误或什么?