A* 알고리즘을 구현해 보았다. 전체 코드는 Github 에 업로드 되어있다.
def calc_path(self): start = self.grid.start start.mindistance = 0.0 start.h_value = self.heuristic(start) openset = [start] closedset = set() while openset: u = heapq.heappop(openset) closedset.add(u) if u == self.grid.goal: break for target in self.get_neighbors(u): g = 1.0 + u.mindistance h = self.heuristic(target) f = g + h if not target.is_obs: if target.isopen or target in closedset: if target.mindistance > g: target.h_value = f target.mindistance = g target.previous = u else: target.isopen = True target.h_value = f target.mindistance = g target.previous = u heapq.heappush(openset, target) self.build_path()
target이 openset에 들어있는지 확인하는 것 때문에 몇 시간을 허비했다;
priority queue에서 target을 검색하면 log(n) 시간이 걸리기 때문에 n이 커지면 dijkstra 알고리즘보다 비 효율적이게 되었다.
그래서 한참을 고민했는데, 그냥 노드에 openset에 들어있는지를 표시하는 플래그를 다는 것으로 해결...
'Programming > Python' 카테고리의 다른 글
pygame 설치 (0) | 2013.05.02 |
---|---|
날씨 가져오는 스크립트의 수정 (1) | 2013.04.18 |
날씨 가져오는 스크립트 (0) | 2013.04.17 |
쉬워 보이는 언어 Python (0) | 2011.12.27 |
점프 투 파이썬(Jump to Python) (0) | 2011.12.20 |