使用遗传算法在MATLAB中进行自动导引车辆仿真
1. 引言
近年来,机器人技术取得了巨大的进步,使得机器人在现代社会中的应用更加广泛。其中,无人驾驶飞行器(UAV)的发展尤为引人注目。虽然目前的UAV仍需由飞行员或导航员控制,但它们通常结合了远程控制和计算机自动化,内置的控制和/或制导系统可实现速度控制和飞行路径稳定等功能。不过,UAV的自主性仍是一个新兴领域,这可能成为未来UAV发展的瓶颈。
自主性技术发展的最终目标是通过改变机器的决策方式,使其能够像人类一样做出决策,从而取代人类飞行员。为了实现这一目标,可以采用多种人工智能工具,如专家系统、神经网络、机器学习和自然语言处理等。目前,自主性领域大多采用自下而上的方法,如分层控制系统。
分层控制系统中的一种有趣方法是包容架构,它将复杂的智能行为分解为多个“简单”的行为模块,并将它们组织成不同的层次。每个层次实现一个特定的目标,层次越高,抽象程度越高。决策不是由上层做出,而是通过监听最低层感官输入触发的信息来做出。这种方法允许使用强化学习,根据经验信息来获取行为。
强化学习(RL)受旧行为主义心理学的启发,关注的是智能体如何在环境中采取行动,以最大化某种累积奖励的概念。与标准的监督学习不同,强化学习中不会呈现正确的输入/输出对。此外,它更注重在线性能,需要在探索未知领域和利用现有知识之间找到平衡。强化学习已成功应用于各种问题,包括机器人控制、电梯调度、电信、西洋双陆棋和国际象棋等。
遗传算法(GAs)是为了模拟自然界中的遗传进化过程而开发的,旨在进行人工进化。它由John Holland在20世纪70年代初提出,此后成功应用于许多大型复杂的搜索空间问题。在自然界中,生物体的某些特征会影响其生存和繁殖能力,这些特征包含在它们的基因中。自然选择确保了强壮个体的基因在下一代中更多地出现,而弱小个体的基因则逐渐消失。这就是达尔文的适者生存原则,也是遗传算法的基本思想。
为了进行计算测试,研究强化学习如何与遗传算法相结合,为自动车辆的导航提供良好的规则,我们在Matlab中开发了一个模拟导航环境的程序。本文将介绍如何运用相关思想,研究遗传算法和强化学习的集成,为自动导引车辆生成规则,以实现更好的性能。主要贡献包括:车辆、传感器和训练环境与以往不同;提出了新的强化学习方程;测试了控制车辆控制导航规则自动生成的参数的影响。
2. 导航问题表示
导航问题可以定义为如何利用车辆雷达提供的信息,引导车辆在充满障碍物和屏障的环境中行驶。车辆雷达有9个扇区,用于更好地获取车辆与物体的接近程度信息。每个扇区是否存在障碍物的信息存储在一个9位的向量v中,规则如下:如果某个扇区内有物体,则该位置的值为1;否则为0。
当雷达检测到物体后,需要采取相应的行动,行动有三种可能:向左转15度、保持轨迹或向右转15度。为了简化问题,假设车辆的速度vc是恒定的。基于这三种决策,我们引入了“规则”的概念。规则是一个向量,它结合了描述车辆障碍物情况的向量和决定车辆行动的新组件,其中0表示左转,1表示保持轨迹,2表示右转。
3. 导航控制
之前的二进制表示方案存在一个主要缺点,即每次车辆移动决策都需要存储3×2⁹ = 1536个向量(规则),以精确描述雷达检测到的每种场景应采取的行动。这意味着在车辆的每一步移动之前,控制动作在最坏情况下需要比较1536个向量,才能做出正确的决策。
为了避免这种计算工作,我们引入了一个新符号2,用于雷达信息部分,表示“该扇区可能有也可能没有障碍物”。这个新符号的优点是有助于减少车辆控制所需保存的信息量,但缺点是可能会将不同决策的情况归为一类。
在构建规则时,应将不影响决策的部分标记为2,而对车辆最终行为有重大影响的部分应尽可能具体地标记为0或1。当使用符号2时,可能会出现多个规则与当前雷达信息匹配的情况。我们采用的标准是选择与环境情况匹配且信息尽可能具体的规则,为此使用以下方程:
[
S_i = \frac{n - k_i}{n}, \ i = 1, \cdots, R
]
其中,$S_i$ 是规则 $i$ 的特异性度量,$n$ 是车辆雷达的扇区数量,$k_i$ 是标记为2的位数,$R$ 是规则的数量。因此,$S_i$ 的取值范围是 $[0, 1]$,当规则中与扇区状态相关的每个数字都标记为2时,$S_i$ 为0(特异性最低);当规则中不出现2时,$S_i$ 为1(特异性最高)。
车辆的有效导航控制依赖于多个规则,因此我们的目标是找到能够正确控制车辆的规则集。为了实现这一目标,接下来的部分将讨论如何使用强化学习和遗传算法等计算工具自动构建这个规则集。
4. 强化学习
我们开发的程序首先随机生成规则,这些规则在帮助车辆导航控制方面的质量是未知的。然后,我们创建了一个系统,通过计算机模拟车辆导航来评估所使用规则的质量。在导航过程中,可能需要多个规则,系统必须对导致车辆碰撞或避免障碍物的规则进行惩罚或奖励。
这里存在两个困难:一是难以确定每个规则在车辆碰撞中的确切贡献权重;二是难以估计帮助车辆避免即时碰撞的规则集的奖励值,因为这个规则集可能会使车辆处于未来与其他障碍物碰撞的轨迹上。
如果在当前车辆步骤 $t$ 没有发生碰撞,每个规则的初始信用值将根据以下方程进行修改:
[
C_{i(t + 1)} = C_{it} + kS_{it}C_{it}
]
其中,$i$ 是与当前车辆情况完全匹配的规则,即规则 $i$ 在车辆步骤 $t$ 的 $S_{it}$ 值尽可能大;$C_{it}$ 是规则 $i$ 在步骤 $t$ 的信用值;$k$ 是表示学习率的常数。
当车辆撞到障碍物时,必须对与该事件最相关的规则进行惩罚。为了避免存储大量关于使用了哪些规则的历史记录,并仅惩罚与碰撞最相关的规则,我们只更新最后使用的三个规则的信用值,使用以下方程:
[
C_{i(t + 1)} = \frac{C_{it}}{2}
]
不过,这个方程存在一个问题,例如,导致车辆在无碰撞情况下行驶200步以上的规则与仅行驶20步的规则会受到相同的惩罚。为了避免这个问题,我们首次提出了一个基于步数的惩罚公式:
[
C_{i(t + 1)} = k_pC_{it}
]
[
k_p = \frac{1}{\exp(-\frac{n_s + 1}{n_p}) + 1}
]
其中,$n_s$ 是车辆在碰撞前执行的总步数,$n_p$ 是一个预设值。
以下是评估规则的Matlab代码:
function EvaluateRules (MR)
% Initial learning rate for each step without a collision.
k = 0.2;
collision = 0;
% Initial credit assignment for all rules.
for i=1:R
C(i) = 0.2;
end
% Starts the initial conditions of the environment and the objects that appear in the radar
% vehicle.
[vE, E]=Starts();
ns = 0; % Number of steps.
Records = [ ]; % Stores the index of the rules used.
% Loop that evaluates the rules inside MR while there is no collision.
While (collision == 0)
% Determining the rules that matches with the actual environment.
[vm]=Match(MR, vE);
% Verifying the measure of how specific each matching rule is (use Equation (1)).
MRE = MR(vm,:);
[sm]=Specific(MRE);
[value, indexsmax] = max(sm);
% Using the matching rule with maximum Sit value and verifying the consequences.
VRM = MRE(indexsmax,:);
% Update the vehicle in environment by using the selected rule. It also returns if
% a collision happened (collision == 1).
[collision, vE, E]= Simulate(VRM, E) ;
% There is no collision with the rule application, then update the credit according
% with the equation (2).
If (collision == 0)
% Update the credit of the rule applied.
C(vm(indexsmax)) = (1 + k*sm(indexsmax))*C(vm(indexsmax))
% Store the index of what rule was applied in a certain vehicle step.
Records = [Records vm(indexsmax)];
ns = ns + 1;
% There is a collision after the rule application then update the credit of the last three
% rules used according with equation (3) or (4) and (5).
else
indexp = Records(end-2:end);
% Or use: kp = 1/(exp(-(ns+1)/20)+1); C(indexp)=C(indexp)*kp;
C(indexp) = C(indexp)/2;
ns = 0;
end
end
代码中各函数和符号的定义如下:
| 符号 | 含义 |
| — | — |
| C | 包含一组规则相关信用的向量 |
| E | 包含当前模拟环境状态所有数据的矩阵 |
| vE | 从雷达提取的信息向量 |
| MR | 包含一组规则的矩阵,每行代表一个规则 |
| Vm | 与车辆雷达提取信息匹配的规则的索引向量 |
| MRE | 仅包含与车辆雷达提取信息匹配的规则的矩阵 |
| Specific | 根据方程评估矩阵MRE中所有规则的特异性的函数 |
| sm | 所有规则特异性度量的向量 |
| max | 确定最大特异性度量值及其对应规则索引的函数 |
| VRM | 用于当前环境状态的选定规则向量 |
| Simulate | 使用VRM规则模拟车辆在环境中行驶的函数 |
| collision | 表示车辆是否碰撞的变量(1表示碰撞,0表示未碰撞) |
| indexsmax | 具有最大匹配值的规则的索引 |
| Records | 存储在车辆某个步骤中应用的规则索引的向量 |
| indexp | 车辆碰撞前最后使用的三个规则的索引向量,将通过降低信用值进行惩罚 |
| ns | 无碰撞的步数 |
| kp | 碰撞发生时应用于最后三个规则信用的惩罚因子 |
该系统试图通过监测性能的方程,在规则之间建立奖励和惩罚机制,以及它们对车辆导航的影响。然而,随机生成的规则也可能导致控制导航性能不佳。在预设的碰撞次数之后,可以通过插入新规则、排除性能不佳(信用值低)的规则以及保留有助于避免障碍物(信用值高)的规则,形成一个新的随机规则集。为了实现这个新规则集的形成,我们将遗传算法与上述信用评估方案相结合。
5. 遗传算法
遗传算法维护一个个体种群,在每一代(迭代)$t$ 中,种群表示为 $A(t) = {A_{1t}, \cdots, A_{nt}}$,每个个体代表一个引导车辆在环境中行驶并避免障碍物的规则。在我们采用的计算实现中,种群存储在矩阵 $A(t)$ 中,每列 $A_{it}$ 代表一个规则。
每个规则 $A_{it}$ 根据车辆无碰撞移动的步数进行评估,然后计算适应度,即该个体在解决问题方面的成功程度。适应度为整个种群计算,并基于这个新种群,选择最有能力的个体组成下一代 $t + 1$。
在新一代的形成过程中,上一代的一些个体通过遗传算子进行转换,以形成新的规则。这些转换包括一元算子 $m_i$(变异),它通过对个体属性进行小的改变来创建新规则;以及高阶转换 $c_j$(交叉),它通过组合一个或多个个体来产生新个体。这个过程一直进行到达到预设的最大代数为止。
在车辆导航过程中,可能会出现不同的情况,每种情况可能需要不同的规则。因此,强化学习与遗传算法产生的种群相结合,当发生碰撞时,对碰撞前使用的适当数量的规则进行惩罚。
遗传算法的实现细节如下:
- 数据结构编码 :每个遗传算法个体通过一个10元素的向量 $v$ 与一个规则相关联。向量的前9个元素对应车辆雷达的9个扇区,值为1表示有物体,值为0表示无物体,值为2表示不确定。第10个元素表示决策:0表示向左转15度,1表示保持轨迹,2表示向右转15度。规则集存储在一个矩阵中,每列代表一个规则。
- 适应度评估和分配 :适应度评估负责对每一代 $t$ 中的个体进行排名。适应度的计算方式是,信用度量值越低的解决方案,其适应度值越高。每个个体 $A_i$ 的适应度计算公式为:
[
Fit(A_i) = f(A_i)
]
其中,$f(A_i)$ 是根据信用值 $C_{it}$ 定义的适应度评估,它对应于根据存储在向量 $A_i$ 中的规则,车辆在环境中使用规则 $i$ 无碰撞执行的步数。
- 下一代个体选择 :采用“轮盘赌”方法进行种群形成,即随机抽奖,在有 $b$ 个个体的种群中,选择个体 $A_i$ 进入下一代的概率 $Q(A_i)$ 可以通过以下方程获得:
[
Q(A_i) = \frac{Fit(A_i)}{\sum_{i = 1}^{numpop} Fit(A_i)}
]
当前代中最好的个体总是保留到下一代。
- 交叉操作(OX) :交叉算子试图通过组合个体中过去几代的信息,生成新的个体以形成下一代。我们使用了两种交叉算子,具体如下:随机从第 $t$ 代种群中选择两个具有 $N$ 个元素的个体 $A_1$ 和 $A_2$,然后随机选择一个区间 $[1, N - 1]$ 内的整数 $\delta$,将 $A_1$ 中从位置 $\delta$ 到 $N$ 的元素与 $A_2$ 中相应位置的元素交换,从而产生两个新个体 $nA_1$ 和 $nA_2$,它们可能出现在下一代中。
- 变异算子 :变异算子修改矩阵 $A$ 中的 $10 \times numpop \times p_m$ 个元素,其中 $p_m$ 是要变异的总位数的百分比。选择要变异的元素 $A_{ij}$ 是通过随机选择行索引和列索引,然后进行更改。
以下是遗传算法元素组合的流程图:
graph TD;
A[初始化种群A(t)] --> B[评估适应度];
B --> C{是否达到最大代数};
C -- 否 --> D[选择个体进行下一代];
D --> E[交叉操作];
E --> F[变异操作];
F --> G[更新种群A(t+1)];
G --> B;
C -- 是 --> H[输出最优解];
需要注意的是,第 $t$ 代中最好的个体总是保留到第 $t + 1$ 代。此外,子种群 $A_{s1t}$ 和 $A_{s2t}$ 的大小相同,均为总种群($numpop$)的5%。
使用遗传算法在MATLAB中进行自动导引车辆仿真
6. 测试和结果
为了对上述方法进行测试,我们定义了一系列参数,具体如下表所示:
| 参数 | 描述 |
| — | — |
| $C_{i0}$ | 一组规则的初始信用分配 |
| $k$ | 强化学习率参数 |
| $pb_0$ | 初始种群中值为0的位数百分比 |
| $pb_1$ | 初始种群中值为1的位数百分比 |
| $pb_2$ | 初始种群中值为2的位数百分比 |
| $numpop$ | 遗传算法种群中的个体数量 |
| $pc$ | 交叉率 |
| $pm$ | 变异率 |
| $pg$ | 子种群相对于矩阵A的大小(5%) |
| $M$ | 应用遗传算法前的碰撞次数(10) |
| $N$ | 遗传算法的应用次数(14) |
我们测试了两个环境,障碍物的初始位置如下图所示:
障碍物可分为两组:界定环境边界的障碍物位置固定,环境内部的障碍物位置在不同环境中有不同的更新方式:
- 环境1 :移动障碍物的x位置根据以下方程更新:
[
x_{it} = x_{it - 1} + \varepsilon
]
其中,$x_{it}$ 是车辆第 $t$ 步时障碍物 $i$ 的x位置,$\varepsilon$ 是区间 $[0, 1]$ 内的随机均匀变量。
- 环境2 :用户可以指定一个正的半径参数,移动障碍物的x和y位置根据以下方程更新:
[
\begin{cases}
x_{it} = x_{it - 1} + radius \times \cos(\theta_{it}) \
y_{it} = y_{it - 1} + radius \times \sin(\theta_{it})
\end{cases}
]
在所有环境2的测试中,半径值固定为5。
我们进行了5次运行,使用下表中列出的值,以找到上表中所有参数的最佳值组合。
| 组 | $C_{i0}$ | $k$ | $Pb_0$ | $Pb_1$ | $Pb_2$ | $numpop$ | $pc$ | $pm$ | $pg$ | $M$ | $N$ | 环境 |
| — | — | — | — | — | — | — | — | — | — | — | — | — |
| 1 | 20 | 2 | 2.5% | 2.5% | 95% | 100 | 30 | 1 | 5 | 10 | 14 | 1 |
| 2 | 20 | 2 | 2.5% | 2.5% | 95% | 100 | 1 | 30 | 5 | 10 | 14 | 1 |
| 3 | 20 | 2 | 2.5% | 2.5% | 95% | 100 | 30 | 1 | 5 | 20 | 5 | 1 |
| 4 | 20 | 2 | 2.5% | 2.5% | 95% | 100 | 1 | 30 | 5 | 20 | 5 | 1 |
| 5 | 20 | 2 | 10% | 10% | 80% | 100 | 30 | 1 | 5 | 20 | 5 | 1 |
| 6 | 20 | 2 | 10% | 10% | 80% | 100 | 30 | 1 | 5 | 20 | 5 | 1 |
| 7 | 20 | 2 | 2.5% | 2.5% | 95% | 100 | 1 | 30 | 5 | 20 | 5 | 2 |
| 8 | 20 | 2 | 10% | 10% | 80% | 100 | 30 | 1 | 5 | 20 | 5 | 2 |
下表展示了使用上述参数组合和强化学习方程(3)得到的最终规则集,车辆无碰撞的最大步数:
| 组 | 测试1 | 测试2 | 测试3 | 测试4 | 测试5 | 最佳步数 |
| — | — | — | — | — | — | — |
| 1 | 16 | 7 | 7 | 7 | 7 | 16 |
| 2 | 7 | 110 | 7 | 7 | 80 | 110 |
| 3 | 28 | 57 | 78 | 16 | 7 | 78 |
| 4 | 177 | 32 | 48 | 21 | 18 | 177 |
| 5 | 151 | 18 | 15 | 32 | 116 | 151 |
| 6 | 34 | 32 | 19 | 32 | 106 | 106 |
| 7 | 32 | 163 | 20 | 106 | 84 | 163 |
| 8 | 38 | 15 | 31 | 108 | 31 | 108 |
从参数集1 - 6的结果来看,对于环境1,最佳参数选择是组4和组5。我们还在环境2中测试了这两组参数,以验证参数集在不同环境中生成合适规则的鲁棒性。配置7表现最佳,三次测试成功生成了能让车辆无碰撞行驶超过80步的规则。
我们还测试了新提出的强化学习公式(4)和(5),其中 $n_p = 20$,参数值如下表所示:
| 组 | 测试1 | 测试2 | 测试3 | 测试4 | 测试5 | 最佳步数 |
| — | — | — | — | — | — | — |
| 1 | 20 | 7 | 15 | 7 | 11 | 20 |
| 2 | 7 | 121 | 7 | 7 | 105 | 121 |
| 3 | 36 | 20 | 27 | 7 | 41 | 41 |
| 4 | 37 | 279 | 339 | 296 | 15 | 339 |
| 5 | 15 | 205 | 100 | 126 | 15 | 205 |
| 6 | 84 | 34 | 31 | 617 | 29 | 617 |
| 7 | 32 | 34 | 16 | 37 | 12 | 37 |
| 8 | 31 | 33 | 165 | 31 | 77 | 165 |
下图展示了使用参数集4得到的最佳规则集,模拟车辆控制导航的情况:
从表中的数据可以看出,新提出的强化学习方案(4)和(5)表现更好,除了组3和组7外,几乎所有参数集生成的规则集,车辆无碰撞的步数都比使用方程(3)时更多。
7. 结论和未来工作
本文讨论了有助于实现无人驾驶飞行器(UAV)最终目标的数学技术,即通过改变机器决策方式,使其能够像人类一样做出决策,从而取代人类飞行员。为了实现这一目标,我们结合了强化学习和遗传算法两种方法,并在Matlab中实现。
主要贡献包括:采用了与以往不同的车辆、传感器和训练环境;提出了新的强化学习方程;测试了控制车辆控制导航规则自动生成的参数的影响。实验结果证明,在Matlab中实现的新强化学习方案表现更好。
对于未来的工作,我们可以考虑以下几个方向:
- 应用遗传算法来寻找强化学习和遗传算法组合方案的最佳参数配置,以生成更好的规则。
- 使用其他强化学习方程进行更多测试,探索不同方程对规则生成的影响。
- 尝试使用其他方法,如束搜索(Beam Search)来替代遗传算法,比较不同方法的性能。
- 纳入更详细和复杂的决策,例如增加或减少车辆速度的可能性,使车辆的导航决策更加丰富和灵活。
超级会员免费看

1437

被折叠的 条评论
为什么被折叠?



