1315.12 함수의 초기값 설정 방법
1. 초기값 설정의 구문
PDDL 함수의 초기값은 문제 파일의 :init 절에서 (= ...) 구문을 사용하여 설정한다:
(:init
(= (<function-name> <arguments>) <numeric-value>)
)
<numeric-value>는 정수 또는 실수 리터럴이다.
2. 기본 초기화 예시
(:init
;; 로봇 속성 초기화
(= (battery_level robot1) 100)
(= (battery_level robot2) 80)
(= (max_battery robot1) 100)
(= (max_battery robot2) 100)
(= (speed robot1) 1.5)
(= (speed robot2) 2.0)
(= (current_load robot1) 0)
(= (current_load robot2) 0)
(= (max_load robot1) 50)
(= (max_load robot2) 30)
;; 환경 속성 초기화
(= (distance wp1 wp2) 10.0)
(= (distance wp2 wp3) 15.5)
(= (distance wp1 wp3) 22.3)
(= (distance wp2 wp1) 10.0)
(= (distance wp3 wp2) 15.5)
(= (distance wp3 wp1) 22.3)
;; 물체 속성 초기화
(= (weight box1) 5)
(= (weight box2) 12)
;; 전역 메트릭 초기화
(= (total_cost) 0)
(= (total_distance) 0)
;; 술어 초기화 (함수와 혼합)
(robot_at robot1 wp1)
(robot_at robot2 wp3)
(object_at box1 wp2)
)
3. 초기화의 필수성
모든 함수 인스턴스는 반드시 초기화되어야 한다. 초기화되지 않은 함수 인스턴스를 전제 조건이나 효과에서 참조하면 정의되지 않은 동작(undefined behavior)이 발생한다. 플래너에 따라 오류를 반환하거나, 기본값(0)을 사용하거나, 예측 불가능한 결과를 산출할 수 있다.
3.1 필요한 초기화의 범위
타입 제약에 의해 유효한 모든 함수 인스턴스 중, 액션에서 참조될 수 있는 인스턴스는 반드시 초기화해야 한다:
;; distance 함수: 연결된 웨이포인트 쌍에 대해서만 초기화하면 충분
;; (단, 전제 조건에서 참조되지 않는 인스턴스는 생략 가능)
(:init
(= (distance wp1 wp2) 10) ;; wp1-wp2 연결됨
(= (distance wp2 wp3) 15) ;; wp2-wp3 연결됨
;; (= (distance wp1 wp3) ??) ;; wp1-wp3 직접 연결 없으면 생략 가능
)
4. 초기화 값의 유형
4.1 정수 값
(= (battery_level robot1) 100)
(= (items_collected robot1) 0)
(= (error_count robot1) 0)
4.2 실수 값
(= (speed robot1) 1.5)
(= (distance wp1 wp2) 10.7)
(= (energy_per_meter robot1) 0.3)
4.3 초기화
누적 메트릭이나 카운터는 일반적으로 0으로 초기화한다:
(= (total_cost) 0)
(= (total_distance) 0)
(= (current_load robot1) 0)
(= (total_deliveries) 0)
5. 대칭 함수의 초기화
distance와 같이 두 방향의 값이 동일할 수 있는 함수는 양방향 모두 초기화해야 한다. PDDL은 자동 대칭화를 지원하지 않는다:
;; 대칭 거리: 양방향 초기화 필요
(= (distance wp1 wp2) 10)
(= (distance wp2 wp1) 10)
;; 비대칭 거리 (경사 등): 양방향 값이 다를 수 있음
(= (distance wp1 wp2) 10)
(= (distance wp2 wp1) 12) ;; 오르막 방향으로 비용 더 높음
6. 초기화 패턴별 분류
| 패턴 | 설명 | 예시 |
|---|---|---|
| 정적 속성 | 실행 중 변하지 않는 값 | distance, weight, max_battery |
| 동적 초기 상태 | 실행 중 변하는 값의 초기값 | battery_level, current_load |
| 누적 메트릭 | 0부터 시작하는 누적 값 | total_cost, total_distance |
| 상수 파라미터 | 도메인 상수 | speed, charge_rate |
7. PlanSys2에서의 함수 초기화
PlanSys2의 Problem Expert 클라이언트를 통해 프로그래밍적으로 함수 값을 설정할 수 있다:
auto problem_client = std::make_shared<plansys2::ProblemExpertClient>();
// 함수 값 설정
problem_client->addFunction(plansys2::Function("(= (battery_level robot1) 100)"));
problem_client->addFunction(plansys2::Function("(= (distance wp1 wp2) 10.0)"));
8. 초기화 시 주의사항
- 누락 검사: 도메인에 선언된 모든 함수에 대해 필요한 인스턴스가 초기화되었는지 체계적으로 확인한다.
- 값의 유효성: 배터리 잔량이 최대치를 초과하거나, 거리가 음수인 등의 비현실적 초기값을 배제한다.
- 단위 일관성: 거리(미터), 시간(초), 에너지(단위) 등의 단위를 도메인 전체에서 일관되게 유지한다.
9. 참고 문헌
- 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.