作者: 沈聪
贪婪算法是启发式算法的代表算法之一,其核心思想是每次都选择局部最优解,但该算法并不能保证最后得出的结果是全局最优解。贪婪算法比较典型的案例就是最短路径搜索。之前,大部分的贪婪算法都是基于图的方式寻找最优路径。本篇文章主要借助路径动态规划的案例利用贪婪算法讲解树的最优路径。
相对于图来说,在树的搜索过程中,贪婪算法会遇到很多不可行解,这就需要程序能否返回到最近的一个节点,重新寻找其他的可行路径。下面通过一个示例说明贪婪最佳优先搜索和改进贪婪优化算法具体过程。
问题描述
下图展示了城市之间的路径图,该图包含了城市节点,城市之间的路径以及路径的大小。
利用贪婪算法寻找节点1到节点19的路径。
贪婪算法和核心思路从节点1开始,每次都选择最短的路径,直到到达节点19,其路径显示图如下:
可以看出路径经历了3次死循环后,得出了最后的路径。
在贪婪算法的基础上,我们尝试的每次搜索N个节点,并把这N个节点的路径进行比较,这就是提出的改进贪婪算法。其思路从节点1开始,每次选择N个最短路径进行比较,然后选择N个叠加后的最短路径。以N=2为例,其选择路径为:
该算法在大型的图或树中,可提高搜索效率,但对于过大的N来说,其会导致搜索来回震荡。
MATLAB程序及仿真结果(贪婪算法)
function Best_Path = Greedy_search (Distance_Matrix, Begin_Point, End_Point)
% 该程序主要利用贪婪算法寻找两个节点之间的最小距离
% Distance_Matrix 的格式为:
% 节点 1 2 3 4 5.... 21
% 1 0 92 86 0 0
% 2 92 0 0 83 0 ...
% 3 86 0 0 0 76
% ...
% 21 0 0 0 0 0
% Distance_Matrix 主要描述了节点和节点之间的连接关系及距离
% Begin_Point 为起始的节点编号
% End_Point 为目标的节点编号
% History 显示了贪婪算法历经的路径
% Best_Path 显示了贪婪算法最后找出的最优结果
Dist_Matrix=Distance_Matrix;
History=[Begin_Point]; % 记录了当次的寻找路径
Next_Point = Begin_Point;
while Next_Point~=End_Point
Next_Point1 = Min_Find(Dist_Matrix(Next_Point,:)); % 找出当前节点下,最优的下一个节点
Dist_Matrix = Trace_Find(Dist_Matrix,Next_Point<