**오프라인 RL 프로젝트 구조**

가장 큰 변화는 데이터셋을 관리하는 `datasets/` 디렉토리와 데이터 수집을 위한 별도 스크립트(`data_collector.py`)의 추가입니다.

`my_rl_project/
├── configs/
│   └── offline_env_config.yaml
├── datasets/
│   └── collected_data.h5
├── envs/
│   ├── __init__.py
│   └── my_custom_env.py
├── agents/
│   ├── __init__.py
│   └── offline_agent.py
├── data_collector.py
└── train_offline.py`

---

### **구성 요소별 변경 사항 및 관리 방안**

### **1. `datasets/` (신규)**

- **Purpose**: 사전 수집된 고정 데이터셋을 저장하는 디렉토리입니다. 오프라인 학습의 가장 핵심적인 자산입니다.
- **Format**: 대용량 데이터를 효율적으로 다루기 위해 HDF5(`.h5`), Parquet, 또는 NumPy Archive(`.npz`) 형식을 사용하는 것이 일반적입니다.
- **Content**: `(observation, action, reward, next_observation, terminated)` 튜플들의 집합으로 구성된 테이블 또는 배열.

### **2. `data_collector.py` (신규)**

- **Purpose**: 오프라인 학습에 사용할 데이터셋을 생성하는 스크립트입니다. 이 스크립트는 **온라인(online) 환경에서 실행**됩니다.
- **Implementation**:
  - `MyCustomEnv`를 인스턴스화합니다.
  - 미리 정의된 정책(예: 랜덤 정책, 전문가 정책, 기존에 학습된 온라인 RL 정책)을 사용하여 환경과 상호작용(`env.step()`)합니다.
  - 수집된 `(s, a, r, s', d)` 튜플들을 `datasets/` 디렉토리에 지정된 파일 형식으로 저장합니다.
  - **데이터 수집 단계와 오프라인 학습 단계를 명확히 분리**하는 역할을 합니다.

### **3. `configs/offline_env_config.yaml`**

- **Purpose**: 오프라인 학습에 특화된 설정을 관리합니다.
- **Key Definitions (변경점)**:
  - **`dataset_params`**:
    - `path`: 사용할 데이터셋 파일의 경로 (`datasets/collected_data.h5`).
    - `batch_size`: 학습 시 데이터셋에서 샘플링할 배치의 크기.
  - **`agent_params`**: 오프라인 RL 알고리즘(예: CQL, BCQ)에 특화된 하이퍼파라미터를 정의.

### **4. `envs/my_custom_env.py`**

- **Purpose (역할 변경)**:
  - **학습 단계**: 더 이상 학습 과정에서 실시간으로 상호작용하지 않습니다.
  - **평가(Evaluation) 단계**: **오프라인 학습이 완료된 후, 학습된 정책의 성능을 검증하는 용도**로 사용됩니다. 즉, 학습된 에이전트를 실제 환경에서 실행해보기 위한 '테스트베드'의 역할이 주가 됩니다.

### **5. `agents/offline_agent.py`**

- **Purpose**: 오프라인 데이터셋만으로 정책을 학습하는 알고리즘을 구현합니다.
- **Key Definitions (변경점)**:
  - `class OfflineAgent`: CQL, IQL, BCQ 등 오프라인 RL 알고리즘을 구현.
  - `__init__(...)`: 온라인 에이전트와 유사하게 모델과 하이퍼파라미터를 초기화.
  - `get_action(self, state)`: 역할은 동일하나, 주로 학습 후 **평가 단계**에서 사용됩니다.
  - `learn(self, batch)`:
    - 메서드의 인자가 단일 경험이 아닌, \**데이터셋에서 샘플링된 `batch`*가 됩니다.
    - 이 `batch` 데이터를 사용하여 오프라인 RL 알고리즘의 손실 함수를 계산하고 정책을 업데이트합니다. **환경과의 상호작용(`env.step()`)이 전혀 없습니다.**
- **Policy & Reward Function Management**:
  - **정책(Policy)**: 이 파일 내에서 관리되며, 주어진 데이터셋 내의 행동 분포를 모방하거나 보수적으로(conservative) 개선하는 방향으로 학습됩니다.
  - **보상 함수(Reward Function)**: 에이전트는 보상 함수를 직접 참조하지 않습니다. 대신, 데이터셋에 **기록된 `reward` 값**을 학습의 유일한 감독(supervision) 신호로 사용합니다.

### **6. `train_offline.py`**

- **Purpose**: 오프라인 데이터셋을 로드하여 에이전트를 학습시키는 메인 스크립트.
- **Key Definitions (핵심 변경점)**:
  - **Setup**: 설정 파일을 로드하고, 데이터셋 로더와 `OfflineAgent`를 인스턴스화합니다. (`MyCustomEnv`는 이 단계에서 필요 없을 수 있습니다.)
  - **Training Loop**:
    - **환경과의 상호작용 루프가 사라집니다.**
    - 대신, 지도 학습(supervised learning)과 유사한 루프를 가집니다.
    - `for epoch in range(num_epochs):`
      - `batch = dataset.sample(batch_size)`
      - `agent.learn(batch)`
  - **Evaluation**:
    - 학습 루프가 끝난 후, `MyCustomEnv`를 인스턴스화합니다.
    - 학습된 `agent.get_action()`을 사용하여 환경과 상호작용하며 성능을 측정하는 별도의 평가 루프를 실행합니다.
