Контрастный шоколад

Я использую choco API для решения проблемы. Что мне нужно, так это закодировать ограничение, которое делает сумму всех моих переменных равной 1. Этот код поддерживает сумму строк, равную 1:

IntegerVariable[][] rows;
int n; //number of rows
for(int i=0; i<n; i++)
model.addConstraint(eq(sum(rows[i], 1));

Но мне нужно запрограммировать код, который удерживает сумму всех моих элементов матрицы (сумму строк) равной 1, а не сумму каждой строки = 1.


person HiddenDroid    schedule 28.12.2014    source источник


Ответы (1)


Если я вас правильно понимаю, вы хотите, чтобы суммы полной матрицы были равны 1.

Затем вы можете использовать ArrayList («все»), чтобы собрать все IntegerVariables в один список, а затем добавить ограничение ко «всем». Ваш пример не завершен, например. количество столбцов, поэтому я предполагаю, что столбцов n и что это матрица 0/1. Вот пример:

// ...
ArrayList<IntegerVariable> all = new ArrayList<IntegerVariable>();
int n = 5; // number of rows and columns
IntegerVariable[][] rows = new IntegerVariable[n][n];
for(int i = 0; i < n; i++) {
  for(int j = 0; j < n; j++) {
    rows[i][j] = makeIntVar("rows["+i+","+j+"]", 0, 1);
    all.add(rows[i][j]);
  }
}
// convert ArrayList all to an array
model.addConstraint(eq(sum(all.toArray(new IntegerVariable[1])),1));
// ...
person hakank    schedule 29.12.2014
comment
откуда взялась сумма метода? Я не могу найти импорт для него. - person James Watkins; 31.05.2015