第八篇:强化学习值迭代及代码实现

你好,我是郭震(zhenguo)

前几天我们学习强化学习策略迭代,今天,强化学习第8篇:强化学习值迭代

值迭代是强化学习另一种求解方法,用于找到马尔可夫决策过程(MDP)中的最优值函数。

值迭代

值迭代可以总结为如下几点:

  • 值迭代通过不断迭代更新值函数来逼近最优值函数,从而确定最优策略。

  • 值迭代的关键是在每次迭代中更新值函数。

  • 对于每个状态,通过考虑所有可能的动作和下一个状态,选择能够使值最大化的动作,并计算更新后的值函数。

  • 迭代更新值函数,更新公式也是贝尔曼方程,和策略迭代值函数更新公式一样。

  • 值迭代需要进行多次迭代,直到值函数收敛为止。收敛时,值函数不再发生显著变化。

可以看到:值迭代是比策略迭代更为简单的一种迭代方法。

代码实现

值迭代,求迷宫问题,完整代码。

只使用numpy

import numpy as np

定义迷宫地图,在迷宫地图中,不同的数字代表不同的含义:

  • 0:表示可以通过的空格,即可行走的路径。

  • -1:表示墙壁或障碍物,表示不能通过的障碍物区域。

  • 1:表示目标位置,即终点位置。

其中,0代表可行走的路径,-1代表障碍物或墙壁,1代表迷宫的终点位置。这些数值用于描述迷宫的不同区域,以帮助算法进行路径搜索和价值计算。如下所示:

2858824ed9ac59c541813316e0e3804d.png
# 定义迷宫地图
maze = np.array([
    [0, 0, 0, 0],
    [0, -1, 0, -1],
    [0, 0, 0, 0],
    [-1, 0, -1, 1]
])

定义参数

# 定义参数
gamma = 0.9  # 折扣因子
epsilon = 1e-6  # 收敛阈值

初始值函数

# 初始化值函数
V = np.zeros(maze.shape)

进行值迭代

# 进行值迭代
while True:
    delta = 0
    for i in range(maze.shape[0]):
        for j in range(maze.shape[1]):
            if maze[i, j] == -1 or maze[i, j] == 1:
                continue
            # 计算当前状态的最大价值
            max_value = float("-inf")
            for action in [(0, 1), (0, -1), (1, 0), (-1, 0)]:
                ni, nj = i + action[0], j + action[1]
                if ni >= 0 and ni < maze.shape[0] and nj >= 0 and nj < maze.shape[1] and maze[ni, nj] != -1:
                    max_value = max(max_value, gamma * V[ni, nj])
            # 更新值函数
            new_value = maze[i, j] + max_value
            delta = max(delta, abs(new_value - V[i, j]))
            V[i, j] = new_value
    if delta < epsilon:
        break

# 打印最优值函数
print("最优值函数:")
print(V)

这里面的核心代码就是求解贝尔曼方程:

d8dc27c9e96d90ebd2ad4ef3376f89f6.png

其中, 表示状态  的值函数,即按照某个策略获得的预期回报。 表示选择能够使得值最大化的动作 。 表示对所有可能的下一个状态  和奖励  进行求和。 表示在状态  下执行动作  后转移到状态  且获得奖励  的概率。 是折扣因子,用于平衡当前和未来的奖励。

在上述代码中,首先定义了迷宫地图,并设置了折扣因子和收敛阈值。然后,通过值迭代算法逐步更新值函数,直到值函数的变化小于收敛阈值为止。最后,打印出最优的值函数。

感谢你的点赞和转发,让我更新更有动力

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
强化学习中的价迭代算法可以通过以下Python代码实现: ```python import numpy as np def value_iteration(env, gamma=0.9, theta=0.0001): # 初始化状态函数 V = np.zeros(env.n_states) while True: delta = 0 # 针对每个状态进行迭代更新 for s in range(env.n_states): v = V[s] # 计算状态s的最优动作函数 q_values = [] for a in range(env.n_actions): q_value = 0 for next_s in range(env.n_states): reward = env.get_reward(s, a, next_s) q_value += env.get_transition_prob(s, a, next_s) * (reward + gamma * V[next_s]) q_values.append(q_value) # 更新状态函数为最优动作函数中的最大 V[s] = max(q_values) # 计算状态函数更新的最大差异 delta = max(delta, abs(v - V[s])) # 如果状态函数的更新差异小于阈theta,则停止迭代 if delta < theta: break return V ``` 在上述代码中,`env` 表示强化学习环境,`gamma` 是折扣因子,`theta` 是迭代停止的阈。`env.n_states` 表示环境的状态数,`env.n_actions` 表示环境的动作数。`env.get_reward(s, a, next_s)` 返回在状态 `s` 执行动作 `a` 后转移到状态 `next_s` 的即时奖励,`env.get_transition_prob(s, a, next_s)` 返回从状态 `s` 执行动作 `a` 后转移到状态 `next_s` 的转移概率。 使用上述代码,可以得到每个状态的最优函数。根据最优函数,还可以进一步得到最优策略,具体实现可以通过在每个状态上选择具有最大动作函数的动作来实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值