feudal_ 2026-01-16 09:54 采纳率: 69.2%
浏览 3

如何制作sifu第一关走到栅栏强化学习模型 做出来了收敛了奖励50

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

成功条件:出现这个q攀爬按钮提示

img


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

img


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

img

img

img

  • 写回答

2条回答 默认 最新

  • 檀越@新空间 2026-01-16 09:55
    关注

    上午好☀️☀️☀️️
    本答案参考通义千问

    根据你的描述,你正在尝试使用强化学习(如PPO算法)训练一个智能体在游戏 Sifu 的第一关中走到栅栏(门),但遇到了一些挑战,例如:

    • 无法在30轮内到达目标门
    • 随机撞墙或卡死在角落
    • 地图中有死胡同和三面墙的区域

    下面我将详细分析问题,并提供解决方案,包括模型优化建议、奖励函数设计、环境处理策略以及代码示例


    ✅ 一、主要问题分析

    1. 动作空间过大(大步伐)

    • 如果你使用了过大的步长(比如每一步移动距离很大),那么智能体很容易“跳”过目标点,或者直接撞到墙壁。
    • 这会导致智能体无法稳定地靠近目标门。

    2. 奖励函数设计不合理

    • 当前可能只设置了简单的“到达门”的奖励,而没有对中间行为进行引导(如接近目标、避免碰撞等)。
    • 没有惩罚机制,导致智能体容易随机撞墙或卡住。

    3. 环境状态表示不准确

    • 如果你没有正确地将地图中的障碍物、门的位置、智能体位置等信息编码进状态向量,那么智能体就无法做出有效的决策。

    4. 探索与利用不平衡

    • 如果你没有合理设置探索率(如ε衰减),智能体可能会陷入局部最优或一直撞墙。

    ✅ 二、解决方案(有序列表)

    1. 调整动作空间(小步伐)

    重点部分:

    应使用小步伐,让智能体更精确地控制移动方向和距离。

    # 修改动作空间为小步长
    action_space = Discrete(5)  # 上、下、左、右、不动
    

    如果使用连续动作空间,可以限制速度范围:

    action_space = Box(low=-0.1, high=0.1, shape=(2,))
    

    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
    

    3. 优化状态表示(State Encoding)

    重点部分:

    确保状态向量包含以下信息:

    • 智能体当前位置坐标
    • 目标门的相对位置
    • 周围是否有障碍物(如三面墙)
    • 是否处于死胡同

    示例状态向量结构:

    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,
    }
    

    4. 改进探索策略(Exploration Strategy)

    重点部分:

    使用ε-greedy 或 Ornstein-Uhlenbeck noise 来平衡探索与利用。

    示例代码(使用ε-greedy):

    epsilon = max(0.01, epsilon * 0.995)  # 衰减探索率
    if np.random.rand() < epsilon:
        action = random_action()
    else:
        action = model.predict(state)
    

    5. 处理死胡同与卡死问题

    重点部分:

    可以通过检测是否进入死胡同,若进入则给予惩罚,引导智能体绕行。

    检测死胡同逻辑(伪代码):

    def is_in_dead_end(state):
        # 根据周围墙体判断是否是死胡同
        if state['wall_up'] and state['wall_left'] and state['wall_right']:
            return True
        return False
    

    6. 修改训练循环(Training Loop)

    重点部分:

    确保每一步都更新状态和奖励,并及时记录经验回放(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 或噪声策略 | | 卡死问题 | 检测死胡同并给予惩罚 |


    如果你愿意分享你的完整代码或环境配置,我可以进一步帮你调试和优化。希望这些建议能帮助你成功训练出稳定的强化学习模型!

    评论

报告相同问题?

问题事件

  • 修改了问题 1月16日
  • 修改了问题 1月16日
  • 创建了问题 1月16日