программирование ограничений — невозможно получить доступ к переменным решения с помощью API C ++ для CP ILOG

Хорошо, я провел последние 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>];

Когда я запрашиваю структуру, все переменные интервального доступа, похоже, сбрасываются или что-то в этом роде. t_val.isPresent() Метод всегда возвращает false, в то время как время начала и окончания с небольшими исключениями установлено равным -2 (значения исключений равны 0, когда я запрашиваю время MinStart …). Хотя их размер (tval.getSizeMin/Max()) верно.

Я делаю что-то не так или это ошибка или что-то?

0

Решение

Похоже, вы получаете домен / значение переменных в модели, а не в CP-движке.
Я думаю, что вы должны использовать:
IloCP :: isPresent (IloIntervalVar x)
IloCP :: getStartMin (IloIntervalVar x)
и т.п.
Чтобы получить доступ к значениям решения

0

Другие решения

Других решений пока нет …