基于Q-learning的强化学习案例(附python代码)

该文章展示了如何运用Q-learning算法解决一个简单的路径规划问题。在给定的状态空间(0-8的网格,避开7和8)中,目标是从0到6,通过调整学习率和折扣因子,逐步优化Q表以找到最优路径。Python代码实现了这个过程,包括探索和利用策略的平衡以及状态和动作的更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于Q-learning的强化学习案例

如图所示的一个表格,初始位置伟黄色的0,目标终点为绿色的6,想要通过策略学习找到从0到6的最短路径,其中红色的7和8是禁止通过的位置,Agent经过这两个位置会game over。
在这里插入图片描述
以下通过强化学习的Q-Learning方法来学习策略,找到最优的路径方案。

状态空间S 即为0~8
动作空间A 可以向左、向下和向右运动,设置为0 1 2
根据状态和动作,预先给定的奖励值在不同动作和状态下如下图
在这里插入图片描述
利用Q-learning算法,编写python代码如下

# 强化学习走Q表
import numpy as np
R = [[-1000, -100, 0],[-5, 0, -100],[-100, 0, 0],[-1000, -1000, 0],[-5, -1000, 100],[-5, 100, -1000],[0, -1000, -1000],[-1000, 0, 0],[0, 0, -1000]]
S = [[0, 7, 1], [0, 2, 8], [7, 4, 5], [3, 3, 4], [3, 4, 6], [2, 6, 5], [4, 6, 6], [7, 3, 2], [1, 5, 8]]
Q = np.zeros([9, 3])
gamma = 0.9
alpha = 0.9
cnt = 0
epoch = 10000
done = False
action = 0
state = 0
rt = 0
road = [0] #构建一个数组存放路径,0表示默认位置,s1
while cnt<epoch:
    state = 0
    done = False
    while not done:
        #贪心算法,确保不会一直按照已知的路走,有10%概率探索未知的方法
        if np.random.rand()<0.9:
            rt = max(Q[state,:])
            action = [index for index, item in enumerate(Q[state,:]) if item == rt]
            #当已知的路径有多条时随机选择一条
            if len(action) > 1:
                action = action[int(np.random.randint(0,len(action),size=(1,1)))]
            else:
                action = action[0]
        else:
            #随机去探索
            action = int(np.random.randint(0,3,size=(1,1)))
        #执行action切换到新的state
        state_new = S[state][action]
        #更新Q表
        Q[state,action] = Q[state,action] + alpha*(R[state][action]+gamma*max(Q[state_new,:])-Q[state,action])
        #将迭代state切换到新的状态
        state = state_new
        #记录走过的路径
        road.append(state)
        #6是成功,7,8是失败,均结束
        if int(state) == 6 or int(state) ==7 or int(state) == 8:
            done = True
    cnt = cnt + 1
    print(road)
    road = [0] #清空当前路径,开始下一次迭代
print(Q)
### 关于Python中的强化学习示例代码与教程 #### 使用Q-Learning解决CartPole问题 在介绍强化学习基本概念的同时,也提供了具体的实践指导。通过使用`OpenAI Gym`库创建环境并应用Q-learning算法解决问题。下面展示的是一个简化版的实现方式[^2]。 ```python import gym import numpy as np from collections import defaultdict env = gym.make('CartPole-v0') alpha = 0.1 # 学习率 gamma = 0.9 # 折扣因子 epsilon = 0.1 # 探索概率 q_table = defaultdict(lambda: np.zeros(env.action_space.n)) def choose_action(state, epsilon): if np.random.uniform(0, 1) < epsilon: action = env.action_space.sample() else: action = np.argmax(q_table[state]) return action for episode in range(2000): state = tuple(env.reset()) done = False while not done: action = choose_action(state, epsilon) next_state, reward, done, _ = env.step(action) next_state = tuple(next_state) old_value = q_table[state][action] next_max = np.max(q_table[next_state]) new_value = (1 - alpha) * old_value + alpha * (reward + gamma * next_max) q_table[state][action] = new_value state = next_state ``` 此段代码实现了基于表格形式存储状态动作价值函数(即Q表),并通过迭代更新这些值来优化智能体的行为策略。对于每一个episode,在每一步中都会根据当前的状态选取行动,并依据获得奖励以及下一个可能达到的最大期望回报调整对应的Q值。 #### 训练智能体玩走迷宫游戏 另一个有趣的例子是让智能体学会穿越迷宫到达目标位置。这可以通过定义适当的任务空间和奖励机制来完成。这里给出了一种利用Python编程语言配合特定框架来进行此类实验的方法概述[^1]: - 定义迷宫布局及其起点终点; - 设定移动规则及相应的即时反馈信号; - 构建模型预测最佳路径直至收敛至最优解; 尽管具体细节会有所不同,但核心思路依然围绕着探索未知区域、评估不同决策的效果展开。 #### 策略梯度方法简介 除了上述提到的价值导向型方法外,还有另一种重要的范式——直接操作政策本身。这种方法被称为策略梯度法,它允许更灵活地处理连续控制等问题。以下是采用PyTorch构建神经网络作为代理执行器的一个简单案例说明[^3]: ```python import torch import torch.nn.functional as F from torch.distributions import Categorical class PolicyNet(torch.nn.Module): def __init__(self): super(PolicyNet, self).__init__() self.fc1 = torch.nn.Linear(in_features=4, out_features=128) self.fc2 = torch.nn.Linear(in_features=128, out_features=2) def forward(self, x): x = F.relu(self.fc1(x)) x = self.fc2(x) return F.softmax(x, dim=-1) policy_net = PolicyNet() optimizer = torch.optim.Adam(policy_net.parameters(), lr=1e-2) # 假设已经有一个batch的数据 states_batch = ... actions_batch = ... rewards_batch = ... log_probs = [] for i in range(len(states_batch)): probs = policy_net.forward(states_batch[i]) dist = Categorical(probs) log_prob = dist.log_prob(actions_batch[i]) log_probs.append(log_prob.unsqueeze(-1)) loss = (-torch.cat(log_probs).squeeze() * rewards_batch).mean() optimizer.zero_grad() loss.backward() optimizer.step() ``` 这段代码片段展示了如何建立一个两层全连接前馈网络用于近似给定状态下采取各可行行为的概率分布,并据此计算损失函数以驱动参数更新过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Haleine

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值