2017-01-13 4 views
0

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.lpich 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 
+0

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

Antwort

0

Versuchen Sie folgendes:

% instance 
weight("ant",3). weight("bat",53). weight("cat",19). weight("dot",13). weight("eel",29). 


% Assuming you will get certain selected objects like this: 
selected("cat"). selected("bat"). selected("eel"). %this will be python generated 

% encoding 
selectedWeight(OBJ, XX):- weight(OBJ,XX), selected(OBJ). 
1{min_sel_weight(X)}1 :- selectedWeight(_,X), #min {XX : selectedWeight(OBJ,XX),selected(OBJ)} = X. 

#show min_sel_weight/1. 

Ausgang:

enter image description here

hoffe, das hilft!