오늘은 GOAP에 대해 알아보겠습니다.
- 에이전트가 여러 가능한 행동중에서 주어진 목표를 달성하기 위해 어떤 순서로 무엇을 해야할까? 라는 경로 찾기입니다.
- FSM의 수많은 상태 전이를 일일이 정의하거나 행위 트리에 복잡한 조건을 달지 않고도 액션과 목표를 선언해두면 런타임에 플래너가 최적의 순서를 짜줍니다.
World State
- 키 - 값 쌍으로 이루어진 현재 세계의 상태 집합입니다.
집안일을 예시로들면 지금 집안이 어떤 상태인지 보여주는 리스트라고 생각하면 됩니다.
ex) 설거지가 안된 그릇 3개, 세탁이 필요한 옷, 바닥이 더러움
Goal State
- 에이전트가 바라는 최종 상태입니다.
위와 같이 예시를 들면 오늘 저녁까지 집을 깨끗하게 만들겠다 라는 바람입니다.
Action
- Preconditions : 실행 전 세계 상태에 반드시 만족해야 할 조건
- Effects : 실행 후 세계 상태에 적용될 변화
- Cost : 이 행동이 얼마나 비싼가를 수치화한 값
위와 같이 예시를 들면
Preconditions -> 세탁기 전원이 켜져있어야 세탁을 돌릴 수 있다.
Effects -> 설거지 -> 그릇 3개가 깨끗해진다.
Cost -> 손이 얼마나 많이 가는지, 시간이 얼마나 가는지를 정량화한 값입니다.
Planner
- 지금 상태와 원하는 목표를 보고 가능한 행동을 조합하여 가장 적은 노력으로 목표를 달성할 수 있는 순서를 계산해줍니다.
위와 같이 예시를 들면 설거지 -> 빨래 -> 마르는 동안 바닥 청소등에 순서입니다.
- 모듈성 & 재사용성
- 각 액션은 독립적인 모듈이며 새로운 행동 추가 및 삭제가 자유롭고 여러 에이전트 간에 공유가 가능합니다.
- 목표 중심 설계
- 액션이 아닌 목표 설계에 집중
- 유연한 대응
- 환경 변화에 따라 자동으로 재계획
- 최적화된 행동 순서
- 비용 기반 A* 탐색
- 복잡도 제어
- 대규모 FSM에서 파생되는 폭발하는 상태 전이 문제 해소
| 구분 | FSM | GOAP |
|---|---|---|
| 아이디어 | 지금 상태 -> 다음 상태로 어떻게 넘어갈까에 대한 내용을 미리 그려놓음 | 무슨 목표를 달성할까만 정해놓고 런타임에 자동으로 행동 순서를 찾음 |
| 설계 방식 | 모든 상태와 전이를 일일이 손으로 맵핑 | 상태나 전이를 사용하지 않고 행동을 선언만 하면 플래너가 조합해서 계획을 만듬 |
| 유연성 | 상태가 늘어나면 전이도 폭발적으로 늘어남 | 행동만 잘 정의해두면 새로운 목표나 행동 추가 시 코드 변경이 적음 |
| 유지보수성 | 상태별로 수십~수백개의 전이를 다루어야 할 수 있음 | 독립적인 행동 모듈을 관리하므로 하나 고치면 전체에 적용됨 |
| 동적대응 | 예외 상황마다 별도 분기 코드를 넣어야 함 | 환경 벽화나 실패가 생기면 플래너가 자동으로 재계획 |
| 예시 | 지하철 노선도 | GPS |

FSM말고 GOAP는 처음 접해보았습니다.
구현하면서 든 생각은 FSM보다 좀 더 유연하게 동작하고 여러 예외사항에도 플래너가 계획해주니 좋다는 생각이 들었습니다. 방치형 게임에 적용해보면 좋을 것 같다는 생각이 들었습니다.