1295.14 Parallel 노드의 Running 반환 조건

1. RUNNING 상태의 의미

Parallel 노드가 RUNNING을 반환한다는 것은, 현재 틱 시점에서 성공 정책도 실패 정책도 충족되지 않았으며, 아직 최종 결과가 결정되지 않은 미결(pending) 상태에 있음을 의미한다. 이는 하나 이상의 자식 노드가 여전히 RUNNING 상태에 있어 향후 틱에서 성공 또는 실패 임계값에 도달할 가능성이 남아 있는 상태이다(Colledanchise & Ögren, 2018).

2. 형식적 정의

성공 임계값 M과 실패 임계값 K가 설정된 Parallel 노드에서, 성공 개수 S와 실패 개수 F, 그리고 RUNNING 상태의 자식 수 R = N - S - F에 대해 RUNNING 반환 조건은 다음과 같다.

\text{status}(P) = \text{RUNNING} \iff S < M \;\land\; F < K

이를 동치적으로 표현하면, 성공 임계값에 아직 도달하지 못했고(S < M), 실패 임계값에도 아직 도달하지 못한(F < K) 상태이다. 이 조건이 성립하려면 반드시 RUNNING 상태의 자식이 하나 이상 존재해야 한다(R \geq 1). 만약 R = 0(모든 자식이 완료)이면서 S < M이고 F < K인 경우는 일관성 조건 M + K \leq N + 1이 위반된 비정상 상태이다.

3. 정책별 RUNNING 반환 조건 분석

3.1 SUCCESS_ALL + FAILURE_ONE (M = N, K = 1)

\text{RUNNING} \iff S < N \;\land\; F = 0

모든 자식이 성공하지도, 하나라도 실패하지도 않은 상태이다. 하나 이상의 자식이 RUNNING이고, 실패한 자식이 전혀 없는 경우에만 RUNNING이 반환된다. 이 조건은 매우 엄격하여, 단 하나의 실패로도 즉시 FAILURE로 전환된다.

3.2 SUCCESS_ONE + FAILURE_ALL (M = 1, K = N)

\text{RUNNING} \iff S = 0 \;\land\; F < N

성공한 자식이 없고, 아직 모든 자식이 실패하지 않은 상태이다. 하나라도 성공하면 즉시 SUCCESS, 모든 자식이 실패하면 FAILURE가 되므로, RUNNING은 아직 가능성이 열려 있는 중간 상태를 나타낸다.

3.3 SUCCESS_COUNT(M) + FAILURE_COUNT(K)

\text{RUNNING} \iff S < M \;\land\; F < K

일반적인 경우이다. 성공 개수가 M에 도달하지 못했고, 실패 개수도 K에 도달하지 못한 상태이다.

4. RUNNING 상태의 지속 가능성 분석

RUNNING 상태가 반환된 시점에서, 향후 결과가 성공으로 귀결될 수 있는지, 실패로 귀결될 수 있는지를 분석하는 것은 행동 트리의 예측 가능성 분석에 중요하다.

4.1 성공 가능성

현재 RUNNING 상태인 자식 수를 R이라 하면, 최대 가능 성공 수는 S + R이다. 성공 가능성이 존재하려면 다음 조건이 만족되어야 한다.

S + R \geq M

이 조건이 만족되지 않으면, 즉 S + R < M이면, RUNNING 상태의 모든 자식이 성공하더라도 임계값에 도달할 수 없으므로 성공은 불가능하다. 이 경우 FAILURE를 즉시 반환해야 하며, 이는 실패 정책의 파생 조건 F > N - M과 동치이다.

S + R < M \iff N - F < M \iff F > N - M

4.2 실패 가능성

마찬가지로, 최대 가능 실패 수는 F + R이다. 실패 가능성이 존재하려면 다음 조건이 만족되어야 한다.

F + R \geq K

5. RUNNING 지속 기간의 결정 요인

Parallel 노드가 RUNNING 상태를 유지하는 기간은 자식 노드들의 실행 특성에 의해 결정된다.

5.1 최단 RUNNING 기간

가장 빠르게 완료되는 자식의 실행 시간에 의해 하한이 결정된다. SUCCESS_ONE 정책에서는 가장 빠르게 성공하는 자식 하나가 완료되면 RUNNING이 종료된다. FAILURE_ONE 정책에서는 가장 빠르게 실패하는 자식 하나가 완료되면 RUNNING이 종료된다.

5.2 최장 RUNNING 기간

가장 느리게 완료되는 자식의 실행 시간에 의해 상한이 결정된다. SUCCESS_ALL 정책에서는 가장 느린 자식이 성공할 때까지(또는 하나가 실패할 때까지) RUNNING이 지속된다. FAILURE_ALL 정책에서는 가장 느린 자식이 실패할 때까지(또는 하나가 성공할 때까지) RUNNING이 지속된다.

5.3 정책별 RUNNING 지속 기간 특성

정책 조합RUNNING 종료 시점기대 지속 기간
SUCCESS_ONE + FAILURE_ALL첫 SUCCESS 또는 모든 FAILURE짧음 (첫 성공까지)
SUCCESS_ALL + FAILURE_ONE모든 SUCCESS 또는 첫 FAILURE가변적 (모든 성공 또는 첫 실패까지)
SUCCESS_ALL + FAILURE_ALL모든 SUCCESS 또는 모든 FAILURE길음 (가장 느린 자식까지)
SUCCESS_COUNT(M) + FAILURE_COUNT(K)M번째 SUCCESS 또는 K번째 FAILURE중간 (정책에 따라 가변)

6. 무한 RUNNING 문제

자식 노드가 무한히 RUNNING을 반환하는 경우, Parallel 노드도 무한히 RUNNING을 반환하게 된다. 이는 행동 트리의 활성 상태(liveness) 문제로, 상위 레벨에서의 타임아웃 메커니즘이나 데코레이터 노드를 통한 시간 제한으로 해결해야 한다.

<Timeout msec="5000">
    <Parallel success_count="2">
        <LongRunningActionA/>
        <LongRunningActionB/>
        <LongRunningActionC/>
    </Parallel>
</Timeout>

위 구조에서 Timeout 데코레이터는 5000밀리초 내에 Parallel 노드가 최종 상태를 반환하지 않으면 강제로 FAILURE를 반환하여 무한 RUNNING 상태를 방지한다.

7. 상위 노드에서의 RUNNING 처리

Parallel 노드가 RUNNING을 반환하면, 상위 제어 노드는 다음 틱에서 Parallel 노드에 다시 틱을 전달한다. 상위 노드의 유형에 따른 처리 방식은 다음과 같다.

상위 노드 유형RUNNING 반환 시 처리
SequenceParallel에서 중단, 다음 틱에서 Parallel 재틱
FallbackParallel에서 중단, 다음 틱에서 Parallel 재틱
Parallel (상위)다른 자식도 동일 틱에서 계속 틱 수신
ReactiveSequence다음 틱에서 첫 자식부터 재평가
ReactiveFallback다음 틱에서 첫 자식부터 재평가

상위 노드가 ReactiveSequence나 ReactiveFallback인 경우, Parallel 노드의 RUNNING 상태에서도 매 틱마다 선행 조건이 재평가되므로, Parallel 노드의 실행이 외부 조건 변화에 의해 선점될 수 있다.

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