1
8 퍼즐의 맨하탄 거리를 사용하여 A 성급 알고리즘을 구현 중입니다. A.에 B로 갈수록 동일한 단계 번호를 가지고 있지 않습니다 A에서 B로 가고, 일부 경우경로 찾기 : A에서 B까지의 길이가 A에서 B가 아닌
1 2 3
8 0 4
7 6 5
[용액 나선 형태]
I는 않기 때문이라고 생각 동일한 비용을 가지고 동일한 노드를 확장하지 않을 때 열려있는 목록에서 동일한 상태를 선택하지 마십시오. 둘은 맨해튼 거리를 이용하여 동일한 값을 가질
7 6 4
1 0 8
2 3 5
(A -> B)
7 6 4
1 8 0
2 3 5
(B -> A)
7 6 4
1 3 8
2 0 5
가입일
. 같은 값으로 모든 경로를 탐색해야합니까? 또는 휴리스틱을 변경하여 일종의 타이 브레이커를 사용해야합니까?
여기에 너무 많은 시간 나는 마침내 문제를 발견, 아무것도, 을 내 "해결"기능을 여러 가지 방법을 재 작성을 낭비 후 코드
def solve(self):
cost = 0
priority = 0
self.parents[str(self.start)] = (None, 0, 0)
open = p.pr() #priority queue
open.add(0, self.start, cost)
while open:
current = open.get()
if current == self.goal:
return self.print_solution(current)
parent = self.parents[str(current)]
cost = self.parents[str(current)][2] + 1
for new_state in self.get_next_states(current):
if str(new_state[0]) not in self.parents or cost < self.parents[str(new_state[0])][2]:
priority = self.f(new_state) + cost
open.add(priority, new_state[0], cost)
self.parents[str(new_state[0])] = (current, priority, cost)
더 유닛 테스트를 수행하는 나에게 가르 칠 것 당신의 예에서'A -> B'와'B -> A '가 무슨 의미인지 이해하지 못합니다. 목표에서 '보낸 사람'위치로 검색을 실행하고 있습니까? 다른 다이어그램은 이러한 검색과 어떤 관련이 있습니까? 분명히 A * 코드에 문제가있는 것을 보지 못했지만, 완전히 자체적으로 포함되지 않았기 때문에 실제로 미묘한 버그가 있는지보기 위해 실행할 수는 없습니다. 휴리스틱과의 관계는 여전히 받아 들일 수있는 한 문제가되어서는 안됩니다 (https://en.wikipedia.org/wiki/Admissible_heuristic). 솔루션이 여러 개인 경우 찾을 수는 있지만 모두 같은 길이입니다. – Blckknght
@Blckknght, 네, 그렇습니다. 목표에서부터 "출발"위치까지 내가 보여주었습니다. 그래서 맨하탄 거리가 허용 될 수 있고 넥스 코드를 잘못 처리했기 때문에 넥타이를 관리 할 방법을 찾을 필요가 없습니까? 코드를 정리하고 프로젝트의 github 링크를 게시합니다. – Sequoya
나는 manhattan 거리 대신 f = 0을 시도했으며, 현재 == self.goal 인 경우 을 제거하려고 시도했습니다. self.print_solution (현재) 을 반환하면 가능한 모든 해결책을 갖게됩니다. 둘 다 변경되지 않습니다. 이 문제는 질문에 게시 된 기능에 있다고 생각합니다. 아마도 self.parent에 있습니다. 전체 코드는 다음과 같습니다. https://github.com/Sequoya42/automatic-waddle – Sequoya