如何在Minizinc中为函数创建等效项以简化谓词

时间:2017-05-12 20:00:28

标签: 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&lt;但是在目前的形式下,它占用了大量空间,很难遵循代码。我希望能够以下列方式重写代码:

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中表达上述代码的正确语法是什么? 谢谢!

1 个答案:

答案 0 :(得分:2)

这是使用函数的一个变体。我添加了一些初始值(对于“节点”和“T”)以便能够使用模型。

% 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 Tutorial,特别是有关谓词和函数的第4.3节。