【机器学习】强化学习(二)基于动态规划的算法

news2025/4/22 19:02:53

值函数可以分为状态价值函数和动作价值函数,分别适用于哪些强化学习问题

5c88b6ef9dda51880ed8252c068d848d.png

beb2b53fe09d743cd83dcf7b181d5c6c.png

二、基于动态规划的算法

b06c388efe7b6c47680ddd8f2118f3ac.png

d180082e8ec46ddc468cd9906c6cc137.png

3e1d3055cdd2d9d309eae850e6a5e4c9.png

2.1 策略迭代算法

05097787978477fb0adcdee1174be2a5.png

0f9b78c2334935c60030b3d0cfa9a843.png

示例:

3a82b7accb3ec11d0cffbd91401a184f.png

15d44318fd003b9618f5ba3a19dcd095.png

(改进的) 策略迭代

03738fbc1c1ee498630a3dc3d4d79fec.png

代码

首先定义了一些参数,如奖励、折扣因子、最大误差等,然后初始化了一个网格世界的环境,包括状态、动作、价值函数和策略。接着,它定义了一些函数,用于打印网格世界的状态或策略、计算状态的期望价值函数、对策略进行评估和改进等。最后,它使用了策略迭代的算法,不断地更新策略和价值函数,直到找到最优的策略,并打印出初始的随机策略和最终的最优策略。

import random # 导入随机模块,用于生成随机数


# Arguments
REWARD = -0.01 # 定义非终止状态的常数奖励,这里是负数,表示每走一步都有一定的代价
DISCOUNT = 0.99 # 定义折扣因子,表示未来奖励的衰减程度,越接近1表示越重视长期奖励
MAX_ERROR = 10**(-3) # 定义最大误差,表示当状态的价值函数的变化小于这个值时,认为收敛到稳定值


# Set up the initial environment
NUM_ACTIONS = 4 # 定义动作的数量,这里是4个,分别是上下左右四个方向的移动。policy里的0~3. # Down, Left, Up, Right
ACTIONS = [(1, 0), (0, -1), (-1, 0), (0, 1)] # 定义动作的具体效果,表示每个动作对行和列的坐标的影响,例如(1, 0)表示向下移动一格,行坐标加1,列坐标不变
NUM_ROW = 3 # 定义网格世界的行数
NUM_COL = 4 # 定义网格世界的列数
U = [[0, 0, 0, 1], [0, 0, 0, -1], [0, 0, 0, 0], [0, 0, 0, 0]] # 定义每个状态的初始价值函数,这里只有两个终止状态有正负1的奖励,其他状态都是0
policy = [[random.randint(0, 3) for j in range(NUM_COL)] for i in range(NUM_ROW)] # 随机生成一个初始策略,每个状态随机选择一个动作,用0到3的整数表示


# Visualization
def printEnvironment(arr, policy=False): # 定义一个函数,用于打印网格世界的状态或策略
    res = "" # 初始化一个空字符串,用于存储打印的结果
    for r in range(NUM_ROW): # 遍历每一行
        res += "|" # 在每一行的开头加上一个竖线符号
        for c in range(NUM_COL): # 遍历每一列
            if r == c == 1: # 如果是中间的墙壁状态,用WALL表示
                val = "WALL"
            elif r <= 1 and c == 3: # 如果是右上角或右下角的终止状态,用+1或-1表示
                val = "+1" if r == 0 else "-1"
            else: # 如果是其他状态,用动作的方向表示,例如Down, Left, Up, Right
                val = ["Down", "Left", "Up", "Right"][arr[r][c]]
            res += " " + val[:5].ljust(5) + " |" # 格式化输出,每个状态占6个字符,不足的用空格补齐,然后加上一个竖线符号
        res += "\n" # 每一行结束后换行
    print(res) # 打印结果


# Get the utility of the state reached by performing the given action from the given state
def getU(U, r, c, action): # 定义一个函数,用于获取从给定的状态执行给定的动作后到达的状态的价值函数
    dr, dc = ACTIONS[action] # 根据动作的编号,获取动作对行和列坐标的影响
    newR, newC = r+dr, c+dc # 计算新的行和列坐标
    if newR < 0 or newC < 0 or newR >= NUM_ROW or newC >= NUM_COL or (newR == newC == 1): # 如果新的坐标超出了网格的范围,或者碰到了墙壁,表示无效的移动
        return U[r][c] # 返回原来的状态的价值函数
    else: # 否则
        return U[newR][newC] # 返回新的状态的价值函数


# Calculate the utility of a state given an action
def calculateU(U, r, c, action): # 定义一个函数,用于计算给定状态和动作的期望价值函数
    u = REWARD # 初始化价值函数为常数奖励
    # 状态转移概率 0.1左偏 0.8前行 0.1右偏
    u += 0.1 * DISCOUNT * getU(U, r, c, (action-1)%4) # 加上向左偏转10%的概率的折扣后的价值函数
    u += 0.8 * DISCOUNT * getU(U, r, c, action) # 加上按照策略执行80%的概率的折扣后的价值函数
    u += 0.1 * DISCOUNT * getU(U, r, c, (action+1)%4) # 加上向右偏转10%的概率的折扣后的价值函数
    return u # 返回计算的结果


# Perform some simplified value iteration steps to get an approximation of the utilities
def policyEvaluation(policy, U): # 定义一个函数,用于对给定的策略进行策略评估,即计算策略对应的价值函数
    while True: # 不断循环,直到收敛
        nextU = [[0, 0, 0, 1], [0, 0, 0, -1], [0, 0, 0, 0], [0, 0, 0, 0]] # 初始化下一轮的价值函数,终止状态的价值函数不变,其他状态为0
        error = 0 # 初始化最大误差为0。 相邻两次迭代的价值函数的差值
        for r in range(NUM_ROW): # 遍历每一行
            for c in range(NUM_COL): # 遍历每一列
                if (r <= 1 and c == 3) or (r == c == 1): # 如果是终止状态或墙壁状态,跳过
                    continue
                nextU[r][c] = calculateU(U, r, c, policy[r][c])# 更新状态价值函数 # 根据当前的价值函数和策略,计算下一轮的价值函数,这里使用了简化的贝尔曼更新公式
                error = max(error, abs(nextU[r][c]-U[r][c])) # 更新状态价值函数最大差值
        U = nextU # 用下一轮的价值函数替换当前的价值函数
        if error < MAX_ERROR * (1-DISCOUNT) / DISCOUNT: # 如果最大误差小于一个阈值(MAX_ERROR * (1-DISCOUNT) / DISCOUNT  人工设定的),表示收敛
            break # 退出循环
    return U # 返回收敛后的价值函数


def policyIteration(policy, U): # 定义一个函数,用于对给定的策略进行策略迭代,即不断地进行策略评估和策略改进,直到找到最优策略
    print("During the policy iteration:\n") # 打印提示信息
    while True: # 不断循环,直到收敛
        U = policyEvaluation(policy, U) # 对当前的策略进行策略评估,得到价值函数
        unchanged = True # 初始化一个标志,表示策略是否发生了改变
        for r in range(NUM_ROW): # 遍历每一行
            for c in range(NUM_COL): # 遍历每一列
                if (r <= 1 and c == 3) or (r == c == 1): # 如果是终止状态或墙壁状态,跳过
                    continue
                maxAction, maxU = None, -float("inf") # 初始化最大价值函数和对应的动作为无穷小和空值
                for action in range(NUM_ACTIONS): # 遍历所有可能的动作
                    u = calculateU(U, r, c, action) # 计算当前状态和动作的期望价值函数
                    if u > maxU: # 如果当前的价值函数大于最大价值函数
                        maxAction, maxU = action, u # 更新最大价值函数和对应的动作
                if maxU > calculateU(U, r, c, policy[r][c]): # 如果最大价值函数大于当前策略(所确定动作)对应的价值函数
                    policy[r][c] = maxAction # 更新策略为最大价值函数对应的动作
                    unchanged = False # 标记策略发生了改变
        if unchanged: # 如果策略没有发生改变,表示已经找到了最优策略
            break # 退出循环
        printEnvironment(policy) # 打印当前的策略
    return policy # 返回最优策略


# Print the initial environment
print("The initial random policy is:\n") # 打印提示信息
printEnvironment(policy) # 打印初始的随机策略


# Policy iteration
policy = policyIteration(policy, U) # 调用策略迭代函数,得到最优策略


# Print the optimal policy
print("The optimal policy is:\n") # 打印提示信息
printEnvironment(policy) # 打印最优策略

输出结果:

The initial random policy is:


| Up    | Right | Right | +1    |
| Down  | WALL  | Left  | -1    |
| Left  | Up    | Right | Left  |


During the policy iteration:


| Up    | Right | Right | +1    |
| Up    | WALL  | Up    | -1    |
| Right | Right | Up    | Down  |


| Right | Right | Right | +1    |
| Up    | WALL  | Left  | -1    |
| Up    | Right | Up    | Down  |


| Right | Right | Right | +1    |
| Up    | WALL  | Left  | -1    |
| Up    | Left  | Up    | Down  |


| Right | Right | Right | +1    |
| Up    | WALL  | Left  | -1    |
| Up    | Left  | Left  | Down  |


The optimal policy is:


| Right | Right | Right | +1    |
| Up    | WALL  | Left  | -1    |
| Up    | Left  | Left  | Down  |

2.2  价值迭代算法

471bb217f1b5d058491209c7c4a292f0.png

ff8037db9b1a7a2d51ec3f37bc094ec4.png

 示例-价值迭代算法

cefc073eeba3ddaf9fbd3d0945757058.png

代码

首先定义了一些参数,如奖励、折扣因子、最大误差等,然后初始化了一个网格世界的环境,包括状态、动作、价值函数。接着,它定义了一些函数,用于打印网格世界的状态或策略、计算状态的期望价值函数、对价值函数进行价值迭代等。最后,它使用了价值迭代的算法,不断地更新价值函数,直到收敛,并根据价值函数获取最优的策略,并打印出初始的价值函数和最终的最优策略。

REWARD = -0.01 # 定义非终止状态的常数奖励,这里是负数,表示每走一步都有一定的代价
DISCOUNT = 0.99 # 定义折扣因子,表示未来奖励的衰减程度,越接近1表示越重视长期奖励
MAX_ERROR = 10**(-3) # 定义最大误差,表示当状态的价值函数的变化小于这个值时,认为收敛到稳定值


# Set up the initial environment
NUM_ACTIONS = 4 # 定义动作的数量,这里是4个,分别是上下左右四个方向的移动
ACTIONS = [(1, 0), (0, -1), (-1, 0), (0, 1)] # 定义动作的具体效果,表示每个动作对行和列的坐标的影响,例如(1, 0)表示向下移动一格,行坐标加1,列坐标不变
NUM_ROW = 3 # 定义网格世界的行数
NUM_COL = 4 # 定义网格世界的列数
U = [[0, 0, 0, 1], [0, 0, 0, -1], [0, 0, 0, 0], [0, 0, 0, 0]] # 定义每个状态的初始价值函数,这里只有两个终止状态有正负1的奖励,其他状态都是0


# Visualization
def printEnvironment(arr, policy=False): # 定义一个函数,用于打印网格世界的状态或策略
    res = "" # 初始化一个空字符串,用于存储打印的结果
    for r in range(NUM_ROW): # 遍历每一行
        res += "|" # 在每一行的开头加上一个竖线符号
        for c in range(NUM_COL): # 遍历每一列
            if r == c == 1: # 如果是中间的墙壁状态,用WALL表示
                val = "WALL"
            elif r <= 1 and c == 3: # 如果是右上角或右下角的终止状态,用+1或-1表示
                val = "+1" if r == 0 else "-1"
            else: # 如果是其他状态
                if policy: # 如果是打印策略,用动作的方向表示,例如Down, Left, Up, Right
                    val = ["Down", "Left", "Up", "Right"][arr[r][c]]
                else: # 如果是打印价值函数,用状态的价值表示,转换为字符串
                    val = str(arr[r][c])
            res += " " + val[:5].ljust(5) + " |" # 格式化输出,每个状态占6个字符,不足的用空格补齐,然后加上一个竖线符号
        res += "\n" # 每一行结束后换行
    print(res) # 打印结果


# Get the utility of the state reached by performing the given action from the given state
def getU(U, r, c, action): # 定义一个函数,用于获取从给定的状态执行给定的动作后到达的状态的价值函数
    dr, dc = ACTIONS[action] # 根据动作的编号,获取动作对行和列坐标的影响
    newR, newC = r+dr, c+dc # 计算新的行和列坐标
    if newR < 0 or newC < 0 or newR >= NUM_ROW or newC >= NUM_COL or (newR == newC == 1): # 如果新的坐标超出了网格的范围,或者碰到了墙壁,表示无效的移动
        return U[r][c] # 返回原来的状态的价值函数
    else: # 否则
        return U[newR][newC] # 返回新的状态的价值函数


# Calculate the utility of a state given an action
def calculateU(U, r, c, action): # 定义一个函数,用于计算给定状态和动作的期望价值函数
    u = REWARD # 初始化价值函数为常数奖励
    u += 0.1 * DISCOUNT * getU(U, r, c, (action-1)%4) # 加上向左偏转10%的概率的折扣后的价值函数
    u += 0.8 * DISCOUNT * getU(U, r, c, action) # 加上按照策略执行80%的概率的折扣后的价值函数
    u += 0.1 * DISCOUNT * getU(U, r, c, (action+1)%4) # 加上向右偏转10%的概率的折扣后的价值函数
    return u # 返回计算的结果


#价值迭代利用贝尔曼最优性方程来鞥新状态价值函数,每次选择在当前状态下达到最优值的动作
def valueIteration(U): # 定义一个函数,用于对价值函数进行价值迭代,即不断地更新价值函数,直到收敛
    print("During the value iteration:\n") # 打印提示信息
    while True: # 不断循环,直到收敛
        nextU = [[0, 0, 0, 1], [0, 0, 0, -1], [0, 0, 0, 0], [0, 0, 0, 0]] # 初始化下一轮的价值函数,终止状态的价值函数不变,其他状态为0
        error = 0 # 初始化最大误差为0
        for r in range(NUM_ROW): # 遍历每一行
            for c in range(NUM_COL): # 遍历每一列
                if (r <= 1 and c == 3) or (r == c == 1): # 如果是终止状态或墙壁状态,跳过
                    continue
                nextU[r][c] = max([calculateU(U, r, c, action) for action in range(NUM_ACTIONS)]) # 根据当前的价值函数和所有可能的动作,计算下一轮的价值函数,这里使用了贝尔曼最优化更新公式
                error = max(error, abs(nextU[r][c]-U[r][c])) # 更新最大误差
        U = nextU # 用下一轮的价值函数替换当前的价值函数
        printEnvironment(U) # 打印当前的价值函数
        if error < MAX_ERROR * (1-DISCOUNT) / DISCOUNT: # 如果最大误差小于一个阈值,表示收敛
            break # 退出循环
    return U # 返回收敛后的价值函数


# Get the optimal policy from U
def getOptimalPolicy(U): # 定义一个函数,用于根据价值函数获取最优策略,即每个状态选择使得价值函数最大的动作
    policy = [[-1, -1, -1, -1] for i in range(NUM_ROW)] # 初始化策略为-1,表示无效的动作
    for r in range(NUM_ROW): # 遍历每一行
        for c in range(NUM_COL): # 遍历每一列
            if (r <= 1 and c == 3) or (r == c == 1): # 如果是终止状态或墙壁状态,跳过
                continue
            # Choose the action that maximizes the utility
            maxAction, maxU = None, -float("inf") # 初始化最大价值函数和对应的动作为无穷小和空值
            for action in range(NUM_ACTIONS): # 遍历所有可能的动作
                u = calculateU(U, r, c, action) # 计算当前状态和动作的期望价值函数
                if u > maxU: # 如果当前的价值函数大于最大价值函数
                    maxAction, maxU = action, u # 更新最大价值函数和对应的动作
            policy[r][c] = maxAction # 将当前状态的策略更新为最大价值函数对应的动作
    return policy # 返回最优策略


# Print the initial environment
print("The initial U is:\n") # 打印提示信息
printEnvironment(U) # 打印初始的价值函数


# Value iteration
U = valueIteration(U) # 调用价值迭代函数,得到收敛后的价值函数


# Get the optimal policy from U and print it
policy = getOptimalPolicy(U) # 调用获取最优策略的函数,得到最优策略
print("The optimal policy is:\n") # 打印提示信息
printEnvironment(policy, True) # 打印最优策略

输出结果:

The initial U is:


| 0     | 0     | 0     | +1    |
| 0     | WALL  | 0     | -1    |
| 0     | 0     | 0     | 0     |


During the value iteration:


| -0.01 | -0.01 | 0.782 | +1    |
| -0.01 | WALL  | -0.01 | -1    |
| -0.01 | -0.01 | -0.01 | -0.01 |


| -0.01 | 0.607 | 0.858 | +1    |
| -0.01 | WALL  | 0.509 | -1    |
| -0.01 | -0.01 | -0.01 | -0.01 |


| 0.467 | 0.790 | 0.917 | +1    |
| -0.02 | WALL  | 0.621 | -1    |
| -0.02 | -0.02 | 0.389 | -0.02 |


| 0.659 | 0.873 | 0.934 | +1    |
| 0.354 | WALL  | 0.679 | -1    |
| -0.03 | 0.292 | 0.476 | 0.196 |


| 0.781 | 0.902 | 0.941 | +1    |
| 0.582 | WALL  | 0.698 | -1    |
| 0.295 | 0.425 | 0.576 | 0.287 |


| 0.840 | 0.914 | 0.944 | +1    |
| 0.724 | WALL  | 0.705 | -1    |
| 0.522 | 0.530 | 0.613 | 0.375 |


| 0.869 | 0.919 | 0.945 | +1    |
| 0.798 | WALL  | 0.708 | -1    |
| 0.667 | 0.580 | 0.638 | 0.414 |


| 0.883 | 0.920 | 0.945 | +1    |
| 0.836 | WALL  | 0.709 | -1    |
| 0.746 | 0.634 | 0.649 | 0.437 |


| 0.889 | 0.921 | 0.945 | +1    |
| 0.854 | WALL  | 0.710 | -1    |
| 0.789 | 0.706 | 0.658 | 0.449 |


| 0.892 | 0.921 | 0.945 | +1    |
| 0.863 | WALL  | 0.711 | -1    |
| 0.815 | 0.754 | 0.685 | 0.456 |


| 0.893 | 0.921 | 0.946 | +1    |
| 0.867 | WALL  | 0.714 | -1    |
| 0.829 | 0.785 | 0.726 | 0.478 |


| 0.894 | 0.921 | 0.946 | +1    |
| 0.869 | WALL  | 0.721 | -1    |
| 0.837 | 0.802 | 0.754 | 0.513 |


| 0.894 | 0.922 | 0.947 | +1    |
| 0.870 | WALL  | 0.730 | -1    |
| 0.841 | 0.811 | 0.771 | 0.539 |


| 0.895 | 0.922 | 0.948 | +1    |
| 0.870 | WALL  | 0.738 | -1    |
| 0.843 | 0.816 | 0.781 | 0.555 |


| 0.895 | 0.923 | 0.948 | +1    |
| 0.871 | WALL  | 0.746 | -1    |
| 0.844 | 0.819 | 0.787 | 0.565 |


| 0.896 | 0.924 | 0.949 | +1    |
| 0.871 | WALL  | 0.752 | -1    |
| 0.844 | 0.820 | 0.790 | 0.571 |


| 0.897 | 0.925 | 0.950 | +1    |
| 0.872 | WALL  | 0.758 | -1    |
| 0.845 | 0.821 | 0.792 | 0.577 |


| 0.898 | 0.926 | 0.951 | +1    |
| 0.873 | WALL  | 0.763 | -1    |
| 0.846 | 0.822 | 0.794 | 0.583 |


| 0.898 | 0.926 | 0.951 | +1    |
| 0.874 | WALL  | 0.767 | -1    |
| 0.846 | 0.822 | 0.795 | 0.588 |


| 0.899 | 0.927 | 0.952 | +1    |
| 0.874 | WALL  | 0.770 | -1    |
| 0.847 | 0.823 | 0.796 | 0.592 |


| 0.900 | 0.927 | 0.952 | +1    |
| 0.875 | WALL  | 0.773 | -1    |
| 0.848 | 0.824 | 0.797 | 0.596 |


| 0.900 | 0.928 | 0.952 | +1    |
| 0.876 | WALL  | 0.775 | -1    |
| 0.849 | 0.825 | 0.798 | 0.600 |


| 0.900 | 0.928 | 0.953 | +1    |
| 0.876 | WALL  | 0.777 | -1    |
| 0.849 | 0.825 | 0.799 | 0.604 |


| 0.901 | 0.928 | 0.953 | +1    |
| 0.877 | WALL  | 0.779 | -1    |
| 0.850 | 0.826 | 0.800 | 0.607 |


| 0.901 | 0.928 | 0.953 | +1    |
| 0.877 | WALL  | 0.781 | -1    |
| 0.850 | 0.827 | 0.800 | 0.610 |


| 0.901 | 0.929 | 0.953 | +1    |
| 0.877 | WALL  | 0.782 | -1    |
| 0.851 | 0.827 | 0.801 | 0.613 |


| 0.902 | 0.929 | 0.953 | +1    |
| 0.878 | WALL  | 0.783 | -1    |
| 0.851 | 0.827 | 0.802 | 0.615 |


| 0.902 | 0.929 | 0.953 | +1    |
| 0.878 | WALL  | 0.784 | -1    |
| 0.851 | 0.828 | 0.802 | 0.618 |


| 0.902 | 0.929 | 0.954 | +1    |
| 0.878 | WALL  | 0.785 | -1    |
| 0.851 | 0.828 | 0.803 | 0.620 |


| 0.902 | 0.929 | 0.954 | +1    |
| 0.878 | WALL  | 0.785 | -1    |
| 0.852 | 0.828 | 0.803 | 0.622 |


| 0.902 | 0.929 | 0.954 | +1    |
| 0.878 | WALL  | 0.786 | -1    |
| 0.852 | 0.828 | 0.803 | 0.623 |


| 0.902 | 0.929 | 0.954 | +1    |
| 0.878 | WALL  | 0.786 | -1    |
| 0.852 | 0.829 | 0.803 | 0.625 |


| 0.902 | 0.929 | 0.954 | +1    |
| 0.879 | WALL  | 0.787 | -1    |
| 0.852 | 0.829 | 0.804 | 0.626 |


| 0.902 | 0.929 | 0.954 | +1    |
| 0.879 | WALL  | 0.787 | -1    |
| 0.852 | 0.829 | 0.804 | 0.628 |


| 0.902 | 0.930 | 0.954 | +1    |
| 0.879 | WALL  | 0.787 | -1    |
| 0.852 | 0.829 | 0.804 | 0.629 |


| 0.903 | 0.930 | 0.954 | +1    |
| 0.879 | WALL  | 0.788 | -1    |
| 0.852 | 0.829 | 0.804 | 0.630 |


| 0.903 | 0.930 | 0.954 | +1    |
| 0.879 | WALL  | 0.788 | -1    |
| 0.852 | 0.829 | 0.804 | 0.631 |


| 0.903 | 0.930 | 0.954 | +1    |
| 0.879 | WALL  | 0.788 | -1    |
| 0.852 | 0.829 | 0.804 | 0.632 |


| 0.903 | 0.930 | 0.954 | +1    |
| 0.879 | WALL  | 0.788 | -1    |
| 0.853 | 0.829 | 0.804 | 0.632 |


| 0.903 | 0.930 | 0.954 | +1    |
| 0.879 | WALL  | 0.788 | -1    |
| 0.853 | 0.829 | 0.805 | 0.633 |


| 0.903 | 0.930 | 0.954 | +1    |
| 0.879 | WALL  | 0.788 | -1    |
| 0.853 | 0.829 | 0.805 | 0.634 |


| 0.903 | 0.930 | 0.954 | +1    |
| 0.879 | WALL  | 0.789 | -1    |
| 0.853 | 0.829 | 0.805 | 0.634 |


| 0.903 | 0.930 | 0.954 | +1    |
| 0.879 | WALL  | 0.789 | -1    |
| 0.853 | 0.830 | 0.805 | 0.635 |


| 0.903 | 0.930 | 0.954 | +1    |
| 0.879 | WALL  | 0.789 | -1    |
| 0.853 | 0.830 | 0.805 | 0.635 |


| 0.903 | 0.930 | 0.954 | +1    |
| 0.879 | WALL  | 0.789 | -1    |
| 0.853 | 0.830 | 0.805 | 0.636 |


| 0.903 | 0.930 | 0.954 | +1    |
| 0.879 | WALL  | 0.789 | -1    |
| 0.853 | 0.830 | 0.805 | 0.636 |


| 0.903 | 0.930 | 0.954 | +1    |
| 0.879 | WALL  | 0.789 | -1    |
| 0.853 | 0.830 | 0.805 | 0.636 |


| 0.903 | 0.930 | 0.954 | +1    |
| 0.879 | WALL  | 0.789 | -1    |
| 0.853 | 0.830 | 0.805 | 0.637 |


| 0.903 | 0.930 | 0.954 | +1    |
| 0.879 | WALL  | 0.789 | -1    |
| 0.853 | 0.830 | 0.805 | 0.637 |


| 0.903 | 0.930 | 0.954 | +1    |
| 0.879 | WALL  | 0.789 | -1    |
| 0.853 | 0.830 | 0.805 | 0.637 |


| 0.903 | 0.930 | 0.954 | +1    |
| 0.879 | WALL  | 0.789 | -1    |
| 0.853 | 0.830 | 0.805 | 0.637 |


| 0.903 | 0.930 | 0.954 | +1    |
| 0.879 | WALL  | 0.789 | -1    |
| 0.853 | 0.830 | 0.805 | 0.638 |


| 0.903 | 0.930 | 0.954 | +1    |
| 0.879 | WALL  | 0.789 | -1    |
| 0.853 | 0.830 | 0.805 | 0.638 |


| 0.903 | 0.930 | 0.954 | +1    |
| 0.879 | WALL  | 0.789 | -1    |
| 0.853 | 0.830 | 0.805 | 0.638 |


| 0.903 | 0.930 | 0.954 | +1    |
| 0.879 | WALL  | 0.789 | -1    |
| 0.853 | 0.830 | 0.805 | 0.638 |


| 0.903 | 0.930 | 0.954 | +1    |
| 0.879 | WALL  | 0.789 | -1    |
| 0.853 | 0.830 | 0.805 | 0.638 |


| 0.903 | 0.930 | 0.954 | +1    |
| 0.879 | WALL  | 0.789 | -1    |
| 0.853 | 0.830 | 0.805 | 0.638 |


| 0.903 | 0.930 | 0.954 | +1    |
| 0.879 | WALL  | 0.789 | -1    |
| 0.853 | 0.830 | 0.805 | 0.638 |


| 0.903 | 0.930 | 0.954 | +1    |
| 0.879 | WALL  | 0.789 | -1    |
| 0.853 | 0.830 | 0.805 | 0.639 |


| 0.903 | 0.930 | 0.954 | +1    |
| 0.879 | WALL  | 0.789 | -1    |
| 0.853 | 0.830 | 0.805 | 0.639 |


| 0.903 | 0.930 | 0.954 | +1    |
| 0.879 | WALL  | 0.789 | -1    |
| 0.853 | 0.830 | 0.805 | 0.639 |


| 0.903 | 0.930 | 0.954 | +1    |
| 0.879 | WALL  | 0.789 | -1    |
| 0.853 | 0.830 | 0.805 | 0.639 |


| 0.903 | 0.930 | 0.954 | +1    |
| 0.879 | WALL  | 0.789 | -1    |
| 0.853 | 0.830 | 0.805 | 0.639 |


| 0.903 | 0.930 | 0.954 | +1    |
| 0.879 | WALL  | 0.789 | -1    |
| 0.853 | 0.830 | 0.805 | 0.639 |


| 0.903 | 0.930 | 0.954 | +1    |
| 0.879 | WALL  | 0.789 | -1    |
| 0.853 | 0.830 | 0.805 | 0.639 |


| 0.903 | 0.930 | 0.954 | +1    |
| 0.879 | WALL  | 0.789 | -1    |
| 0.853 | 0.830 | 0.805 | 0.639 |


| 0.903 | 0.930 | 0.954 | +1    |
| 0.879 | WALL  | 0.789 | -1    |
| 0.853 | 0.830 | 0.805 | 0.639 |


| 0.903 | 0.930 | 0.954 | +1    |
| 0.879 | WALL  | 0.789 | -1    |
| 0.853 | 0.830 | 0.805 | 0.639 |


| 0.903 | 0.930 | 0.954 | +1    |
| 0.879 | WALL  | 0.789 | -1    |
| 0.853 | 0.830 | 0.805 | 0.639 |


| 0.903 | 0.930 | 0.954 | +1    |
| 0.879 | WALL  | 0.789 | -1    |
| 0.853 | 0.830 | 0.805 | 0.639 |


| 0.903 | 0.930 | 0.954 | +1    |
| 0.879 | WALL  | 0.789 | -1    |
| 0.853 | 0.830 | 0.805 | 0.639 |


| 0.903 | 0.930 | 0.954 | +1    |
| 0.879 | WALL  | 0.789 | -1    |
| 0.853 | 0.830 | 0.805 | 0.639 |


| 0.903 | 0.930 | 0.954 | +1    |
| 0.879 | WALL  | 0.789 | -1    |


| 0.903 | 0.930 | 0.954 | +1    |
| 0.879 | WALL  | 0.789 | -1    |
| 0.853 | 0.830 | 0.805 | 0.639 |


| 0.903 | 0.930 | 0.954 | +1    |
| 0.879 | WALL  | 0.789 | -1    |
| 0.853 | 0.830 | 0.805 | 0.639 |


The optimal policy is:


| Right | Right | Right | +1    |
| Up    | WALL  | Left  | -1    |
| Up    | Left  | Left  | Down  |

2.3 价值迭代算法与策略迭代算法对比

策略迭代算法和价值迭代算法都依赖于环境的模型,需要知道状态转移概率和回报函数,因此被称为有模型的强化学习算法。

172bfd545df7f614f1cbded989be037d.png

40852440ed6e90f256aa21b4361f9979.png

The End


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1391284.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JVM调优系列】如何导出堆内存文件

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【pgBackRest备份工具使用】

一、工具介绍 pgBackRest是PostgreSQL数据库的一个开源备份工具&#xff0c;支持全量、增量和差异备份。这一点优于PG原生的备份工具pg_basebackup&#xff0c;因为pg_basebackup不支持增量备份&#xff0c;并且支持备份完整性检查等等。pgBackRest v2.49是当前的稳定版本。 项…

新手怎么投稿各大网络媒体网站

在当今信息爆炸的时代&#xff0c;网络媒体已成为人们获取新闻信息的主要渠道之一。无论是企业宣传、个人推广&#xff0c;还是新闻报道&#xff0c;都离不开网络媒体的力量。而要将自己的信息传达到更广大的受众群体&#xff0c;投稿各大网络媒体网站就成为了一个重要的环节。…

ARM day2、day3 汇编

一、汇编学习&#xff1a;可以向上理解软件、向下感知硬件 二、符号&#xff08;注释&#xff09; 注释#注释&#xff08;放在行首表示注释一行&#xff09;/* */注释#数字立即数&#xff1a;一种标号&#xff08;比如main: loop:&#xff09;.text .end换行…

[足式机器人]Part2 Dr. CAN学习笔记-Advanced控制理论 Ch04-9 可观测性与分离原理

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-Advanced控制理论 Ch04-9 可观测性与分离原理

【Java JVM】栈帧

执行引擎是 Java 虚拟机核心的组成部分之一。 在《Java虚拟机规范》中制定了 Java 虚拟机字节码执行引擎的概念模型, 这个概念模型成为各大发行商的 Java 虚拟机执行引擎的统一外观 (Facade)。 不同的虚拟机的实现中, 通常会有 解释执行 (通过解释器执行)编译执行 (通过即时编…

Servlet项目教学(附实例代码)

【员工信息管理】 1.员工信息管理 1.1 介绍 用户进行登录后,可以对员工信息进行管理(增删查改),等操作.如果用户没有登录,不能访问员工操作页面.并且员工操作页面显示当前登录用户信息. 1.2 技术点 使用VueElementUI充当前端界面,使用ServletJDBCMysql提供数据管理控制.后端统…

嵌入式学习-网络编程-Day3

思维导图 多进程并发服务器通信模型如下 void handler(int signo) {while(waitpid()>0); //以非阻塞配合信号完成僵尸进程的回收 } int main() {//将信号与信号处理函数绑定signal(SIGCHLD, handler);socket(); //创建用于连接的套接字bind(); //绑定IP…

Python和Java代码实现:切线法求解一维最优化问题

Python和Java代码实现&#xff1a;切线法求解一维最优化问题 代码实现Python代码Java代码 求解实例 根据概念查询&#xff0c;切线法定义如下&#xff1a; 切线法&#xff08;Tangent Method&#xff09;是一种用于求解非线性方程的数值方法。它也被称为牛顿法&#xff08;Newt…

C++ 程序文档生成器(doxygen)使用说明

程序文档&#xff0c;是每个程序员必看文档&#xff0c;在日常业务开发中&#xff0c;难免会封装一些组件。没有很好的组件文档&#xff0c;再好的组件都是废物&#xff0c;。因此大型业务中&#xff0c;文档和思维导图&#xff0c;两个都是必备&#xff01; 一、注释风格 …

IPv6隧道--GRE隧道

GRE隧道 通用路由封装协议GRE(Generic Routing Encapsulation)可以对某些网络层协议(如IPX、ATM、IPv6、AppleTalk等)的数据报文进行封装,使这些被封装的数据报文能够在另一个网络层协议(如IPv4)中传输。 GRE提供了将一种协议的报文封装在另一种协议报文中的机制,是一…

各种设备上恢复已删除的文件和文件夹的数据恢复软件清单

最好的数据恢复软件可以简单轻松地恢复计算机、移动设备或存储介质上已删除的文件和文件夹。 询问任何经历过数据丢失的人这是否是一种有趣的经历&#xff0c;他们会告诉您数据丢失&#xff0c;无论是由于硬件或软件故障、意外删除还是网络犯罪&#xff0c;都会带来极大的压力…

美国 SEC 批准比特币现货 ETF 上市,SEC 告诉我们的风险包含哪些?

撰文&#xff1a;Will 阿望 查看原文&#xff1a;美国 SEC 批准比特币现货 ETF 上市&#xff0c;SEC 告诉我们的风险包含哪些&#xff1f; 历经十年的 BTC ETF 艰辛审批之路终于迎来了胜利的曙光&#xff0c;2024 年 1 月 11 日凌晨 4 时&#xff0c;美国证监会&#xff08;S…

AIGC实战——像素卷积神经网络(PixelCNN)

AIGC实战——像素卷积神经网络 0. 前言1. PixelCNN 工作原理1.1 掩码卷积层 1.2 残差块2. 训练 PixelCNN3. PixelCNN 分析4. 使用混合分布改进 PixelCNN小结系列链接 0. 前言 像素卷积神经网络 (Pixel Convolutional Neural Network, PixelCNN) 是于 2016 年提出的一种图像生成…

礼贺新春,徐坊大曲新品【中国红】

梁山徐坊大曲新推出中国风礼盒&#xff0c;以中国红为主题&#xff0c;为即将到来的新春佳节增添了浓厚的节日气氛。为您呈现一场视觉与味觉的盛宴。从礼盒的颜色到图案设计&#xff0c;无不体现出中国红的热情与活力&#xff0c;象征着吉祥、喜庆与团圆。梁山徐坊大曲&#xf…

ubuntu qt 运行命令行

文章目录 1.C实现2.python实现 1.C实现 下面是封装好的C头文件&#xff0c;直接调用run_cmd_fun()即可。 #ifndef GET_CMD_H #define GET_CMD_H#endif // GET_CMD_H #include <iostream> #include<QString> using namespace std;//system("gnome-terminal -…

USB8814动态信号采集卡——声音振动类信号处理的理想之选!

背景介绍&#xff1a; 科技的发展在一定程度上依赖于对信号的处理&#xff0c;信号处理技术的先进性在很大程度上决定了科技发展的速度和方向。数字信号处理技术的崛起&#xff0c;彻底改变了传统的信息与信号处理方式&#xff0c;使得数据采集这一前期工作在数字系统中发挥着…

FTP文件传输协议 、多种方式安装yum仓库

一、网络文件共享服务 1.存储类型分三种&#xff1a; 直连式存储&#xff1a;Direct-Attached Storage&#xff0c;简称DAS 存储区域网络&#xff1a;Storage Area Network&#xff0c;简称SAN&#xff08;可以使用空间&#xff0c;管理也是你来管理&#xff09; 网络附加存储…

ImageNet Classification with Deep Convolutional 论文笔记

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

Leetcode23-数组能形成多少数对(2341)

1、题目 给你一个下标从 0 开始的整数数组 nums 。在一步操作中&#xff0c;你可以执行以下步骤&#xff1a; 从 nums 选出 两个 相等的 整数 从 nums 中移除这两个整数&#xff0c;形成一个 数对 请你在 nums 上多次执行此操作直到无法继续执行。 返回一个下标从 0 开始、长…