Как создать эквивалент функции в Minizinc, чтобы упростить предикат

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

Например, у меня есть:

% INPUTS
int: nodes;
float: T;
%OUTPUT
array [1..nodes, 1..nodes] of var 0..1000: rates_matrix;

predicate column_summ(int: to_dc) =
sum(from_dc in 1..nodes) (rates_matrix[from_dc, to_dc]) * sum(from_dc in 1..nodes) (rates_matrix[from_dc, to_dc]) * 2 < T; 

constraint forall(n in 1..nodes) (column_summ(n));
solve satisfy;

Предикат column_summ просто вычисляет эквивалент функции f (x) 2x ^ 2 ‹T, но в его текущей форме он занимает много места, и его сложно отслеживать по коду. Я бы хотел переписать код следующим образом:

function f_polynomial(x) = 2*x*x;
function f_sum(y, m) = sum(from_dc in 1..nodes) (m[from_dc, y])

predicate column_summ(int: to_dc) =
    f_polynomial(f_sum(to_dc, rates_matrix)) < T;

Каков правильный синтаксис MiniZinc для выражения вышеуказанного кода? Спасибо!


person kirbo    schedule 12.05.2017    source источник


Ответы (1)


Вот один из вариантов использования функций. Я добавил несколько начальных значений (для «узлов» и «Т»), чтобы иметь возможность играть с моделью.

% INPUTS
int: nodes = 5; 
float: T = 100.0;
%OUTPUT
array [1..nodes, 1..nodes] of var 0..1000: rates_matrix;

function var int: f_polynomial(var int: x) = 2*x*x;
function var int: f_sum(var int: y, array[int,int] of var int: m) = sum(from_dc in 1..nodes) (m[from_dc, y]);

predicate column_summ(int: to_dc) = f_polynomial(f_sum(to_dc, rates_matrix)) < T;

constraint forall(n in 1..nodes) (column_summ(n));
solve satisfy;

Я рекомендую вам прочитать Руководство по MiniZinc, особенно раздел 4.3 о предикатах и функции.

person hakank    schedule 13.05.2017
comment
Я просматривал этот учебник, но не нашел примера определения классической функции в том виде, в котором вы его показали, это очень помогает! Спасибо! - person kirbo; 13.05.2017