最佳优先搜索算法
工作原理:依据某种代价对节点进行排序,并优先扩展代价低的节点。
优先访问代价小的节点:
1.找出最优
2.更快找出目标节点
注:一致代价搜索(UCS算法)是最佳优先搜索的特例;A*算法也是最佳优先搜索算法的特例。
贪心最佳优先搜索
启发函数h(n):估算节点n到目标节点的代价
h(n)的限制:非负;不能高估
代价函数:f(n)=h(n),g(n)≡0
工作原理:试图从局部最优达到总体最优
弊端:在一些情况下,局部最优并不能达到总体最优,例如:迷宫算法
A * 搜索算法
~前言:Dijkstra的算法很好地找到了最短的路径,但是却浪费了时间在没有希望的方向上进行探索。贪婪最佳优先搜索在有希望的方向上进行探索,但可能找不到最短的路径。A * 算法结合了这两种算法。Dijkstra的算法计算到起点的距离。贪婪最佳优先搜索估计到目标点的距离。A * 使用的是这两个距离的和。
~工作原理:f(n)=h(n)+g(n),g(n):开始节点到n节点的实际路径代价;h(n):估算节点n到目标节点的代价。故,A*算法首先扩展f(n)值最小的节点
~对启发函数的2个限制:
1.h(n)必须可接受或具有可接受性
2.h(n)必须是一致的或具有一致性或单调性
~注:单调一致的启发函数一定是可接受的
~优点:一个节点被访问后不会再被访问。完备性和最优性,在满足单调一致条件时,具有效率最优性。
~缺点:
1.对于相当多的问题,在搜索空间中处于目标等值线以内的节点数量,仍然与解路径的长度呈指数级增长。
2.A * 算法在内存中保存了所有已生成的节点,A *算法常常在问题求解之前就已经耗尽了内存。
不适用情况:对于很多大规模搜索
~如何找启发函数:
子问题的最优代价可以作为启发函数,正方形网格适合用曼哈顿距离作为启发函数
1.允许四个方向移动的正方形网格,启发函数适合用曼哈顿距离。
2.允许八个方向移动的正方形网格,启发函数适合用对角线距离
3.允许各个方向移动的正方形网格,可以试试欧式距离
下面是将A*算法应用到8数码(Puzzles8)问题上的流程:
sum(h(n))=|目标点.row-该点.row|+|目标点.col-该点.col|,根据算出的f(n)进行优先级排序,选择出优先级高的作为下一步
1.
2.
3.
4.
5.
:
:
:
:
24.
下面是对应的代码:
# -*- coding: utf-8 -*-
"""
Created on Sun Oct 21 15:25:43 2018
@author: duxiaoqin
Functions:
(1)