2017-01-13 6 views
0

ASP /`clingo (Version 4+)에서 python 스크립팅을 사용하는 동안 기본적인 문제가 있습니다. 나는 포인트를 설명하기 위해 최소한의 예제로 문제를 재구성했다. 분명히이 예에서는 스크립트를 사용할 필요가 없습니다. 그러나 더 복잡한 애플리케이션에서는 문제를 인위적으로 재현하여보다 이해하기 쉬운 방식으로 재현합니다.clingo 컴파일러가 #min에 대해 여러 값을 계산하는 중

집계/최적화를 호출하는 동안 컴파일러는 어떻게 든 값을 인덱싱하는 데 사용되는 모든 전체 조건자를 등록하지 않습니다. 대신에 최소값을 연속적으로 계산하는 것으로 보이므로 결과적으로 모든 값을 뱉어냅니다. 아래 출력을 참조하십시오. 최소값이 59에서 19로 변경되고 29로 변경되지 않음을 확인하십시오.이 코드의 #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 I는 다음과 같은 출력 구 :..

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

희망!