1314.34 수치 플루언트와 함수 기반 효과
1. 수치 플루언트의 정의
수치 플루언트(numeric fluent)는 PDDL 2.1에서 도입된 기능으로, 상태 변수에 실수 값을 부여할 수 있게 한다(Fox & Long, 2003). 고전적 PDDL의 술어가 참/거짓의 이진 값만 가지는 것과 달리, 수치 플루언트는 연속적인 수치 값을 표현한다. :numeric-fluents 또는 :fluents 요구사항의 활성화가 필요하다.
수치 플루언트는 :functions 절에서 선언된다:
(:requirements :strips :typing :numeric-fluents)
(:functions
(battery_level ?r - robot)
(distance ?from - waypoint ?to - waypoint)
(speed ?r - robot)
(fuel_capacity ?v - vehicle)
(total_cost)
)
각 함수 선언은 매개변수화된 수치 변수를 정의한다. (battery_level ?r - robot)는 각 로봇에 대해 배터리 잔량을 나타내는 수치 값을 관리한다.
2. 초기 값의 설정
문제 파일의 :init 절에서 수치 플루언트의 초기 값을 설정한다:
(:init
(= (battery_level robot1) 100)
(= (speed robot1) 2.0)
(= (distance wp1 wp2) 10)
(= (distance wp2 wp3) 15)
(= (total_cost) 0)
)
(= (function-name args) value) 형식으로 초기 값을 명시한다. 초기화되지 않은 수치 플루언트의 값은 정의되지 않은 것으로 간주된다.
3. 함수 기반 효과의 유형
수치 플루언트를 변경하는 효과는 다음의 다섯 가지 유형으로 분류된다:
3.1 assign (할당)
수치 플루언트에 새로운 값을 직접 할당한다:
(assign (battery_level ?r) 100)
(assign (status_code ?r) 0)
3.2 increase (증가)
수치 플루언트의 값을 지정된 양만큼 증가시킨다:
(increase (total_distance ?r) (distance ?from ?to))
(increase (items_collected ?r) 1)
3.3 decrease (감소)
수치 플루언트의 값을 지정된 양만큼 감소시킨다:
(decrease (battery_level ?r) (energy_cost ?from ?to))
(decrease (fuel_level ?v) 5)
3.4 scale-up (스케일 업)
수치 플루언트의 값을 지정된 배수로 증가시킨다:
(scale-up (processing_speed ?r) 2)
3.5 scale-down (스케일 다운)
수치 플루언트의 값을 지정된 배수로 감소시킨다:
(scale-down (power_output ?r) 0.5)
4. 수치 효과의 구문
수치 효과는 :effect 절 내에서 다른 효과와 접합적으로 결합된다:
(:action move
:parameters (?r - robot ?from - waypoint ?to - waypoint)
:precondition (and
(robot_at ?r ?from)
(connected ?from ?to)
(>= (battery_level ?r) (energy_cost ?from ?to))
)
:effect (and
(not (robot_at ?r ?from))
(robot_at ?r ?to)
(decrease (battery_level ?r) (energy_cost ?from ?to))
(increase (total_distance ?r) (distance ?from ?to))
(increase (total_cost) (distance ?from ?to))
)
)
5. 수치 표현식
수치 효과의 변경량은 산술 표현식으로 정의할 수 있다:
;; 상수 값
(decrease (battery_level ?r) 10)
;; 다른 수치 플루언트 참조
(decrease (battery_level ?r) (energy_cost ?from ?to))
;; 산술 연산
(decrease (battery_level ?r) (* (distance ?from ?to) (consumption_rate ?r)))
;; 복합 표현식
(increase (total_cost) (+ (distance ?from ?to) (* (weight ?cargo) 0.1)))
6. 로봇 도메인에서의 수치 플루언트 활용
6.1 에너지 관리
(:functions
(battery_level ?r - robot)
(energy_cost ?from - waypoint ?to - waypoint)
(charge_rate ?station - charging_station)
)
(:action charge
:parameters (?r - robot ?station - charging_station)
:precondition (and (robot_at ?r ?station) (< (battery_level ?r) 100))
:effect (assign (battery_level ?r) 100)
)
6.2 적재 용량 관리
(:functions
(current_load ?r - robot)
(max_load ?r - robot)
(weight ?obj - object)
)
(:action load_cargo
:parameters (?r - robot ?obj - object ?loc - waypoint)
:precondition (and
(robot_at ?r ?loc)
(object_at ?obj ?loc)
(<= (+ (current_load ?r) (weight ?obj)) (max_load ?r))
)
:effect (and
(holding ?r ?obj)
(not (object_at ?obj ?loc))
(increase (current_load ?r) (weight ?obj))
)
)
6.3 시간 추적
(:functions (total_time))
(:action move
:parameters (?r - robot ?from - waypoint ?to - waypoint)
:effect (and
(not (robot_at ?r ?from))
(robot_at ?r ?to)
(increase (total_time) (/ (distance ?from ?to) (speed ?r)))
)
)
7. 설계 지침
-
수치 플루언트는 정량적 제약이 중요한 경우에만 사용하라. 이진 술어로 충분한 경우 불필요한 복잡성을 추가하지 말아야 한다.
-
수치 플루언트의 초기화를 빠짐없이 수행하라. 초기화되지 않은 수치 플루언트를 참조하면 정의되지 않은 동작이 발생한다.
-
수치 플루언트의 유효 범위를 전제 조건으로 보호하라. 배터리 잔량이 음수가 되지 않도록
(>= (battery_level ?r) (cost))조건을 설정해야 한다. -
플래너의 수치 플루언트 지원 범위를 확인하라. 모든 플래너가 수치 플루언트를 지원하는 것은 아니며, 지원하더라도 비선형 표현식에 제한이 있을 수 있다.
8. 참고 문헌
- 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.