1315.13 함수 값의 갱신 연산

1. 갱신 연산의 개요

PDDL 2.1에서 수치 함수(numeric fluent)의 값을 변경하는 갱신 연산(update operation)은 액션의 효과(:effect) 절에서 사용된다. PDDL은 다섯 가지 갱신 연산자를 제공하며, 각 연산자는 수치 함수의 현재 값에 대해 서로 다른 변경을 수행한다(Fox & Long, 2003).

2. 다섯 가지 갱신 연산자

연산자구문의미수학적 정의
assign(assign f v)값 할당f' = v
increase(increase f v)값 증가f' = f + v
decrease(decrease f v)값 감소f' = f - v
scale-up(scale-up f v)배수 증가f' = f \times v
scale-down(scale-down f v)배수 감소f' = f / v

여기서 f는 갱신 대상 함수 인스턴스의 현재 값, v는 변경량(수치 표현식), f'는 갱신 후 값이다.

3. assign 연산

현재 값과 무관하게 새로운 값을 직접 할당한다:

;; 배터리 완충
(assign (battery_level ?r) (max_battery ?r))

;; 카운터 초기화
(assign (error_count ?r) 0)

;; 현재 속도 설정
(assign (current_speed ?r) (cruise_speed ?r))

assign은 이전 값의 정보가 완전히 소실되므로, 역연산이 불가능하다.

4. increase 연산

현재 값에 지정된 양을 더한다:

;; 이동 거리 누적
(increase (total_distance) (distance ?from ?to))

;; 비용 누적
(increase (total_cost) (* (distance ?from ?to) (cost_per_unit)))

;; 카운터 증가
(increase (delivery_count) 1)

;; 적재량 증가
(increase (current_load ?r) (weight ?obj))

5. decrease 연산

현재 값에서 지정된 양을 뺀다:

;; 배터리 소모
(decrease (battery_level ?r) (energy_cost ?from ?to))

;; 연료 소모
(decrease (fuel_level ?v) (* (distance ?from ?to) (consumption_rate ?v)))

;; 적재량 감소
(decrease (current_load ?r) (weight ?obj))

;; 남은 시간 감소
(decrease (remaining_time ?mission) (task_duration ?task))

6. scale-up 연산

현재 값에 지정된 배수를 곱한다:

;; 처리 속도 2배 증가
(scale-up (processing_speed ?r) 2)

;; 센서 감도 1.5배 향상
(scale-up (sensor_sensitivity ?s) 1.5)

7. scale-down 연산

현재 값을 지정된 배수로 나눈다:

;; 속도를 절반으로 감소
(scale-down (speed ?r) 2)

;; 전력 출력을 70%로 감소
(scale-down (power_output ?r) (/ 10 7))

8. 수치 표현식의 사용

갱신 연산의 변경량은 상수, 함수 참조, 또는 산술 표현식으로 지정할 수 있다:

;; 상수
(decrease (battery_level ?r) 10)

;; 함수 참조
(decrease (battery_level ?r) (energy_cost ?from ?to))

;; 산술 표현식
(decrease (battery_level ?r) (* (distance ?from ?to) (energy_per_meter ?r)))

;; 복합 표현식
(increase (total_cost) (+ (distance ?from ?to) (* (weight ?cargo) 0.1)))

사용 가능한 산술 연산자: + (덧셈), - (뺄셈), * (곱셈), / (나눗셈)

9. 갱신 연산의 적용 시점

순간적 액션에서 갱신 연산은 효과 적용 시 즉시 수행된다. 듀레이티브 액션에서는 시간 주석에 따라 시작(at start) 또는 종료(at end) 시점에 적용된다:

(:durative-action move
    :parameters (?r - robot ?from ?to - waypoint)
    :duration (= ?duration (/ (distance ?from ?to) (speed ?r)))
    :effect (and
        (at start (not (robot_at ?r ?from)))
        (at end (robot_at ?r ?to))
        (at end (decrease (battery_level ?r) (* ?duration (discharge_rate ?r))))
        (at end (increase (total_distance) (distance ?from ?to)))
    )
)

10. 갱신 연산의 결합

하나의 액션 효과에서 여러 갱신 연산을 접합적으로 결합할 수 있다:

:effect (and
    ;; 논리적 효과
    (not (robot_at ?r ?from))
    (robot_at ?r ?to)
    ;; 수치적 효과
    (decrease (battery_level ?r) (energy_cost ?from ?to))
    (increase (total_distance) (distance ?from ?to))
    (increase (total_cost) (distance ?from ?to))
    (increase (move_count ?r) 1)
)

11. 주의사항

  1. 음수 결과 방지: decrease 연산 후 값이 음수가 되지 않도록 전제 조건에서 사전 검사한다.
  2. 0으로 나누기 방지: scale-down이나 / 연산에서 제수(divisor)가 0이 되지 않도록 보장한다.
  3. 갱신 순서: 동일 함수에 대해 여러 갱신 연산이 동시에 적용되면 결과가 정의되지 않을 수 있다. 하나의 액션에서 동일 함수에 대한 중복 갱신을 피해야 한다.

12. 참고 문헌

  • Fox, M. & Long, D. (2003). “PDDL2.1: An Extension to PDDL for Expressing Temporal Planning Domains.” Journal of Artificial Intelligence Research, 20, 61–124.
  • Hoffmann, J. (2003). “The Metric-FF Planning System: Translating ‘Ignoring Delete Lists’ to Numeric State Variables.” Journal of Artificial Intelligence Research, 20, 291–341.
  • Haslum, P., Lipovetzky, N., Magazzeni, D., & Muise, C. (2019). An Introduction to the Planning Domain Definition Language. Morgan & Claypool Publishers.