2017-01-13 7 views
0

У меня возникла основная проблема при использовании сценариев python в ASP/`clingo (версия 4+). Я проиллюстрировал проблему с минимальным примером, чтобы проиллюстрировать эту точку. Очевидно, что в этом примере мне не нужно использовать скрипты. В моем более сложном приложении, однако, я делаю, откуда я искусственно воссоздал проблему, более понятным образом.компилятор clingo, вычисляющий несколько значений для #min

Проблема заключается в том, что при вызове агрегата/оптимизации компилятор каким-то образом не регистрирует весь полный предикат, используемый для индексации значений. Вместо этого он, кажется, последовательно вычисляет минимум и, как результат, выплескивает все значения на этом пути. (См. Выход ниже: обратите внимание на то, что минимальное значение составляет от 59 до 19, а затем не изменяется на 29. Это очень чувствительно к порядку prg.ground звонков в части кода #script (python).)

Это очень нежелательно, и я хотел бы знать, как избежать этой проблемы. I. e., , как я могу изменить приведенный ниже код, все еще используя скрипт python (потенциально модифицированный), чтобы вычислить правильную модель. (В примере, очевидно, решение предиката min_sel_weight/1 является min_sel_weight(19) без дополнительных значений

Программа

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. 

Вызовclingo 0 myprogramme.lpя получаем следующий результат:..

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

Примечание: аналогичные проблемы возникают с '# max' и' # sum'. Каким бы ни было решение (если оно существует), оно должно быть адаптировано к ситуации, в которой эти другие агрегаты вычисляются. – Thomas

ответ

0

Попробуйте это:

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

Выход:

enter image description here

Надеется, что это помогает!