第3课_Q-learning解决迷宫问题
热度🔥:69 免费课程
授课语音
实践:使用Q-learning解决迷宫问题
在本实践中,我们将使用Q-learning算法解决一个简单的迷宫问题。迷宫环境由一个网格构成,代理从起点出发,目标是找到终点,并通过与环境的交互逐步学习最佳的路径。
1. 迷宫问题描述
假设迷宫是一个二维网格,代理的位置可以用(x, y)
坐标表示。迷宫有一个起点和一个终点,代理需要通过一系列的动作(上、下、左、右)移动到终点。
- 奖励:当代理到达终点时,获得奖励+1;在每一步移动中,代理获得一个小的负奖励(例如-0.1),鼓励代理尽快找到终点。
- 状态:代理的当前位置
(x, y)
。 - 动作:上(Up)、下(Down)、左(Left)、右(Right)。
- Q值更新:根据Q-learning算法,通过
Q(state, action)
来表示在某个状态下选择某个动作的价值。
2. 环境设置
我们将定义一个简单的迷宫环境,代理可以在网格中上下左右移动,终点为一个特定的位置,起点为另一个位置。
2.1 迷宫类
import random
class Maze:
def __init__(self, size=(5, 5), start=(0, 0), goal=(4, 4)):
self.size = size # 迷宫的大小
self.start = start # 起点位置
self.goal = goal # 终点位置
self.state = start # 代理的初始状态
def reset(self):
self.state = self.start # 重置代理位置为起点
return self.state
def step(self, action):
x, y = self.state
# 根据动作更新位置
if action == 'up' and x > 0:
x -= 1
elif action == 'down' and x < self.size[0] - 1:
x += 1
elif action == 'left' and y > 0:
y -= 1
elif action == 'right' and y < self.size[1] - 1:
y += 1
self.state = (x, y)
# 判断是否到达终点
if self.state == self.goal:
return self.state, 1 # 到达终点,奖励+1
else:
return self.state, -0.1 # 未到终点,奖励-0.1
2.2 Q-learning代理类
class QLearningAgent:
def __init__(self, actions, learning_rate=0.1, discount_factor=0.9, epsilon=0.1):
self.actions = actions # 可用的动作
self.q_table = {} # Q值表
self.learning_rate = learning_rate # 学习率
self.discount_factor = discount_factor # 折扣因子
self.epsilon = epsilon # 探索率
def choose_action(self, state):
if state not in self.q_table:
self.q_table[state] = [0 for _ in self.actions] # 初始化Q值表
if random.uniform(0, 1) < self.epsilon: # 以epsilon的概率进行探索
return random.choice(self.actions)
else: # 否则选择最大Q值对应的动作
return self.actions[self.q_table[state].index(max(self.q_table[state]))]
def learn(self, state, action, reward, next_state):
if next_state not in self.q_table:
self.q_table[next_state] = [0 for _ in self.actions] # 初始化Q值表
# 更新Q值
self.q_table[state][self.actions.index(action)] += self.learning_rate * \
(reward + self.discount_factor * max(self.q_table[next_state]) - self.q_table[state][self.actions.index(action)])
2.3 迷宫Q-learning训练过程
# 初始化环境和代理
maze = Maze(size=(5, 5), start=(0, 0), goal=(4, 4))
actions = ['up', 'down', 'left', 'right']
agent = QLearningAgent(actions=actions)
# 强化学习过程
num_episodes = 500 # 训练500回合
for episode in range(num_episodes):
state = maze.reset() # 重置迷宫
total_reward = 0
while state != maze.goal:
action = agent.choose_action(state) # 选择动作
next_state, reward = maze.step(action) # 环境反馈
agent.learn(state, action, reward, next_state) # 更新Q值
state = next_state # 更新状态
total_reward += reward
print(f"Episode {episode + 1}: Total Reward = {total_reward}")
3. 结果与总结
通过多次与环境的交互,代理逐渐学习到从起点到终点的最优路径。在每一回合中,代理通过Q-learning
更新其策略,并在与环境交互时选择最优动作。
- 奖励:代理根据在迷宫中的表现不断更新其Q值。在接近终点时,代理会得到正奖励,而在离终点较远时,会得到负奖励。
- 策略:随着训练的进行,代理的Q值表逐渐收敛,最终学到从起点到终点的最短路径。
通过Q-learning算法,代理能够在没有事先了解环境的情况下,通过与环境的互动不断优化其策略,最终找到解决问题的最优方法。
4. 总结
在这个实践中,我们使用Q-learning解决了迷宫问题,通过状态-动作值函数(Q值)来优化代理的策略。Q-learning通过奖励和惩罚机制逐步学习到最优路径,展示了强化学习在实际问题中的应用。