2016-02-23 3 views
0

[Я пользуюсь Choco 3.3.3]Choco abs IntVar не работает

У меня есть 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] = с;), то результат при печати из значений г в [0, -1, 0, -1, 0, 0], но я нужен Absolut в том, что, так [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] ...

+0

Вы решили это? – dabadaba

ответ

0

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

Jean-Guillaume, https://www.cosling.com/

+0

При добавлении -ea я получаю AssertionError с большим количеством «FAILURE >> ....», но я не знаю, в чем проблема. Я определенно вызываю solver.findOptimalSolution перед запросом значений переменных. Мое подозрение в том, что, поскольку в моем примере есть IntVar [], где только несколько записей имеют ограничения. Я думал, что если запись в массиве не имеет ограничения, нижняя граница просто используется. Я не понимаю, как я могу это изменить. К сожалению, я не могу показать свой полный код публично, и я не понял пример, который создает ту же проблему. – Dora

+0

В другой точке моего кода у меня такая же проблема. У меня есть IntVar [], и только первые несколько записей имеют ограничение, в зависимости от назначения других переменных. Когда я делаю сумму этого массива, я получаю полностью случайные решения и с -ea получаю AssertionError – Dora

+0

Можете ли вы заменить findOptimalSolution на findSolution, чтобы убедиться, что он работает? –

Смежные вопросы