알고리즘/Path Finding
SMA* 알고리즘 - 메모리를 고려한 A* 알고리즘의 변형이 또 있네요!
Jㅐ둥이
2023. 4. 14. 07:53
반응형
안녕하세요. 오늘은 A* 알고리즘의 변형인 Simplified Memory bounded A*(SMA*) 알고리즘을 공부해보려고 해요!
- Stuart Russell. 1992. Efficient memory-bounded search methods. In Proceedings of the 10th European conference on Artificial intelligence (ECAI '92). John Wiley & Sons, Inc., USA, 1–5.
메모리 사용량을 고려했다는 점에서 이전에 공부했던 RBSF 알고리즘과 비슷하다고 볼 수 있을 것 같습니다.
한번 자세히 알아볼까요?
1. SMA* 알고리즘과 A* 알고리즘의 차이점
Simplified Memory Bounded A* 알고리즘이 메모리 문제를 해결했다고 하는데 어떻게 해결했을까요?
정답은 바로 OPEN 리스트의 크기를 제한하는 것입니다.
노드를 탐색하다가 OPEN 리스트가 사용자가 정한 크기보다 커지면 가장 오래되고, f-value가 큰 노드를 삭제하는 것입니다.
"OPEN 리스트에서 노드를 삭제하면 최적성을 보장하지 못하는 거 아니야?"
이 생각이 떠오를텐데요. 아주 좋은 질문입니다!
SMA*를 구체적으로 설명하면서 궁금증을 해소시켜드리겠습니다.
2. SMA* 알고리즘 동작 방식
탐색 알고리즘
- OPEN 리스트의 최대 크기 B를 설정합니다.
- 시작 노드 s를 OPEN에 추가하고 USED 변수에 1을 저장합니다.
- OPEN에서 f ` 값이 가장 작은 노드 n을 추출합니다.
- f ` 값이 최소인 노드들이 있다면 랜덤하게 아무 노드나 선택합니다.
- 하지만 G에 포함된 노드가 있다면 해당 노드를 먼저 고릅니다.
- 만약 OPEN이 비어있다면 탐색에 실패한 것입니다.
- Connected(n)에서 탐색되지 않은 노드 c를 하나씩 가져옵니다.
- g(c)+h`(c) 값을 계산하고, f`(n)과 비교하여 더 큰 값을 f`(c)에 저장합니다.
- 만약 Connected(n)의 노드들을 모두 탐색했다면 노드 n에 대해서 백업 알고리즘을 실행합니다.
- 만약 Connected(n)의 모든 노드들이 OPEN에 포함되어 있다면 노드 n을 OPEN에서 제거합니다.
- USED 변수에 1을 더합니다.
- 만약 USED가 B보다 클 경우, OPEN에서 가장 오래되고 f` 값이 큰 노드 d를 삭제합니다.
- 노드 d의 부모 노드가 있다면 부모 노드의 Connected에서 d를 제거합니다.
- 만약 f`(d)가 d의 부모 노드의 f`값보다 작다면 부모 노드의 f` 값을 f`(d)로 수정하고, 해당 부모 노드를 OPEN 리스트에 추가합니다.
- USED 변수에서 1을 뺍니다.
- 노드 c를 OPEN에 추가합니다.
- 3으로 돌아갑니다.
백업 알고리즘
- Connected(n)의 노드가 전부 탐색되지 않았거나, 노드 n의 부모 노드가 있지 않으면 백업 알고리즘을 종료합니다.
- f`(n)의 값을 Connected(n)들의 f`값 중 가장 작은 값으로 저장합니다.
- 만약 f`(n) 값이 변경되었다면 노드 n의 부모 노드에 대해서 백업 알고리즘을 실행합니다.
SMA* 알고리즘은 어떠셨나요?
알고리즘의 동작 방식 중 메모리가 꽉 찼을 때의 설명 쪽이 이해가 어려운 부분이 있어서 예제 코드 준비가 막히더라고요 ㅜ
준비되면 다시 업로드하도록 하겠습니다...!
이 알고리즘도 RBSF 알고리즘을 찾았던 PEA* 알고리즘 논문에서 찾게 되어 또 공부하게 되었습니다.
그런데 SMA* 알고리즘을 소개하는 논문에 다른 알고리즘들도 많더라고요...!
왜 논문을 읽으면 공부할 거리가 계속 생기는 걸까요?ㅎㅎㅎ...
논문 한편 읽기가 쉬운 일이 아닌 것 같습니다 ㅋㅋㅋㅋ
반응형