본문으로 건너뛰기

버그 제보

이상한 점을 알려 주시면 고칠게요. 지금 보고 있는 페이지와 브라우저 정보가 함께 담겨요.

페이지:

AI & Data

비헤이비어 트리

작성 2026. 10. 21.추가
목차8개 항목
출처와 참고

LINE Engineering 블로그의 「Behavior Tree를 알아봅시다」를 바탕으로 재구성한 노트다.

비헤이비어 트리란

비헤이비어 트리(Behavior Tree, BT)는 에이전트가 지금 무엇을 할지 고르는 결정 구조를 트리로 표현한 것이다. 게임 NPC의 AI에서 시작해 로봇 제어, 대화 시스템으로 퍼졌다.

트리는 주기적으로 틱(tick) 을 받는다. 틱이 오면 루트부터 깊이 우선으로 자식을 평가하고, 각 노드는 결과를 부모에게 돌려준다. 게임에서는 프레임 업데이트마다, 대화 시스템에서는 발화 한 번마다 틱을 주는 것이 보통이다.

반환 상태

상태의미
Success맡은 일을 끝냈다
Failure할 수 없거나 실패했다
Running아직 진행 중이다. 다음 틱에 이 노드를 다시 평가해 이어 간다

Running이 있어서 여러 틱에 걸친 행동(문까지 걸어가기, 애니메이션 재생)을 한 노드로 표현할 수 있다. 오래 Running인 노드를 끊을 장치(타임아웃, 인터럽트)가 없으면 트리가 한 행동에 붙잡힌다.

노드의 종류

flowchart TB
  Sel["[Selector]<br/>하나라도 성공하면 성공"] --> Seq["[Sequence]<br/>모두 성공해야 성공"]
  Sel --> Patrol["[Action: 순찰]<br/>앞 가지가 실패하면 순찰"]
  Seq --> Cond["[Cond: 적 보임?]"]
  Seq --> Attack["[Action: 공격]"]
분류노드동작
복합(Composite)Sequence자식을 왼쪽부터 평가한다. Failure나 Running이 나오면 즉시 그 값을 돌려주고, 모두 Success일 때만 Success. 논리 AND
Selector(Fallback)자식을 우선순위 순으로 평가한다. Success나 Running이 나오면 즉시 돌려주고, 모두 Failure일 때만 Failure. 논리 OR
Parallel여러 자식을 함께 평가하고, 성공한 자식 수 같은 정책으로 결과를 정한다
데코레이터(Decorator)If·조건 가드조건이 참일 때만 자식을 실행하고, 아니면 Failure
Repeat·While정한 횟수만큼, 또는 조건이 참인 동안 자식을 반복한다. 다 채우기 전에는 Running
Inverter·Retry·Timeout결과 뒤집기, 실패 시 재시도, 시간 초과 시 Failure
리프(Leaf)Action트리 밖의 실제 함수를 호출한다(이동, 공격, 응답 생성)
Condition상태를 검사해 Success·Failure만 돌려준다

Selector와 Sequence의 자식 순서에 무작위·확률을 섞으면 같은 상황에서도 행동이 단조롭지 않게 된다.

블랙보드

노드끼리 값을 주고받을 공용 메모리를 블랙보드(blackboard) 라고 한다. 조건 노드는 블랙보드의 "적 위치"를 읽고, 액션 노드는 "마지막으로 본 시각"을 쓴다. 노드가 서로를 직접 알지 않아도 되므로 서브트리를 떼어 재사용하기 쉽다.

FSM과 비교

관점유한 상태 기계(FSM)비헤이비어 트리
구조상태와 상태 사이의 전이행동을 고르는 우선순위 트리
확장상태가 늘면 전이가 상태 수의 제곱에 가깝게 늘어난다서브트리를 붙이거나 빼면 된다
재사용전이가 상태 안에 박혀 떼어 내기 어렵다서브트리(블록)를 다른 트리에서 그대로 쓴다
반응성전이 조건을 상태마다 따로 적는다매 틱 루트부터 다시 평가해 우선순위 높은 가지가 자연히 끼어든다

한계

  • 트리가 커지면 매 틱 평가하는 노드 수가 늘어 비용이 커진다. Running 노드부터 이어서 평가하는 최적화를 쓴다.
  • 자원이 떨어진 상황 같은 예외 가지를 빠뜨리면 같은 대기 행동만 반복한다. 실패 경로를 설계에 넣어야 한다.
  • 장기 계획에는 약하다. 목표를 세우고 행동 순서를 찾는 문제는 GOAP·HTN 같은 플래너나 학습 기반 방법(강화 학습)과 함께 쓴다.

어디서 쓰나

분야예
게임 엔진Unreal Engine의 Behavior Tree 에디터처럼 그래픽 도구로 트리를 편집한다
로봇ROS 2의 내비게이션 스택(Nav2)이 BehaviorTree.CPP로 주행 행동을 조립한다
대화 시스템발화마다 틱을 주어 의도 확인 → 슬롯 채우기 → 응답 같은 흐름을 고른다

정리

  • BT는 틱마다 루트부터 깊이 우선으로 평가하고, 노드는 Success·Failure·Running을 돌려준다.
  • Sequence는 AND, Selector는 OR, 데코레이터는 자식 하나를 감싼 제어문이다.
  • 노드 간 데이터는 블랙보드로 주고받아 서브트리를 재사용한다.
  • FSM의 전이 폭증 없이 행동을 조립하는 것이 BT의 핵심 가치다.

관련 노트: 트리와 이진 탐색 트리, 깊이 우선 탐색 (DFS), 강화 학습: 에이전트·MDP·가치 함수와 알고리즘 분류, 피드백 제어와 PID 제어기

원본 기록1

댓글

GitHub 계정으로 댓글을 남길 수 있어요.