(10-2-01)智能行为决策算法:常用的智能行为决策算法-------马尔可夫决策过程(MDP)

10.2  常用的智能行为决策算法

在实际应用中,智能行为决策算法在自动驾驶系统中各有其独特的优势和应用场景,通过合理组合和优化,能够有效提升自动驾驶的安全性、可靠性和效率。在本节的内容中,将详细讲解常用的智能行为决策算法的用法。

10.2.1  马尔可夫决策过程(MDP)

马尔可夫决策过程(Markov Decision Process,MDP)是一种用于建模决策过程的数学框架,特别适用于在不确定环境中进行序列决策。它通过定义状态、动作、转移概率和奖励来描述一个系统的动态行为。以下是对MDP的详细介绍:

1. MDP的基本要素

一个MDP由以下四个基本要素组成:

  1. 状态集(S):表示系统可能处于的所有状态的集合。例如,在自动驾驶中,状态可以表示车辆的位置、速度、周围环境等信息。
  2. 动作集(A):表示在每个状态下可执行的动作的集合。例如,自动驾驶车辆可以选择加速、减速、转向等动作。
  3. 转移概率(P):描述系统在执行某个动作后,从一个状态转移到另一个状态的概率。通常表示为P(s'|s,a),即在状态s下执行动作a后转移到状态s'的概率。
  4. 奖励函数(R):定义每个状态和动作对的奖励。R(s,a)表示在状态s下执行动作a所获得的即时奖励。例如,自动驾驶车辆在避开障碍物时可能会获得较高的奖励。

2. MDP的目标

MDP的目标是找到一个策略(Policy),使得在给定时间范围内(或无限时间内)的累积奖励最大化。策略π是状态到动作的映射,表示在每个状态下应该选择的动作。

3. 求解MDP的方法

常用的求解MDP的方法包括:

  1. 值迭代(Value Iteration):通过迭代更新状态价值函数,直到收敛到最优价值函数。
  2. 策略迭代(Policy Iteration):交替进行策略评估和策略改进,直到找到最优策略。
  3. Q-Learning:一种无模型的强化学习算法,通过学习状态-动作价值函数来找到最优策略。

4. MDP在自动驾驶中的应用

在自动驾驶中,MDP被广泛用于路径规划和决策制定。具体应用场景包括:

  1. 路径规划:通过MDP优化车辆的行驶路径,避免障碍物并最小化行驶时间或能耗。
  2. 交通信号处理:MDP可以帮助车辆在交叉口处做出决策,如何时停车、加速或转弯。
  3. 应急处理:在突发情况下,MDP可以帮助车辆迅速评估各种可能的动作并选择最优应对方案。

例如下面的例子实现了一个简单的自动驾驶场景,车辆在一个网格地图上行驶,每个格子代表一个状态,车辆可以选择向上、向下、向左或向右移动(动作)。奖励函数定义为到达目标位置时获得正奖励,碰到障碍物时获得负奖励。通过MDP可以计算出车辆从起点到终点的最优路径,避开障碍物并最大化累积奖励。

实例10-1:使用MDP计算车辆从起点到终点的最优路径(源码路径:codes\10\mdp.py

实例文件mdp.py的具体实现代码如下所示。

import numpy as np
import matplotlib.pyplot as plt

# 定义网格大小
grid_size = (5, 5)
grid = np.zeros(grid_size)

# 定义起点和终点
start = (0, 0)
goal = (4, 4)

# 定义障碍物
obstacles = [(1, 2), (2, 2), (3, 2)]

# 设置奖励函数
reward = np.full(grid_size, -1)
reward[goal] = 100  # 到达目标位置时的正奖励
for obs in obstacles:
    reward[obs] = -100  # 碰到障碍物时的负奖励

# 定义动作集
actions = ['up', 'down', 'left', 'right']
action_vectors = {
    'up': (-1, 0),
    'down': (1, 0),
    'left': (0, -1),
    'right': (0, 1)
}

# 定义值迭代算法
def value_iteration(grid, reward, gamma=0.9, theta=0.0001):
    value = np.zeros_like(reward)
    policy = np.full(reward.shape, '', dtype=object)
    delta = theta + 1
    while delta > theta:
        delta = 0
        for i in range(grid.shape[0]):
            for j in range(grid.shape[1]):
                if (i, j) == goal or (i, j) in obstacles:
                    continue
                v = value[i, j]
                action_values = []
                for action in actions:
                    di, dj = action_vectors[action]
                    ni, nj = i + di, j + dj
                    if 0 <= ni < grid.shape[0] and 0 <= nj < grid.shape[1]:
                        action_values.append(reward[ni, nj] + gamma * value[ni, nj])
                    else:
                        action_values.append(-np.inf)
                value[i, j] = max(action_values)
                policy[i, j] = actions[np.argmax(action_values)]
                delta = max(delta, abs(v - value[i, j]))
    return value, policy

# 执行值迭代算法
value, policy = value_iteration(grid, reward)

# 输出最优价值函数和策略
print("Optimal Value Function:")
print(value)
print("\nOptimal Policy:")
print(policy)

# 显示最优路径
def display_policy(policy, start, goal):
    path = []
    current = start
    while current != goal:
        path.append(current)
        action = policy[current]
        di, dj = action_vectors[action]
        current = (current[0] + di, current[1] + dj)
    path.append(goal)
    return path

path = display_policy(policy, start, goal)
print("\nOptimal Path:")
print(path)

# 可视化函数
def plot_grid(grid, start, goal, obstacles, path):
    fig, ax = plt.subplots()
    ax.set_xlim(-0.5, grid.shape[1] - 0.5)
    ax.set_ylim(-0.5, grid.shape[0] - 0.5)
    ax.set_xticks(np.arange(-0.5, grid.shape[1], 1))
    ax.set_yticks(np.arange(-0.5, grid.shape[0], 1))
    ax.grid(which="both")
    
    # 绘制起点、终点和障碍物
    ax.plot(start[1], start[0], "go", markersize=10)  # 起点标记为绿色圆圈
    ax.plot(goal[1], goal[0], "ro", markersize=10)    # 终点标记为红色圆圈
    for obs in obstacles:
        ax.plot(obs[1], obs[0], "ks", markersize=10)  # 障碍物标记为黑色方块

    # 绘制路径
    path_x, path_y = zip(*path)
    ax.plot(path_y, path_x, "b-", marker="o", markersize=5)  # 路径标记为蓝色线条和圆圈

    plt.gca().invert_yaxis()
    plt.show()

# 绘制网格地图和路径线路
plot_grid(grid, start, goal, obstacles, path)

上述代码的实现流程如下所示:

  1. 首先,定义了一个网格地图,包括起点、终点和障碍物的位置,并设置了奖励函数。
  2. 然后,通过值迭代算法计算每个状态点的最优值函数和相应的策略,策略指示每个状态点应采取的动作。
  3. 最后,利用 Matplotlib 库将网格地图和从起点到终点的最优路径进行 Visual Studio 展示,包括标记起点、终点、障碍物以及路径线路,提供 Williams 的路径规划结果。

执行后会计算并打印输出如下在网格地图上从起点到终点的最优路径,并进行可视化展示。

Optimal Value Function:
[[ 41  47  54  62  70]
 [ 47  54   0  70  79]
 [ 54  62   0  79  89]
 [ 62  70   0  89 100]
 [ 70  79  89 100   0]]

Optimal Policy:
[['down' 'down' 'right' 'down' 'down']
 ['down' 'down' '' 'down' 'down']
 ['down' 'down' '' 'down' 'down']
 ['down' 'down' '' 'down' 'down']
 ['right' 'right' 'right' 'right' '']]

Optimal Path:
[(0, 0), (1, 0), (2, 0), (3, 0), (4, 0), (4, 1), (4, 2), (4, 3), (4, 4)]

在本实例中,函数plot_grid使用Matplotlib绘制了网格地图和路径线路。绘制了一个5*5的网格可视化图,其中绿色圆圈表示起点,红色圆圈表示终点,黑色方块表示障碍物。蓝色线条和圆圈标是为了从起点到终点的最优路径,路径遵循了计算出的最优策略。如图10-1所示。

图10-1  绘制的可视化图

  • 15
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

码农三叔

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

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

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

打赏作者

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

抵扣说明:

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

余额充值