ForceFailure의 Success→Failure 변환 규칙 (ForceFailure's Success→Failure Conversion Rule)

ForceFailure의 Success→Failure 변환 규칙 (ForceFailure’s Success→Failure Conversion Rule)

1. 개요

ForceFailure 데코레이터의 핵심 변환 규칙은 자식 노드가 SUCCESS를 반환할 때 이를 FAILURE로 변환하는 것이다. 이 단방향 변환은 자식 행동의 성공을 의도적으로 차단하여, Fallback 제어 노드에서의 단락 평가를 우회하거나, 특정 분기가 선택되는 것을 방지하는 데 활용된다.

2. 변환 규칙의 정형적 정의

f_{\text{ForceFailure}}(\text{SUCCESS}) = \text{FAILURE}

이 변환에 의해, 자식이 SUCCESS를 반환하더라도 ForceFailure의 부모 노드는 FAILURE를 수신한다. 자식의 성공이 부모에게 전달되지 않는다.

Fallback에서의 효과

ForceFailure 없이

<Fallback>
    <Action ID="ActionA"/>  <!-- SUCCESS 반환 -->
    <Action ID="ActionB"/>  <!-- 실행되지 않음 (단락 평가) -->
</Fallback>

ActionA가 SUCCESS → Fallback이 SUCCESS → ActionB는 평가되지 않음.

ForceFailure 적용

<Fallback>
    <ForceFailure>
        <Action ID="ActionA"/>  <!-- SUCCESS 반환해도 -->
    </ForceFailure>
    <Action ID="ActionB"/>  <!-- 실행됨 -->
</Fallback>

ActionA가 SUCCESS → ForceFailure가 FAILURE → Fallback이 ActionB를 시도.

이 패턴은 ActionA를 부작용(side effect)으로 실행하면서도, Fallback이 ActionB로 진행하도록 하는 데 사용된다. 그러나 데코레이터의 부작용 발생은 행동 트리의 설계 원칙에 부합하지 않을 수 있으므로 주의가 필요하다.

Inverter와의 비교

입력Inverter 출력ForceFailure 출력
SUCCESSFAILUREFAILURE
FAILURESUCCESSFAILURE

Inverter는 FAILURE를 SUCCESS로 반전하지만, ForceFailure는 FAILURE를 FAILURE로 유지한다. 따라서 ForceFailure는 항상 FAILURE를 반환하며, 자식의 결과를 구별하지 않는다.

SUCCESS→FAILURE 변환의 한계

이 변환은 자식의 성공 정보를 소실시킨다. 자식이 성공적으로 완료되었는지의 정보가 부모에게 전달되지 않으므로, 후속 로직에서 자식의 성공 여부를 참조할 수 없다. 필요한 경우 블랙보드에 결과를 별도로 기록하여야 한다.

실용적 사용 빈도

ForceFailure는 ForceSuccess에 비해 사용 빈도가 현저히 낮다. 대부분의 실용적 상황에서 자식의 성공을 차단하여야 할 필요성이 적기 때문이다. 주요 사용처는 다음과 같다.

  • Fallback의 단락 평가 우회
  • 테스트 및 디버깅 목적의 강제 실패
  • 특정 분기의 비활성화

참고 문헌

  • Colledanchise, M., & Ogren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
  • BehaviorTree.CPP 공식 문서. https://www.behaviortree.dev/

버전날짜변경 사항
v0.12026-04-04초안 작성