2017-05-03 3 views
2

Das Folgende ist die Einschränkung I in MiniZinc umzusetzen versucht`alldifferent` Verfahren in MiniZinc

constraint forall (t in trucks) (all_different(c in customers where sequence[t,c] !=0) (sequence[t,c]));

das heißt, ich jedes Zeilenelement für die sequence Matrix verschieden sein können, soll, wenn der Wert sequence doesn‘ t gleich 0

und bekam den Fehler

MiniZinc: type error: no function or predicate with this signature found: all_different(array[int] of var opt int)'.

Wie von einigen anderen Threads angezeigt, habe ich hinzugefügt include "alldifferent.mzn"; Befehl, zeigt immer noch diesen Fehler.

Dies ist Teil der Zuweisung, Entschuldigung für nicht in der Lage, alle meinen Code hier zu schieben, lassen Sie mich bitte wissen, ob es zusätzliche Informationen benötigt.

Antwort

3

Um klar zu verstehen, was Sie tun, Sie Ihren Ausdruck in einer anderen Art und Weise schreiben:

all_different([sequence[t,c] | c in customers where sequence[c,t] != 0]) 

Beachten Sie, dass diese verwendet Comprehensions Array. Diese sind großartig, um eine Menge Dinge auszudrücken, aber wenn sequence ein Array von Variablen ist, dann ist die Anzahl der Variablen in diesem Verständnis unbekannt. Dies ist ein großes Problem für viele Löser. Und wird daher von vielen nicht unterstützt. Es ist zumindest unmöglich mit dem all_different Prädikat.

Ihr Problem ist jedoch ein bekanntes, daher ist ein anderes Prädikat verfügbar. Sie können dieselbe Bedingung wie folgt ausdrücken:

for(t in trucks) (
    alldifferent_except_0([sequence[c,t] | c in customers]) 
)