📅 截止日期:12月14日 | 🏆 查看排行榜 | 📋 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步):
# 轨迹为空列表 []
state = 50 # 当前状态(执行动作前的位置P=50)
trajectory = [] # 空轨迹(初始状态)中间状态示例(第5步):
# 轨迹包含前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 类的policy函数:
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 分。
根据TotalReward得分进行线性插值计算基础分数:
- 基准线1: TotalReward = 20 → 6分
- 基准线2: 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 分 |
推荐使用conda环境:
conda create -n ML python=3.8
conda activate ML🐧 Linux/ 🍎 macOS:
export STUDENT_ID='你的学号'
export STUDENT_NAME='你的姓名'
export STUDENT_NICKNAME='你的昵称'
export MAIN_CONTRIBUTOR='AI' 🪟 Windows PowerShell:
$env:STUDENT_ID="你的学号"
$env:STUDENT_NAME="你的姓名"
$env:STUDENT_NICKNAME="你的昵称"
$env:MAIN_CONTRIBUTOR="human"多平台可执行文件:
根据你的操作系统选择相应的可执行文件:
🐧 Linux/ 🍎 macOS:
chmod +x evaluate-linux # Linux版本
./evaluate-linux
chmod +x evaluate-macos # macOS版本
./evaluate-macos🪟 Windows:
evaluate-win.exe或者使用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秒时间限制。如果评估超时:
- 自动截断:系统会立即停止后续步骤的执行
- 评估机制:使用当前已获得的总奖励作为最终得分
- 正常计分:超时不会影响得分计算,直接使用已完成的奖励值
- 提交方式: 运行对应平台的可执行文件进行提交
- 提交频率: 支持多次提交,系统记录最佳成绩
- 提交时间: 截止日期前的所有提交均有效
- 成绩计算: 以截止日期前获得的最高TotalReward为准
📅 记得在截止日期前提交你的最佳成绩!
Made with ❤️ for Machine Learning Education