游戏环境搭好了https://www.bilibili.com/video/BV1aXrYBnEaX
可以参考一下我的这个https://gitee.com/feudal_1/my_python_server/blob/master/sifu_control/ppo_training.py
我没办法稳定在30轮内到门,就是随机撞进去的,我是用的大步伐
成功条件:出现这个q攀爬按钮提示

主要会遇到的问题:
门左边这个角落是个三面墙会卡死,

地图内有一些死胡同,死角落会卡人物模型



游戏环境搭好了https://www.bilibili.com/video/BV1aXrYBnEaX
可以参考一下我的这个https://gitee.com/feudal_1/my_python_server/blob/master/sifu_control/ppo_training.py
我没办法稳定在30轮内到门,就是随机撞进去的,我是用的大步伐
成功条件:出现这个q攀爬按钮提示





上午好☀️☀️☀️️
本答案参考通义千问
根据你的描述,你正在尝试使用强化学习(如PPO算法)训练一个智能体在游戏 Sifu 的第一关中走到栅栏(门),但遇到了一些挑战,例如:
下面我将详细分析问题,并提供解决方案,包括模型优化建议、奖励函数设计、环境处理策略以及代码示例。
重点部分:
应使用小步伐,让智能体更精确地控制移动方向和距离。
# 修改动作空间为小步长
action_space = Discrete(5) # 上、下、左、右、不动
如果使用连续动作空间,可以限制速度范围:
action_space = Box(low=-0.1, high=0.1, shape=(2,))
重点部分:
奖励函数应该鼓励智能体靠近门,同时惩罚碰撞和卡死。
| 事件 | 奖励值 | |------|--------| | 每一步靠近门(距离减少) | +0.1 | | 碰到墙或卡死 | -1 | | 成功到达门(出现“q攀爬按钮提示”) | +10 | | 每一步时间惩罚 | -0.01 |
def get_reward(state, next_state, done):
distance_prev = state['distance_to_door']
distance_next = next_state['distance_to_door']
reward = 0.0
if distance_next < distance_prev:
reward += 0.1 # 靠近门加分
if is_collision(next_state):
reward -= 1 # 碰到墙或卡死扣分
if done and success_condition_reached:
reward += 10 # 成功到达门
reward -= 0.01 # 时间惩罚
return reward
重点部分:
确保状态向量包含以下信息:
- 智能体当前位置坐标
- 目标门的相对位置
- 周围是否有障碍物(如三面墙)
- 是否处于死胡同
state = {
'x': current_x,
'y': current_y,
'door_x': door_x,
'door_y': door_y,
'wall_up': is_wall_up,
'wall_down': is_wall_down,
'wall_left': is_wall_left,
'wall_right': is_wall_right,
'is_dead_end': is_in_dead_end,
}
重点部分:
使用ε-greedy 或 Ornstein-Uhlenbeck noise 来平衡探索与利用。
epsilon = max(0.01, epsilon * 0.995) # 衰减探索率
if np.random.rand() < epsilon:
action = random_action()
else:
action = model.predict(state)
重点部分:
可以通过检测是否进入死胡同,若进入则给予惩罚,引导智能体绕行。
def is_in_dead_end(state):
# 根据周围墙体判断是否是死胡同
if state['wall_up'] and state['wall_left'] and state['wall_right']:
return True
return False
重点部分:
确保每一步都更新状态和奖励,并及时记录经验回放(Replay Buffer)。
for episode in range(num_episodes):
state = env.reset()
done = False
while not done:
action = choose_action(state, epsilon)
next_state, reward, done, _ = env.step(action)
buffer.add(state, action, reward, next_state, done)
state = next_state
if len(buffer) > batch_size:
train_model(buffer)
ppo_training.py)你可以参考以下修改后的代码片段:
import gym
import numpy as np
from ppo import PPOAgent
env = gym.make('Sifu-v0') # 假设你已创建自定义环境
agent = PPOAgent(state_dim=8, action_dim=5)
for episode in range(1000):
state = env.reset()
done = False
total_reward = 0
while not done:
action = agent.act(state)
next_state, reward, done, _ = env.step(action)
agent.memory.add(state, action, reward, next_state, done)
state = next_state
total_reward += reward
if len(agent.memory) > batch_size:
agent.update()
print(f"Episode {episode}, Total Reward: {total_reward}")
| 问题 | 解决方案 | |------|----------| | 大步伐导致撞墙 | 使用小步伐或限制速度 | | 奖励函数不合理 | 设计多维度奖励(靠近门、避免碰撞) | | 状态表示不全 | 包含门位置、墙体信息、死胡同判断 | | 探索不足 | 引入 ε-greedy 或噪声策略 | | 卡死问题 | 检测死胡同并给予惩罚 |
如果你愿意分享你的完整代码或环境配置,我可以进一步帮你调试和优化。希望这些建议能帮助你成功训练出稳定的强化学习模型!