2

我对约束编程很陌生,我正在学习 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 中表达上述代码的正确语法是什么?谢谢!

4

1 回答 1

3

这是使用函数的一种变体。我添加了一些初始值(用于“节点”和“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 教程,尤其是关于谓词和函数的 4.3 节。

于 2017-05-13T07:13:58.240 回答