0

好的,我花了最后 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()) 是正确的。

我做错了什么还是这是一个错误或什么?

4

1 回答 1

0

您似乎获得了模型中变量的域/值,而不是 CP 引擎中的变量。我认为您应该使用: IloCP::isPresent(IloIntervalVar x) IloCP::getStartMin(IloIntervalVar x) 等来访问解决方案值

于 2018-06-18T12:40:23.580 回答