---
tags:
  - AI
  - ClassicalPlanning
  - PDDL
  - STRIPS
  - Heuristics
date: 2025-09-25
modification_date: 2025-09-25
---
# 고전 계획(Classical Planning) 기초

## 1. 개요
**고전 계획(Classical Planning)**은 인공지능의 한 분야로, **초기 상태(Initial State)**에서 **목표 상태(Goal State)**에 도달하기 위한 **행동(Action)의 순서, 즉 계획(Plan)**을 자동으로 찾는 것을 목표로 합니다.

고전 계획은 다음과 같은 핵심적인 가정을 전제로 합니다.

- **완전 관측(Fully Observable)**: 환경의 모든 상태를 완벽하게 알 수 있습니다.
- **결정론적(Deterministic)**: 특정 행동의 결과는 항상 동일하며 예측 가능합니다.
- **정적(Static)**: 외부 요인에 의해 상태가 스스로 변하지 않습니다. 오직 에이전트의 행동만이 상태를 변화시킵니다.
- **이산적(Discrete)**: 시간, 상태, 행동이 모두 이산적인 단위로 나뉩니다.

## 2. 핵심 구성 요소 (수학적 모델)

고전 계획 문제는 수학적으로 다음과 같이 정의됩니다.

- **상태 (State)**: `s`로 표현하며, 세상에 대한 참인 사실(Fact)들의 집합입니다. 예를 들어, `on(A, B)`, `clear(A)`와 같은 원자 명제(atomic proposition)의 집합으로 표현됩니다.
- **목표 (Goal)**: `G`로 표현하며, 만족시켜야 할 사실들의 집합입니다. 특정 상태 `s`가 목표 `G`의 모든 조건을 만족하면 `s ⊨ G`라고 표기합니다.
- **행동 (Action)**: `a`로 표현하며, 다음과 같은 세 부분으로 구성됩니다.
    - **전제조건 (Preconditions, `pre`)**: 행동을 수행하기 위해 반드시 참이어야 하는 사실들의 집합.
    - **추가 효과 (Add Effects, `add`)**: 행동 수행 후 새롭게 참이 되는 사실들의 집합.
    - **삭제 효과 (Delete Effects, `del`)**: 행동 수행 후 더 이상 참이 아니게 되는(거짓이 되는) 사실들의 집합.
- **전이 함수 (Transition Function)**: `γ(s, a)`는 상태 `s`에서 행동 `a`를 수행했을 때의 결과 상태 `s'`를 반환합니다. 행동 `a`는 `pre ⊆ s`일 때만 적용 가능하며, 결과 상태는 `s' = (s - del) ∪ add`로 계산됩니다.
- **계획 (Plan)**: `π = (a₁, a₂, ..., aₙ)`은 행동들의 순차적인 나열입니다. 초기 상태 `s₀`에서부터 계획 `π`를 순서대로 적용했을 때, 최종 상태 `sₙ`이 목표 `G`를 만족하면(`sₙ ⊨ G`) 이 계획은 유효한 것으로 간주됩니다.

## 3. 대표적인 형식: STRIPS와 PDDL

- **STRIPS (Stanford Research Institute Problem Solver)**: 위에서 설명한 `precondition`, `add`, `delete` 효과 모델을 정립한 고전적인 계획 문제 형식입니다.
- **PDDL (Planning Domain Definition Language)**: STRIPS를 기반으로, 실제 계획기(Planner)들이 사용할 수 있도록 문법을 표준화한 언어입니다. PDDL은 두 부분으로 나뉩니다.
    - **도메인(Domain)**: 문제의 규칙을 정의합니다. 즉, 술어(predicates)와 행동(actions)의 종류를 기술합니다.
    - **문제(Problem)**: 특정 시나리오를 정의합니다. 즉, 객체(objects), 초기 상태(init), 목표 상태(goal)를 기술합니다.

### PDDL 예시: 블록 쌓기 (Blocks World)

#### 도메인 파일 (`domain.pddl`)
```pddl
(define (domain blocks)
  (:predicates (on ?x ?y) (ontable ?x) (clear ?x) (holding ?x) (handempty))

  (:action pick-up
    :parameters (?x)
    :precondition (and (ontable ?x) (clear ?x) (handempty))
    :effect (and (holding ?x) (not (ontable ?x)) (not (clear ?x)) (not (handempty))))

  (:action put-down
    :parameters (?x)
    :precondition (holding ?x)
    :effect (and (ontable ?x) (clear ?x) (handempty) (not (holding ?x))))

  (:action stack
    :parameters (?x ?y)
    :precondition (and (holding ?x) (clear ?y))
    :effect (and (on ?x ?y) (clear ?x) (handempty) (not (holding ?x)) (not (clear ?y))))

  (:action unstack
    :parameters (?x ?y)
    :precondition (and (on ?x ?y) (clear ?x) (handempty))
    :effect (and (holding ?x) (clear ?y) (not (on ?x ?y)) (not (clear ?x)) (not (handempty)))))
```

#### 문제 파일 (`problem.pddl`)
```pddl
(define (problem bw-simple)
  (:domain blocks)
  (:objects A B)
  (:init (ontable A) (ontable B) (clear A) (clear B) (handempty))
  (:goal (and (on A B))))
```

이 문제에 대한 유효한 계획 중 하나는 `(pick-up A)`, `(stack A B)` 입니다.

## 4. 계획 탐색 방법

고전 계획은 결국 거대한 상태 공간에서 초기 상태로부터 목표 상태까지의 경로를 찾는 **탐색(Search)** 문제로 귀결됩니다.

- **상태 공간 탐색 (State-Space Search)**
    - **전진 탐색 (Forward Search)**: 초기 상태에서 시작하여 가능한 행동들을 적용해가며 목표 상태에 도달하는지 탐색합니다.
    - **후진 탐색 (Regression/Backward Search)**: 목표 상태에서 시작하여, 그 목표를 달성할 수 있는 행동을 역으로 적용해가며 초기 상태에 도달하는지 탐색합니다.
- **계획 공간 탐색 (Plan-Space Search)**: 상태가 아닌 부분적인 계획에서 시작하여, 계획의 결함(threats, open goals)을 해결해나가며 점진적으로 완전한 계획을 만듭니다.

### 대표적인 알고리즘
- **A***: 최적의 계획(가장 짧은 길이 또는 최소 비용)을 찾기 위해 휴리스틱 함수를 사용하는 탐색 알고리즘입니다.
- **Greedy Best-First Search**: 최적성을 보장하지는 않지만, 휴리스틱 값에만 의존하여 빠르게 목표에 도달하는 경로를 찾습니다.
- **Graphplan**: 계획 그래프(Planning Graph)를 생성하여 행동 간의 상호 배제 관계(mutex)를 파악하고, 이를 바탕으로 유효한 계획을 추출합니다.
- **SATPlan**: 계획 문제를 부울 만족도 문제(Boolean Satisfiability Problem, SAT)로 변환하여 강력한 SAT 솔버로 해결합니다.

## 5. 휴리스틱 (Heuristics)

상태 공간이 거대하기 때문에 맹목적인 탐색은 비효율적입니다. 따라서 현재 상태에서 목표까지 얼마나 남았는지를 추정하는 **휴리스틱 함수 `h(s)`**가 탐색 성능의 핵심입니다.

- **삭제 효과 무시 (Delete Relaxation)**: 가장 유명한 휴리스틱 계산 방식으로, 모든 행동의 `delete` 효과를 무시한다고 가정합니다. 이렇게 하면 문제는 훨씬 단순해지며, 이 완화된 문제(relaxed problem)를 해결하는 데 필요한 행동의 수가 현재 상태의 휴리스틱 값이 됩니다.
- **FF 휴리스틱 (Fast Forward)**: 삭제 효과를 무시한 완화된 계획을 실제로 빠르게 찾아내고, 그 계획의 길이를 휴리스틱 값으로 사용하는 매우 강력한 휴리스틱입니다.

## 6. 계획 검증: VAL

계획기(Planner)가 생성한 계획이 정말로 유효한지 독립적으로 검증하는 것은 매우 중요합니다. **VAL (Validator)**은 PDDL로 기술된 도메인과 문제에 대해, 주어진 계획의 각 단계가 전제조건을 만족하는지, 상태 전이가 올바른지, 최종적으로 목표를 달성하는지를 순차적으로 검사하는 표준 도구입니다.

## 7. 복잡도 (Complexity)

일반적인 STRIPS 형식의 계획 문제에서 "유효한 계획이 존재하는가?"를 판정하는 것은 **PSPACE-완전(PSPACE-complete)** 문제로 알려져 있습니다. 이는 계획 문제가 매우 어려운 문제임을 시사하며, 휴리스틱의 중요성을 뒷받침합니다.

## 8. 고전 계획의 한계와 확장

현실 세계의 많은 문제는 고전 계획의 가정을 위반하며, 이를 해결하기 위해 다음과 같은 분야로 확장되었습니다.

- **시간 계획 (Temporal Planning)**: 행동에 지속 시간(duration)이 있는 경우
- **수치 계획 (Numeric Planning)**: 연속적인 수치 변수가 포함된 경우
- **확률적 계획 (Probabilistic Planning)**: 행동의 결과가 불확실한 경우 (MDP, POMDP)
- **다중 에이전트 계획 (Multi-Agent Planning)**: 여러 에이전트가 상호작용하는 경우

## 9. 학습 로드맵

1.  **STRIPS 모델 이해**: `precondition`, `add`, `delete` 개념을 명확히 이해합니다.
2.  **PDDL 작성**: 간단한 도메인과 문제를 직접 작성하고, 오픈소스 계획기를 사용해 실행해 봅니다.
3.  **탐색과 휴리스틱 원리 학습**: 전진 탐색과 FF 휴리스틱이 어떻게 동작하는지 손으로 따라가 봅니다.
4.  **VAL 사용**: 생성된 계획을 VAL로 검증하며 개념 이해를 확인합니다.
