# ML-Assignment-4
**Repository Path**: kute1654/ML-Assignment-4
## Basic Information
- **Project Name**: ML-Assignment-4
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-12-04
- **Last Updated**: 2025-12-04
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Assignment 4: 强化学习
[](https://www.python.org/)
[](http://101.132.193.95:3000)
[](LICENSE)
**📅 截止日期:12月14日** | **🏆 [查看排行榜](http://101.132.193.95:3000)** | **📋 Assignment ID: 04**
### 📤 提交方式: 通过可执行文件提交
---
## 📋 任务概述
> 本次任务要求通过强化学习算法解决一个动态位置优化问题。在一个磁性球环境中,智能体(P)需要学习调整其位置,以最大化与动态变化的目标球(q)相关的奖励信号。目标球会根据智能体的移动而响应性地移动,形成一个复杂的动态系统。
## 🎯 环境描述
### 环境参数
- **轨道范围**: 0-99
- **动作范围**: -99到99
- **每轮步数**: 200步
### 状态和动作
- **状态**: 当前智能体位置 P
- **动作**: 移动距离(整数,范围-99到99)
- **位置更新逻辑**: 当前位置 P 执行动作 action 后,新位置为 `P_new = P + action`。如果新位置超出轨道边界 [0, 99],会触发反弹机制:
- 如果 `P_new < 0`:超出边界的距离除以2后反弹,即 `P_final = 0 + abs(P_new) // 2`
- 如果 `P_new > 99`:超出边界的距离除以2后反弹,即 `P_final = 99 - (P_new - 99) // 2`
- 最终位置会被限制在 [0, 99] 范围内
- **轨迹**: 包含历史状态、动作和奖励的序列,每个元素为 (P, action, reward) 三元组
- **奖励计算**: 奖励基于智能体P与目标球q之间的距离计算,距离越近奖励值越大
#### 轨迹示例
**初始状态示例**(第0步):
```python
# 轨迹为空列表 []
state = 50 # 当前状态(执行动作前的位置P=50)
trajectory = [] # 空轨迹(初始状态)
```
**中间状态示例**(第5步):
```python
# 轨迹包含前4步的历史记录,每个元素为(新状态, 动作, 奖励)
state = 67 # 当前状态(执行动作前的位置P=67)
trajectory = [
(60, 10, 0.15), # 第0步:从50移动到60,执行动作10,奖励0.15
(55, -5, 0.23), # 第1步:从60移动到55,执行动作-5,奖励0.23
(63, 8, 0.18), # 第2步:从55移动到63,执行动作8,奖励0.18
(67, 4, 0.12) # 第3步:从63移动到67,执行动作4,奖励0.12
]
```
### 📊 离线数据集说明
项目提供了`offline_data.csv`离线数据集,包含1000个trial的完整轨迹数据,可用于策略分析和算法调试。
#### 数据集字段说明
| 字段名 | 说明 |
|--------|------|
| **trial_id** | 试验编号 |
| **step_id** | 当前试验中的步数 |
| **P** | 智能体当前位置 |
| **action** | 执行的动作 |
| **reward** | 获得的奖励 |
#### 数据集统计信息
- **总trial数**: 1000个
- **每个trial步数**: 200步
- **总数据量**: 200,000条记录
> 💡 **提示**: 离线数据可以帮助你理解环境动态,但最终评测使用的是实时环境,策略需要能够适应环境的随机性。
### 🎯 数据收集与策略优化建议
除了使用提供的离线数据,你还可以在 `policy` 函数中添加数据收集逻辑来生成自己的训练数据。
**数据收集策略建议**:
- **数据收集**: 在 `policy` 函数中,将当前状态和轨迹保存到文件中,以便后续分析。
- **数据分析**: 使用离线数据集进行策略分析,了解环境特性。
- **策略调整**: 根据数据分析结果,调整策略以适应环境变化。
通过收集自己的数据,你可以更好地理解环境特性,并针对性地优化策略。
## 💻 代码要求
### solution.py 代码要求
在 `solution.py` 中实现 `Solution` 类的policy函数:
```python
def policy(self, state, trajectory):
"""
实现你的策略函数
参数:
state: 当前状态(智能体位置P)
trajectory: 历史轨迹列表,每个元素为(P, action, reward)三元组
返回:
action: 要执行的动作(整数,范围-99到99)
"""
# 数据收集示例:保存轨迹数据到文件
# if len(trajectory) > 0:
# # 记录上一个状态、动作、奖励和当前状态
# with open("collected_data.csv", "a") as f:
# P, action, reward = trajectory[-1]
# f.write(f"{P},{action},{reward},{state}\n")
# 你的策略实现
action = np.random.randint(-99, 99) # 示例动作,实际策略需要根据状态和轨迹进行计算
# 可以根据收集的数据进行分析和策略调整
return action
```
## 📈 评分标准 (总分 20分)
本次作业总分为 20 分。
### 评分规则(基于TotalReward)
根据TotalReward得分进行线性插值计算基础分数:
#### 评分基准点
- **基准线**: TotalReward = 20 → **6分**
- **满分线**: TotalReward = 94.61 → **10分**
- **排行榜前10%线**: TotalReward = FullScoreReward(排行榜前10%的最低分) → **20分**
#### 基础得分规则
| 场景 | 条件说明 | 基础得分 |
| :--- | :--- | :--- |
| **1** | TotalReward ≤ 20 | **6 分** |
| **2** | 20 < TotalReward < 94.61 | **6 ~ 10 分** (线性插值) |
| **3** | 94.61 ≤ TotalReward < FullScoreReward | **10 ~ 20 分** (线性插值) |
| **4** | TotalReward ≥ FullScoreReward | **20 分** |
---
## ⚙️ 环境要求



## 🚀 运行评测
### 📦 1. 依赖安装:
推荐使用conda环境:
```bash
conda create -n ML python=3.8
conda activate ML
```
### ⚙️ 2. 设置环境变量
**🐧 Linux:**
```bash
export STUDENT_ID='你的学号'
export STUDENT_NAME='你的姓名'
export STUDENT_NICKNAME='你的昵称'
export MAIN_CONTRIBUTOR='AI'
```
**🪟 Windows PowerShell:**
```powershell
$env:STUDENT_ID="你的学号"
$env:STUDENT_NAME="你的姓名"
$env:STUDENT_NICKNAME="你的昵称"
$env:MAIN_CONTRIBUTOR="human"
```
### ▶️ 3. 运行评测
**多平台可执行文件**:
根据你的操作系统选择相应的可执行文件:
**🐧 Linux:**
```bash
chmod +x evaluate-linux
./evaluate-linux
```
**🪟 Windows:**
```cmd
evaluate-win.exe
```
或者使用PowerShell:
```powershell
.\evaluate-win.exe
```
**评测配置**:
- **时间限制**: 60秒
- **步数**: 200步
- **评估指标**: 200步总奖励值
- **提交平台**: 支持水杉平台提交
**输出示例**:
```
Starting reinforcement learning assignment evaluation
============================================================
Evaluation configuration:
Total steps: 200
Time limit: 60 seconds
Reward metric: 200-step total reward
============================================================
Found solution.py file
Running mode: 1
Starting reinforcement learning policy evaluation...
--------------------------------------------------
Evaluation completed:
Steps completed: 200/200
Total reward: 15.234567
Evaluation time: 2.34 seconds
Status: Completed normally
Submitting to leaderboard...
Submission successful!
Evaluation completed!
Final reward: 15.234567
```
### ⏱️ 超时处理说明
**重要**:评测系统有**60秒时间限制**。如果评估超时:
- **自动截断**:系统会立即停止后续步骤的执行
- **评估机制**:使用**当前已获得的总奖励**作为最终得分
- **正常计分**:超时不会影响得分计算,直接使用已完成的奖励值
---
## 🏆 Leaderboard
### 🌐 访问地址
**🔗 [http://101.132.193.95:3000](http://101.132.193.95:3000)**
---
### 📋 提交说明
1. **提交方式**: 运行对应平台的可执行文件进行提交
2. **提交频率**: 支持多次提交,系统记录最佳成绩
3. **提交时间**: 截止日期前的所有提交均有效
4. **成绩计算**: 以截止日期前获得的最高TotalReward为准
---
### 🎉 祝你取得好成绩!
**📅 记得在截止日期前提交你的最佳成绩!**
---
Made with ❤️ for Machine Learning Education