|
当然可以!让我们用一个简化的迷宫示例和 Q-learning 算法来演示 AI 如何通过数百万次试错学习,最终可能选择“回头”作为最优策略的一部分。
假设我们有一个简单的迷宫,如下所示(S:起点, E:出口, #:墙, 移动方向: 上下左右):
AI 从 S 出发,需要到达 E。注意:直接向右是墙,向下然后向右再向上可能是路径(但需要回头向上)。
以下是 Python 代码实现 Q-learning:
- import numpy as np
- # 定义迷宫(0:可走, 1:墙, 2:出口)
- maze = np.array([
- [0, 1, 1],
- [0, 0, 0],
- [1, 1, 2]
- ])
- # 参数
- actions = ['up', 'down', 'left', 'right'] # 动作空间
- num_episodes = 10000 # 训练轮次(模拟“死”多次)
- alpha = 0.1 # 学习率
- gamma = 0.9 # 折扣因子
- epsilon = 0.1 # 探索率
- # 初始化 Q-table(状态:迷宫坐标 (i,j))
- q_table = np.zeros((maze.shape[0], maze.shape[1], len(actions)))
- # 获取所有可走状态(非墙)
- valid_states = []
- for i in range(maze.shape[0]):
- for j in range(maze.shape[1]):
- if maze[i, j] != 1: # 不是墙
- valid_states.append((i, j))
- # Q-learning 训练
- for episode in range(num_episodes):
- # 随机起点(可走位置)
- state = valid_states[np.random.randint(0, len(valid_states))]
- while maze[state] != 2: # 未到出口
- # ε-greedy 选择动作
- if np.random.random() < epsilon:
- action_index = np.random.randint(0, len(actions))
- else:
- action_index = np.argmax(q_table[state[0], state[1]])
- # 执行动作,得到新状态
- action = actions[action_index]
- next_state = list(state)
- if action == 'up':
- next_state[0] -= 1
- elif action == 'down':
- next_state[0] += 1
- elif action == 'left':
- next_state[1] -= 1
- elif action == 'right':
- next_state[1] += 1
- next_state = tuple(next_state)
- # 检查是否越界或撞墙
- if (next_state[0] < 0 or next_state[0] >= maze.shape[0] or
- next_state[1] < 0 or next_state[1] >= maze.shape[1] or
- maze[next_state] == 1):
- reward = -10 # 惩罚撞墙
- next_state = state # 保持原状态
- elif maze[next_state] == 2:
- reward = 100 # 到达出口
- else:
- reward = -1 # 普通移动代价
- # 更新 Q-table
- old_value = q_table[state[0], state[1], action_index]
- next_max = np.max(q_table[next_state[0], next_state[1]])
- new_value = old_value + alpha * (reward + gamma * next_max - old_value)
- q_table[state[0], state[1], action_index] = new_value
- state = next_state # 移动到新状态
- # 训练后,查看最优策略
- print("训练后的 Q-table(部分):")
- for i, j in valid_states:
- best_action = actions[np.argmax(q_table[i, j])]
- print(f"状态 ({i},{j}) 的最优动作: {best_action}")
- # 测试从起点 (0,0) 的路径
- print("\n从起点 (0,0) 的路径演示:")
- state = (0, 0)
- path = [state]
- while maze[state] != 2:
- action_index = np.argmax(q_table[state[0], state[1]])
- action = actions[action_index]
- print(f"状态 {state} 选择动作 {action}")
- # 移动
- next_state = list(state)
- if action == 'up':
- next_state[0] -= 1
- elif action == 'down':
- next_state[0] += 1
- elif action == 'left':
- next_state[1] -= 1
- elif action == 'right':
- next_state[1] += 1
- next_state = tuple(next_state)
- state = next_state
- path.append(state)
- print(f"最终路径: {path}")
复制代码
关键解释:
1. Q-learning 通过更新 Q-table 来学习每个状态-动作的价值。
2. 当 AI 撞墙(reward = -10)或移动(reward = -1)时获得负面奖励,到达出口获得正面奖励(reward = 100)。
3. 经过多次训练后,Q-table 会收敛到最优策略。
4. 在简单迷宫中,AI 可能学会“回头”(例如从 (0,0) 先向下再向右)而不是直接撞墙。
运行代码后,你会看到 AI 从起点 (0,0) 的最优动作可能是 down(而不是向右撞墙),这体现了“回头”策略。
这就是强化学习中的“探索-利用” trade-off:AI 通过大量试错(死数百万次)最终学到有效策略,包括必要时回头。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|