1315.46 드론 배송 도메인의 ���급 PDDL 모델링

1315.46 드론 배송 도메인의 ���급 PDDL 모델링

1. 드론 배송 도메인의 구조

드론 배송 도메인은 타입 시스템, 수치 함수, 파생 술어의 결합 활용이 필요한 대표적인 복합 로봇 도메인이다. 다중 드론이 다양한 화물을 여러 고객에게 배송하면서 에너지 제약, 적재 용량, 비행 규제, 기상 조건 등을 동시에 고려해야 한다.

2. 종합 도메인 정의

(define (domain drone_delivery)
    (:requirements :strips :typing :numeric-fluents :derived-predicates :durative-actions)

    ;; 타입 계층
    (:types
        drone - object
        small_drone large_drone - drone
        location - object
        depot customer_location landing_pad - location
        airspace - location
        package - object
        standard_package express_package fragile_package - package
    )

    ;; 기반 술어
    (:predicates
        (drone_at ?d - drone ?l - location)
        (landed ?d - drone)
        (airborne ?d - drone)
        (holding ?d - drone ?p - package)
        (gripper_free ?d - drone)
        (package_at ?p - package ?l - location)
        (delivered ?p - package ?dest - customer_location)
        (connected_air ?a1 - airspace ?a2 - airspace)
        (above ?a - airspace ?l - landing_pad)
        (pad_free ?l - landing_pad)
        (flight_permitted ?a - airspace)
        (weather_ok ?a - airspace)
    )

    ;; 수치 함수
    (:functions
        (battery_level ?d - drone)
        (max_battery ?d - drone)
        (payload_capacity ?d - drone)
        (weight ?p - package)
        (current_payload ?d - drone)
        (air_distance ?a1 - airspace ?a2 - airspace)
        (flight_speed ?d - drone)
        (energy_per_km ?d - drone)
        (takeoff_energy ?d - drone)
        (landing_energy ?d - drone)
        (charge_rate ?depot - depot)
        (delivery_reward ?p - package)
        (total_cost)
        (total_reward)
        (total_deliveries)
    )

    ;; 파생 술어: 복합 조건 추상화
    (:derived (drone_operational ?d - drone)
        (and (not (drone_in_error ?d)) (>= (battery_level ?d) 5)))

    (:derived (can_carry ?d - drone ?p - package)
        (and (gripper_free ?d)
             (<= (+ (current_payload ?d) (weight ?p)) (payload_capacity ?d))
             (imply (fragile_package ?p) (has_cushioned_gripper ?d))))

    (:derived (flight_safe ?a - airspace)
        (and (flight_permitted ?a) (weather_ok ?a)))

    (:derived (energy_for_flight ?d - drone ?from - airspace ?to - airspace)
        (>= (battery_level ?d)
            (+ (* (air_distance ?from ?to) (energy_per_km ?d))
               (landing_energy ?d))))

    ;; 듀레이티브 ��션
    (:durative-action takeoff
        :parameters (?d - drone ?pad - landing_pad ?air - airspace)
        :duration (= ?duration 10)
        :condition (and
            (at start (drone_at ?d ?pad))
            (at start (landed ?d))
            (at start (above ?air ?pad))
            (at start (drone_operational ?d))
            (at start (>= (battery_level ?d) (takeoff_energy ?d)))
            (over all (flight_safe ?air))
        )
        :effect (and
            (at start (not (landed ?d)))
            (at start (not (drone_at ?d ?pad)))
            (at start (pad_free ?pad))
            (at end (airborne ?d))
            (at end (drone_at ?d ?air))
            (at end (decrease (battery_level ?d) (takeoff_energy ?d)))
        )
    )

    (:durative-action fly
        :parameters (?d - drone ?from - airspace ?to - airspace)
        :duration (= ?duration (/ (air_distance ?from ?to) (flight_speed ?d)))
        :condition (and
            (at start (drone_at ?d ?from))
            (at start (airborne ?d))
            (at start (connected_air ?from ?to))
            (at start (energy_for_flight ?d ?from ?to))
            (over all (flight_safe ?from))
            (over all (flight_safe ?to))
        )
        :effect (and
            (at start (not (drone_at ?d ?from)))
            (at end (drone_at ?d ?to))
            (at end (decrease (battery_level ?d)
                (* (air_distance ?from ?to) (energy_per_km ?d))))
            (at end (increase (total_cost) (air_distance ?from ?to)))
        )
    )

    (:durative-action land
        :parameters (?d - drone ?air - airspace ?pad - landing_pad)
        :duration (= ?duration 15)
        :condition (and
            (at start (drone_at ?d ?air))
            (at start (airborne ?d))
            (at start (above ?air ?pad))
            (at start (pad_free ?pad))
            (over all (flight_safe ?air))
        )
        :effect (and
            (at start (not (airborne ?d)))
            (at start (not (drone_at ?d ?air)))
            (at start (not (pad_free ?pad)))
            (at end (landed ?d))
            (at end (drone_at ?d ?pad))
            (at end (decrease (battery_level ?d) (landing_energy ?d)))
        )
    )

    (:action pick_package
        :parameters (?d - drone ?p - package ?loc - landing_pad)
        :precondition (and
            (drone_at ?d ?loc) (landed ?d) (package_at ?p ?loc)
            (can_carry ?d ?p))
        :effect (and
            (holding ?d ?p) (not (package_at ?p ?loc))
            (not (gripper_free ?d))
            (increase (current_payload ?d) (weight ?p))))

    (:action deliver_package
        :parameters (?d - drone ?p - package ?dest - customer_location)
        :precondition (and
            (drone_at ?d ?dest) (landed ?d) (holding ?d ?p))
        :effect (and
            (delivered ?p ?dest) (gripper_free ?d) (not (holding ?d ?p))
            (decrease (current_payload ?d) (weight ?p))
            (increase (total_reward) (delivery_reward ?p))
            (increase (total_deliveries) 1)))

    (:action charge
        :parameters (?d - drone ?depot - depot)
        :precondition (and (drone_at ?d ?depot) (landed ?d))
        :effect (assign (battery_level ?d) (max_battery ?d)))
)

3. 문제 정의 예시

(define (problem delivery_mission_1)
    (:domain drone_delivery)
    (:objects
        drone1 - small_drone drone2 - large_drone
        depot1 - depot
        cust_A cust_B cust_C - customer_location
        pad_depot pad_A pad_B pad_C - landing_pad
        air1 air2 air3 air4 - airspace
        pkg1 pkg2 - standard_package pkg3 - fragile_package
    )
    (:init
        (= (battery_level drone1) 100) (= (max_battery drone1) 100)
        (= (payload_capacity drone1) 5) (= (flight_speed drone1) 20)
        (= (energy_per_km drone1) 2) (= (takeoff_energy drone1) 5)
        (= (landing_energy drone1) 3)

        (= (battery_level drone2) 150) (= (max_battery drone2) 150)
        (= (payload_capacity drone2) 15) (= (flight_speed drone2) 15)
        (= (energy_per_km drone2) 3) (= (takeoff_energy drone2) 8)
        (= (landing_energy drone2) 5)

        (= (weight pkg1) 2) (= (weight pkg2) 3) (= (weight pkg3) 1)
        (= (delivery_reward pkg1) 10) (= (delivery_reward pkg2) 15)
        (= (delivery_reward pkg3) 20)

        (= (total_cost) 0) (= (total_reward) 0) (= (total_deliveries) 0)
        ;; ... 연결, 위치, 거리 정보
    )
    (:goal (and (delivered pkg1 cust_A) (delivered pkg2 cust_B) (delivered pkg3 cust_C)))
    (:metric maximize (- (total_reward) (total_cost)))
)

4. 핵심 모델링 포인트

  1. 타입 계층으로 드론 및 화물 능력 분류: 소형/대형 드론, 일반/특급/취급주의 화물
  2. 수치 함수로 정량적 제약 관리: 배터리, 적재 용량, 거리, 비용, 보상
  3. 파생 술어로 복합 조건 추상화: 운영 가능성, 운반 가능성, 비행 안전성, 에너지 충분성
  4. 듀레이티브 액션으로 시간적 모델링: 이착륙, 비행의 소요 시간과 병렬 실행

5. 참고 문헌

  • Fox, M. & Long, D. (2003). “PDDL2.1: An Extension to PDDL for Expressing Temporal Planning Domains.” Journal of Artificial Intelligence Research, 20, 61–124.
  • Haslum, P., Lipovetzky, N., Magazzeni, D., & Muise, C. (2019). An Introduction to the Planning Domain Definition Language. Morgan & Claypool Publishers.
  • Ghallab, M., Nau, D., & Traverso, P. (2004). Automated Planning: Theory and Practice. Morgan Kaufmann.