복합 조건의 구현 패턴 (Compound Condition Implementation Patterns)

복합 조건의 구현 패턴 (Compound Condition Implementation Patterns)

1. 개요

복합 조건(compound condition)은 복수의 단일 조건을 논리 연산(AND, OR, NOT)으로 결합하여 더 복잡한 의사 결정을 표현하는 패턴이다. 행동 트리에서는 조건 노드 자체에 논리 연산을 내장하는 대신, 제어 노드(Sequence, Fallback)와 데코레이터(Inverter)의 구조적 결합을 통해 복합 조건을 구현한다. 이 접근은 각 조건 노드의 단일 책임 원칙을 유지하면서도 임의의 복잡도를 가진 조건 표현을 가능하게 한다.

2. 논리 연산과 행동 트리 구조의 대응

2.1 기본 대응 관계

논리 연산행동 트리 구조설명
A \wedge B (AND)Sequence(A, B)모든 조건이 SUCCESS
A \vee B (OR)Fallback(A, B)하나 이상의 조건이 SUCCESS
\neg A (NOT)Inverter(A)조건의 결과를 반전

이 대응 관계는 행동 트리의 제어 노드가 논리 게이트(logic gate)로 기능할 수 있음을 보여준다. Sequence는 AND 게이트, Fallback은 OR 게이트, Inverter는 NOT 게이트에 해당한다.

2.2 복합 논리식의 분해

임의의 복합 논리식은 AND, OR, NOT의 조합으로 분해할 수 있으며, 이를 행동 트리 구조로 직접 변환할 수 있다.

예를 들어, 다음 논리식을 행동 트리로 표현한다.

(A \wedge B) \vee (\neg C \wedge D)

<Fallback>
    <Sequence>
        <Condition ID="A"/>
        <Condition ID="B"/>
    </Sequence>
    <Sequence>
        <Inverter>
            <Condition ID="C"/>
        </Inverter>
        <Condition ID="D"/>
    </Sequence>
</Fallback>

AND 복합 조건

Sequence 기반 구현

Sequence 노드는 자식 노드를 순차적으로 평가하며, 모든 자식이 SUCCESS를 반환할 때에만 전체가 SUCCESS를 반환한다.

<Sequence name="AllConditionsMet">
    <Condition ID="IsBatteryAbove"
               min_percentage="0.2"/>
    <Condition ID="IsGpsFixAvailable"
               min_status="0"/>
    <Condition ID="IsWindSpeedAcceptable"
               max_wind_speed="8.0"/>
</Sequence>

Sequence의 단락 평가(short-circuit evaluation) 특성에 의해, 첫 번째 조건이 FAILURE를 반환하면 나머지 조건은 평가되지 않는다. 이를 활용하여 계산 비용이 낮은 조건을 먼저 배치하면 전체 평가 효율을 높일 수 있다.

ReactiveSequence와의 차이

ReactiveSequence는 매 tick마다 첫 번째 자식부터 재평가하는 반면, 일반 Sequence는 이전에 SUCCESS를 반환한 자식을 건너뛴다. 조건 노드만으로 구성된 AND 복합 조건에서는 두 구조의 차이가 없으나, 액션 노드가 포함된 경우 ReactiveSequence는 조건을 지속적으로 재평가한다.

OR 복합 조건

Fallback 기반 구현

Fallback 노드는 자식 노드를 순차적으로 평가하며, 하나라도 SUCCESS를 반환하면 전체가 SUCCESS를 반환한다.

<Fallback name="AnyConditionMet">
    <Condition ID="IsObstacleDetected"/>
    <Condition ID="IsBatteryLow"/>
    <Condition ID="HasTimeoutElapsed"/>
</Fallback>

NOT 조건

Inverter 데코레이터 기반 구현

Inverter 데코레이터는 자식 노드의 SUCCESSFAILURE로, FAILURESUCCESS로 반전한다.

<Inverter>
    <Condition ID="IsObstacleDetected"
               detection_range="1.0"/>
</Inverter>

위 구조는 “장애물이 감지되지 않았는가?“를 판정한다.

복합 조건의 실용적 패턴

배타적 OR (XOR)

A \oplus B = (A \wedge \neg B) \vee (\neg A \wedge B)

<Fallback name="ExactlyOneTrue">
    <Sequence>
        <Condition ID="A"/>
        <Inverter><Condition ID="B"/></Inverter>
    </Sequence>
    <Sequence>
        <Inverter><Condition ID="A"/></Inverter>
        <Condition ID="B"/>
    </Sequence>
</Fallback>

조건부 의미(Implication)

A \rightarrow B = \neg A \vee B

<Fallback name="IfAThenB">
    <Inverter><Condition ID="A"/></Inverter>
    <Condition ID="B"/>
</Fallback>

“A가 참이면 B도 참이어야 한다“는 조건을 표현한다. A가 거짓이면 B에 관계없이 전체가 참이다.

N개 중 K개 이상 충족

N개의 조건 중 K개 이상이 SUCCESS인 경우를 판정하는 것은 Parallel 노드를 활용하여 구현할 수 있다. Parallel 노드의 success_count 매개변수를 K로 설정하면, K개의 자식이 SUCCESS를 반환할 때 전체가 SUCCESS를 반환한다.

<Parallel success_count="2" failure_count="2">
    <Condition ID="SensorA_OK"/>
    <Condition ID="SensorB_OK"/>
    <Condition ID="SensorC_OK"/>
</Parallel>

3개의 센서 중 2개 이상이 정상이면 전체가 SUCCESS를 반환한다. 이는 다수결(majority voting) 패턴으로, 센서 중복 시스템의 신뢰성 판정에 활용된다.

설계 시 고려 사항

단일 노드 내 복합 조건 vs 구조적 결합

복합 조건을 단일 조건 노드 내부에서 여러 조건을 평가하여 구현하는 방법과, 개별 조건 노드를 제어 구조로 결합하는 방법 중 선택하여야 한다.

접근장점단점
단일 노드 내 복합 조건원자적 평가, 구현 간결재사용성 낮음, 테스트 어려움
구조적 결합재사용성 높음, 개별 테스트 가능XML 구조 복잡, 약간의 오버헤드

일반적으로 의미론적으로 독립적인 조건은 개별 노드로 분리하고, 밀접하게 결합된 조건(예: 동일 센서 메시지의 복수 필드 비교)은 단일 노드에서 처리하는 것이 적절하다.

조건 평가 순서의 최적화

Sequence(AND)에서는 FAILURE 확률이 높은 조건을 먼저 배치하고, Fallback(OR)에서는 SUCCESS 확률이 높은 조건을 먼저 배치하면 평균 평가 횟수를 줄일 수 있다. 또한, 계산 비용이 낮은 조건을 높은 비용의 조건보다 앞에 배치하는 것이 효율적이다.

가독성 유지

복합 조건이 깊게 중첩되면 행동 트리의 가독성이 저하된다. 서브트리(subtree)를 활용하여 복합 조건을 명명된 단위로 캡슐화하면 가독성을 유지할 수 있다.

<SubTree ID="IsFlightSafe"/>

참고 문헌

  • 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초안 작성