2014-11-02 2 views
0

첫 번째 질문에 죄송합니다. 새 코드입니다 ... 코드를 정리했습니다. 문제는 : 경로와 장애물이있는 사각형 격자가 있습니다. 나는 한 점에서 다른 점까지 최단 경로를 찾고 싶다. 이것은 인공 지능의 일부입니다. 경로가 너무 크면 bash에서 전체 점 목록을 볼 수 없지만 게임에서이 경로를 여행하는 캐릭터는 최단 경로에 있지 않습니다. 그래서, 내 질문은, 어떻게 최단 경로를 해결하기 위해이 코드를 변경할 수 있습니다. 정말 고맙습니다!프롤로그를 사용하여 그리드의 최단 경로

mov(X1,Y1,X2,Y2):- 
    pos(X1,Y1), X2 is X1 , Y2 is Y1+1 ,pos(X2,Y2). 
mov(X1,Y1,X2,Y2):- 
    pos(X1,Y1), X2 is X1 , Y2 is Y1-1 ,pos(X2,Y2). 
mov(X1,Y1,X2,Y2):- 
    pos(X1,Y1), X2 is X1+1 , Y2 is Y1 , pos(X2,Y2). 
mov(X1,Y1,X2,Y2):- 
    pos(X1,Y1), X2 is X1 -1 , Y2 is Y1 , pos(X2,Y2). 

path(X1,Y1,X2,Y2,Path) :- 
    travel(pos(X1,Y1),pos(X2,Y2),[pos(X1,Y1)],Q), 
    reverse(Q,Path). 

travel(pos(X1,Y1),pos(X2,Y2),P,[pos(X2,Y2)|P]) :- 
    mov(X1,Y1,X2,Y2). 
travel(pos(X1,Y1),pos(X2,Y2),Visited,Path) :- 
    mov(X1,Y1,X,Y), 
    pos(X,Y) \== pos(X2,Y2), 
    \+member(pos(X,Y),Visited), 
    travel(pos(X,Y),pos(X2,Y2),[pos(X,Y)|Visited],Path). 
+1

당신이 그 엉망을 디버그하고 싶지 않다고 생각한다면, 우리가 어떻게 느끼는지 상상해보십시오. –

+0

더 설명해야합니다. 무엇을 입력 했습니까? 어떤 반응을 기대 했습니까? 오류 메시지가 있다면 나타 났습니까? – lurker

+0

'pos/2'는 다른 모든 부분에서 단지 술어가 아닌 functor를 의미하기 때문에'move/4'에서'pos/2'에 대한 모든 목표를 제거 할 수 있습니다. – false

답변

1

처음 몇 가지 Prolog 조언.

  1. 은 내장되어 있으므로 정의 할 필요가 없습니다.
  2. ISO 부정 부호가 \+이고 not/1이 아닙니다.
  3. 성능을 위해 memberchk/2member/2입니다.
  4. 코드에 foo(X,Y) :- X == Y, ...이 많이 있습니다. foo(X,X)이라고 말하면서 선택 점이나 어떤 것을 피하기 위해 조건식을 사용하지 않는 한 자신에게 명백한 테스트를하는 번거 로움을 덜어주는 것이 훨씬 낫습니다.
  5. 이 코드에는 많은 상처가 있습니다. 커트와 버그는 커다란 친구가되는 경향이 있습니다. 왜냐하면 커팅은 실행되지 못하도록 합리적으로 보이는 코드를 손상시킬 수 있기 때문입니다.

이 문제를 해결해야한다면 최단 경로 로직과 그리드 트래버 설 로직을 분리해야합니다. 이것을 디버그 할 수는 없으며 수정할 수없는 읽을 수없는 코드 블록 중 하나 일 것입니다. 경로 탐색 논리에 순회 논리를 포함하기 때문에 용어가 폭발적으로 증가한 것은 분명합니다. 두 단계로 나누어 보면 의미있게 테스트하고 디버그 할 수있는 작은 조각을 얻을 수 있습니다. 언어에 관계없이 프로그래밍을 통해 좋은 삶의 방식입니다. 그리드 구조를 변경하거나 길 찾기를 더 지능적으로 또는 복잡하게해야한다면 어떻게 할 것입니까? 조각을 세밀하게 유지하면 항상 변경 관리에 도움이됩니다.

S.O. 에티켓이 아니라면 좋지 않습니다. 작동하지 않는 부분과 시도한 부분에 대해 이야기하고 minimum, complete, verifiable example을 제공해야합니다. 나는 당신이 아마 문제를 스스로 해결할 것이라고 생각합니다.

+0

다니엘 감사합니다. 더 나은 코드를 작성하려고 노력할 것입니다. – marciomolusco