Ich habe ein grundlegendes Problem bei der Verwendung von Python-Skripts in ASP/`Clingo (Version 4+). Ich habe das Problem mit einem minimalen Beispiel rekonstruiert, um den Punkt zu verdeutlichen. Offensichtlich muss ich in diesem Beispiel keine Skripts verwenden. In meiner komplizierteren Anwendung jedoch tue ich, woher ich das Problem künstlich rekonstruiert habe, in einer verständlicheren Weise.Clingo Compiler Berechnung mehrerer Werte für #min
Das Problem ist, dass beim Aufruf einer Aggregat/Optimierung, der Compiler irgendwie nicht registriert die gesamte Prädikat wird verwendet, um die Werte zu indizieren. Stattdessen scheint es das Minimum sukzessive zu berechnen und spuckt daher alle Werte auf dem Weg aus. (Siehe die Ausgabe unten: Beachten Sie, dass das Minimum von 59, bis 19, dann ändert sich nicht auf 29. Dies ist sehr empfindlich für die Reihenfolge der prg.ground
Anrufe im #script (python)
Teil des Codes.)
Dies ist sehr hoch unerwünscht, und ich würde gerne wissen, wie man dieses Problem vermeidet. I. e., Wie kann ich den untenstehenden Code noch unter Verwendung eines Python-Skripts (möglicherweise modifiziert) ändern, so dass das korrekte Modell berechnet wird. (Im Beispiel offensichtlich, die Lösung für das Prädikat min_sel_weight/1
ist min_sel_weight(19)
ohne weitere Werte
Das Programm
weight("ant",3). weight("bat",53). weight("cat",19). weight("dot",13). weight("eel",29).
#script (python)
import gringo;
def main(prg):
prg.ground([('base', [])]);
prg.ground([('sel', ['bat'])]);
prg.ground([('sel', ['cat'])]);
prg.ground([('sel', ['eel'])]);
prg.solve();
#end.
%% call python-script, to select certain objects.
#program sel(t). sel(t).
%% compute minimum of weights of selected objects:
min_sel_weight(X) :- weight(_,X), #min {XX : weight(OBJ,XX),sel(OBJ)} = X.
#show sel/1. #show min_sel_weight/1.
Aufrufclingo 0 myprogramme.lp
ich die folgende Ausgabe erhalten:..
clingo version 4.5.4 Reading from myprogramme.lp Solving... Answer: 1 sel("bat") min_sel_weight(53) sel("cat") min_sel_weight(19) sel("eel") SATISFIABLE Models : 1 Calls : 1 Time : 0.096s (Solving: 0.00s 1st Model: 0.00s Unsat: 0.00s) CPU Time : 0.040s
Hinweis: Ähnliche Probleme treten bei '# max' und' # sum' auf. Was auch immer die Lösung ist (wenn es eine gibt), muss sie an die Situation angepasst werden können, in der diese anderen Aggregate berechnet werden. – Thomas