1295.7 SUCCESS_COUNT(N) 정책의 정의와 동작
1. 형식적 정의
SUCCESS_COUNT(M) 정책은 Parallel 노드의 자식 중 M개 이상이 SUCCESS를 반환하면 Parallel 노드 자체가 SUCCESS를 반환하도록 규정하는 일반화된 성공 정책이다. 여기서 M은 사용자가 설정하는 성공 임계값(success threshold)으로, 1 \leq M \leq N의 범위를 갖는다. N개의 자식 노드 C_1, C_2, \ldots, C_N에 대해 이 정책의 성공 조건은 다음과 같이 정의된다.
\text{SUCCESS\_COUNT}(M): \quad \lvert \{i \in \{1, \ldots, N\} : \text{status}(C_i) = \text{SUCCESS}\} \rvert \geq M
SUCCESS_COUNT(M)은 SUCCESS_ALL과 SUCCESS_ONE을 모두 포괄하는 상위 정책이다. M = N이면 SUCCESS_ALL과 동치이고, M = 1이면 SUCCESS_ONE과 동치이다. 1 < M < N인 경우에는 쿼럼(quorum) 기반의 의사결정 의미론을 구현한다.
2. 상태 전이 규칙
SUCCESS_COUNT(M) 정책 하에서 Parallel 노드의 상태 결정은 성공 개수 S와 실패 개수 F의 집계에 기반한다.
S = \lvert \{i : \text{status}(C_i) = \text{SUCCESS}\} \rvert, \quad F = \lvert \{i : \text{status}(C_i) = \text{FAILURE}\} \rvert
2.1 SUCCESS 반환 조건
\text{status}(P) = \text{SUCCESS} \iff S \geq M
2.2 FAILURE 반환 조건
실패한 자식의 수가 허용 가능한 최대 실패 수를 초과하면, 나머지 자식이 모두 성공하더라도 임계값 M에 도달할 수 없으므로 FAILURE를 반환한다.
\text{status}(P) = \text{FAILURE} \iff F > N - M
이를 동치적으로 표현하면, 잠재적으로 성공 가능한 자식의 수(아직 FAILURE가 아닌 자식의 수) N - F가 M보다 작을 때 FAILURE가 확정된다.
\text{status}(P) = \text{FAILURE} \iff N - F < M
2.3 RUNNING 반환 조건
\text{status}(P) = \text{RUNNING} \iff S < M \;\land\; F \leq N - M
3. 틱별 동작 추적 예시
5개의 자식 노드 C_1, \ldots, C_5를 갖는 Parallel 노드에 M = 3이 설정된 경우를 분석한다.
3.1 시나리오 1: 3개 자식 성공 도달
| 틱 | C_1 | C_2 | C_3 | C_4 | C_5 | S | F | Parallel 상태 |
|---|---|---|---|---|---|---|---|---|
| 1 | RUN | RUN | RUN | RUN | RUN | 0 | 0 | RUNNING |
| 2 | SUC | RUN | FAIL | RUN | RUN | 1 | 1 | RUNNING |
| 3 | SUC | SUC | FAIL | RUN | RUN | 2 | 1 | RUNNING |
| 4 | SUC | SUC | FAIL | SUC | RUN | 3 | 1 | SUCCESS |
틱 4에서 S = 3 \geq M = 3이 되어 SUCCESS가 반환된다. C_3의 실패에도 불구하고, 나머지 자식의 성공으로 임계값에 도달하였다. RUNNING 상태인 C_5에 halt()가 호출된다.
3.2 시나리오 2: 실패 초과로 인한 조기 종료
| 틱 | C_1 | C_2 | C_3 | C_4 | C_5 | S | F | Parallel 상태 |
|---|---|---|---|---|---|---|---|---|
| 1 | RUN | RUN | RUN | RUN | RUN | 0 | 0 | RUNNING |
| 2 | SUC | FAIL | RUN | RUN | RUN | 1 | 1 | RUNNING |
| 3 | SUC | FAIL | FAIL | RUN | RUN | 1 | 2 | RUNNING |
| 4 | SUC | FAIL | FAIL | FAIL | RUN | 1 | 3 | FAILURE |
틱 4에서 F = 3 > N - M = 5 - 3 = 2이므로, 잔여 자식(C_5)이 모두 성공하더라도 S가 최대 2에 불과하여 M = 3에 도달할 수 없다. 따라서 FAILURE가 확정된다.
3.3 시나리오 3: 경계 조건
M = 3, N = 5에서 실패 개수가 정확히 N - M = 2인 경우를 살펴본다.
| 틱 | C_1 | C_2 | C_3 | C_4 | C_5 | S | F | Parallel 상태 |
|---|---|---|---|---|---|---|---|---|
| 3 | SUC | FAIL | FAIL | RUN | RUN | 1 | 2 | RUNNING |
F = 2 = N - M이므로 실패 임계값을 초과하지 않는다. C_4와 C_5가 모두 성공하면 S = 3 = M에 도달할 수 있으므로, 아직 성공 가능성이 남아 있어 RUNNING을 유지한다.
4. 쿼럼 의미론
1 < M < N으로 설정된 SUCCESS_COUNT 정책은 분산 시스템의 쿼럼(quorum) 합의 프로토콜과 유사한 의미론을 구현한다. 쿼럼 합의에서는 전체 노드 중 과반수 이상의 합의가 이루어지면 결정이 확정되는 것처럼, SUCCESS_COUNT(M) 정책에서는 전체 자식 중 M개 이상의 성공이 확인되면 전체 성공이 확정된다.
이러한 쿼럼 의미론은 다음의 특성을 갖는다.
4.1 부분 실패 내성(partial failure tolerance)
N - M개의 자식이 실패하더라도 전체 성공에 영향을 미치지 않는다. 최대 허용 실패 수는 N - M이다.
\text{최대 허용 실패 수} = N - M
4.2 임계값별 특성 분석
| M 값 | 의미 | 최대 허용 실패 수 | 실패 내성 비율 |
|---|---|---|---|
| M = 1 | 최소 성공 요구 | N - 1 | (N-1)/N |
| M = \lceil N/2 \rceil | 과반수 성공 요구 | \lfloor N/2 \rfloor | \approx 50\% |
| M = N - 1 | 하나의 실패 허용 | 1 | 1/N |
| M = N | 전원 성공 요구 | 0 | 0\% |
5. BehaviorTree.CPP에서의 설정
BehaviorTree.CPP에서 SUCCESS_COUNT 정책은 success_count 속성을 통해 XML에서 직접 설정한다.
<!-- 5개 자식 중 3개 이상 성공 시 전체 성공 -->
<Parallel success_count="3">
<ActionA/>
<ActionB/>
<ActionC/>
<ActionD/>
<ActionE/>
</Parallel>
success_count 값은 양의 정수로 지정하며, 자식 수 N보다 클 수 없다. N보다 큰 값이 지정되면 성공이 불가능한 구조가 되므로 논리적 오류이다.
6. 로봇공학 적용 사례
6.1 다중 로봇 부분 성공 임무
N대의 로봇 중 M대 이상이 목표에 도달하면 임무가 성공으로 간주되는 다중 로봇 시스템이다.
<Parallel success_count="3">
<Robot1_ReachTarget/>
<Robot2_ReachTarget/>
<Robot3_ReachTarget/>
<Robot4_ReachTarget/>
<Robot5_ReachTarget/>
</Parallel>
5대의 로봇 중 3대 이상이 목표에 도달하면 전체 임무가 성공한다. 최대 2대의 로봇이 장애물, 통신 장애, 또는 기계적 고장으로 인해 실패하더라도 임무 수행에 지장이 없다.
6.2 다중 센서 부분 융합
센서 배열에서 일부 센서가 고장나더라도 충분한 수의 센서 데이터가 확보되면 융합 처리를 진행하는 경우이다.
<Parallel success_count="4">
<ReadSensor1/>
<ReadSensor2/>
<ReadSensor3/>
<ReadSensor4/>
<ReadSensor5/>
<ReadSensor6/>
</Parallel>
6개의 센서 중 4개 이상이 정상적으로 데이터를 반환하면 센서 융합 알고리즘을 실행한다. 최대 2개의 센서 고장을 허용한다.
6.3 투표 기반 의사결정
복수의 알고리즘이 동일한 판단 과제를 수행하고, 과반수가 동일한 결론에 도달하면 해당 결론을 채택하는 투표(voting) 패턴이다.
<Parallel success_count="2">
<IsObstacleDetected_Lidar/>
<IsObstacleDetected_Camera/>
<IsObstacleDetected_Radar/>
</Parallel>
3개의 센서 모달리티 중 2개 이상이 장애물을 감지(SUCCESS 반환)하면 장애물이 존재하는 것으로 판정한다. 단일 센서의 오탐(false positive)에 의한 불필요한 회피 행동을 방지할 수 있다.
7. SUCCESS_ALL 및 SUCCESS_ONE과의 통합적 관계
SUCCESS_COUNT(M)은 SUCCESS_ALL과 SUCCESS_ONE을 특수 사례로 포함하는 일반화된 정책이다. 이 관계를 도식화하면 다음과 같다.
\text{SUCCESS\_ONE} \equiv \text{SUCCESS\_COUNT}(1) \subset \text{SUCCESS\_COUNT}(M) \subset \text{SUCCESS\_COUNT}(N) \equiv \text{SUCCESS\_ALL}
여기서 \subset는 성공 조건의 엄격성이 증가하는 방향을 나타낸다. M이 증가할수록 성공 조건이 엄격해지고, 실패 내성이 감소한다.
8. 참고 문헌
- Colledanchise, M., & Ögren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
- Faconti, D., & contributors. (2024). BehaviorTree.CPP Documentation. https://www.behaviortree.dev/
Version: 1.0-2026.04.03