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