Choco abs из IntVar не работает

[Я использую Choco 3.3.3]

У меня есть IntVar a и int b. Я хочу сохранить разницу в массиве IntVar[] d. Я сделал это в другом месте кода точно таким же образом, и он работал без проблем, но здесь я просто не заставляю его работать.

d = VF.boundedArray("d", num_ts, -20, 20, solver);
for(int t=0; t < num_ts; t++){
    IntVar a = VF.bounded("a", 0, 10, solver);
    solver.post(ICF.sum(aa[t], a)); //values are [2,2,2,1,2,2]
    int b = bb[t][j]; //values are [2,3,2,2,2,2]
    IntVar c = VF.offset(a, -b);
    ...//see below
}

Когда я просто использую c (d[t] = c;), результат при распечатке значений d будет [0, -1, 0, -1, 0, 0], но мне нужен абсолют, так что [0,1,0,1,0,0]

Это разные вещи, которые я пробовал, и результаты d:

d[t] = VF.abs(c); //result [0,0,0,0,0,0]
solver.post(ICF.times(c, -1, d[t])); //result [-7,-6,-7,-7,-7,-7]
solver.post(ICF.sum(new IntVar[]{VF.minus(a), VF.fixed(b, solver)}, d[t])); //result [-7,-6,-7,-7,-7,-7]
solver.post(ICF.arithm(a, "+", d[t], "=", b)); //result [-7,-6,-7,-7,-7,-7]
solver.post(ICF.distance(VF.fixed(b, solver), a, "=", d[t])); //result [-20, -20, -20, -20, -20, -20]

Может кто-нибудь сказать мне, что я делаю не так? Я особенно озадачен тем, откуда берутся [-7,-6,-7,-7,-7,-7]...

1 ответ

Я не уверен, что понял, что вы хотите сделать и что вы действительно пытались, но я предполагаю, что вы не "решили" модель (или, по крайней мере, вы не распространяли ограничения). Как показано в javadoc, variable.getValue() возвращает LOWER BOUND, если переменная не была создана (она выдает исключение при передаче -ea аргументам JVM). Поэтому добавьте -ea, убедитесь, что вы вызываете solver.findSolution(), прежде чем запрашивать значение переменной и посмотрите, работает ли она. Если нет, отправьте исполняемый код, чтобы мы могли воспроизвести проблему. Это решило вашу проблему?

Жан-Гийом, https://www.cosling.com/

Другие вопросы по тегам