2017-05-12 2 views
0

Ich bin sehr neu in der Constraint-Programmierung und lerne MiniZinc. ich große Prädikate haben, und ich möchte ein Äquivalent einer Funktion (in einer klassischen Programmiersprache) erstellen, die PrädikateWie man ein Äquivalent für eine Funktion in Minizinc erstellt, um ein Prädikat zu vereinfachen

Zum Beispiel zu vereinfachen, habe ich:

% 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; 

Das column_summ Prädikat einfach ein berechnet Äquivalent einer Funktion f (x) 2x^2 < T aber in seiner aktuellen Form braucht es viel Platz und es ist schwer dem Code zu folgen. Ich mag den Code in der folgenden Art und Weise in die Lage sein zu umschreiben:

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; 

Was ist die korrekte Syntax in MiniZinc den obigen Code zum Ausdruck bringen? Danke!

Antwort

1

Hier ist eine Variante mit Funktionen. Ich habe einige Anfangswerte hinzugefügt (für "Knoten" und "T"), um mit dem Modell spielen zu können.

% 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; 

Ich empfehle, dass Sie die MiniZinc Tutorial, insbesondere den Abschnitt 4.3 über Prädikate und Funktionen lesen.

+0

Ich habe dieses Tutorial durchgesehen, aber habe kein Beispiel für die "klassische" Funktionsdefinition in der Art gefunden, wie Sie es gezeigt haben, das hilft sehr! Vielen Dank! – kirbo

Verwandte Themen