Ограничение решателя Choco / определение переменной

Я пытаюсь портировать миницинк модель в Choco. Я знаю, как определять переменные и другие базовые вещи, но, несмотря на то, что я прочитал учебник и некоторые примеры кода, у меня возникли проблемы с определением некоторых нетривиальных ограничений. Может ли кто-нибудь дать мне несколько советов, как перевести следующий код (только z) в стиль решателя чоко?

array[1..n,1..n] of int: c;
array[1..n] of var 0..10: next;

var 0..sum(c): z = sum(i in 1..n)(c[i,next[i]]);

Спасибо!

1 ответ

Решение

Я полагаю, что вы знаете, как разместить ограничение суммы, чтобы нетривиальная часть находилась в c[i,next[i]], который получает целое число в матрице c в строке i и столбце next[i]. Проблема в том, что next [i] является переменной, поэтому вы не можете использовать ее напрямую для доступа к массиву (Java).

Вам нужно использовать ограничение элемента (это также в минизинке):

/**
 * Creates an element constraint: value = table[index]
 *
 * @param value an integer variable taking its value in table
 * @param table an array of integer values
 * @param index an integer variable representing the value of value in table
 */
default Constraint element(IntVar value, int[] table, IntVar index)

Когда вы работаете с матрицей, вы должны сделать это для каждой строки, а затем разместить на них сумму.

Также обратите внимание, что в Java доступ к ячейкам массива составляет от 0 до n-1 (в мини-цинке - от 1 до n), поэтому вам может потребоваться соответственно обновить модель или использовать смещение.

Надеюсь это поможет

https://www.cosling.com/

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