Minizinc для индекса цикла

Я пытаюсь создать функцию MiniZinc, которая возвращает значение индекса текущей посещенной строки в матрице, но я не могу понять, как это сделать, я новичок в MiniZinc, поэтому код может содержать некоторые ошибки.

Код будет таким:

function int: to_Index(array[totVert][4] of int: matrix, int: pid, int: vert, set of int: TOT_VERT) = 
forall(int: i in TOT_VERT) 
   (if matrix[i][0] == pid /\ matrix[i][1] == vert then 
    % here I would return the current value of i);

person muxmealux    schedule 13.01.2020    source источник


Ответы (1)


Вот версия, которая может работать, в зависимости от того, как структурированы данные. Главный совет - использовать exists вместо forall, поскольку вы ищете значение. Обратите внимание, что это полностью непроверено, так как тестовых данных нет.

function var int: to_index(array[int,int] of int:matrix, int:pid, int:vert, set of int: TOT_VERT) =
  let {
      var TOT_VERT: ix;
      constraint
      exists(i in TOT_VERT) (
               if matrix[i,0] = pid /\ matrix[i,1] = vert  then
                  ix = i
               endif
            );
     } in ix
;

Примечание: я также исправил синтаксис для matrix.

person hakank    schedule 13.01.2020