搜索的概念:
问题求解:
问题的表示
求解方法
问题求解的基本方法:
搜索法、归约法、归结法、推理法及产生式法
搜索中需要解决的基本问题:
是否一定能找到一个解
找到的解是不是最佳解
时间与空间复杂度
什么时候终止
搜索的主要过程:
(1)从初始状态出发,并将它作为当前状态
(2)扫描操作算子集,将适用当前状态的一些操作算子作用于当前状态而得到新的状态,并建立指向其父结点的指针
(3)检查所有生成的新状态是否满足结束状态,如果满足,则得到问题的一个解,并可沿着有关指针从结束状态反向到开始状态,给出一个解答路径;否则,将新状态作为当前状态,返回第(2)步再进行搜索
搜索的方向:
(1)数据驱动:从初始状态出发的正向搜索
正向搜索:从问题给出的条件出发
(2)目的驱动:从目的状态出发的逆向搜索
逆向搜索:从想达到的目的入手,看哪些操作算子能产生该目的以及应用这些操作算子产生目的时需要哪些条件
(3)双向搜索:
双向搜索:从开始状态出发作正向搜索,同时又从目的状态出发作逆向搜索,直到两天路径在中间的某处汇合为止
盲目搜索和启发式搜索:
盲目搜索:在不具有对特定问题的任何有关信息的条件下,按固定的步骤进行的搜索
启发式搜索:考虑特定问题领域可应用的知识,动态地确定调用操作算子的步骤,优先选择较合适的操作算子尽量减少不必要的搜索,以求尽快地达到结束状态
状态空间表示法:
状态:表示系统状态、事实等叙述型知识的一组变量或数组
操作:表示引起状态变化的过程型知识的一组关系或函数
状态空间:利用状态变量和操作符号,表示系统或问题的有关知识的符号体系,状态空间是一个四元祖(S,O,S0,G)
S:状态集合
O:操作算子的集合
S0:包含问题的初始状态是S的非空子集
G:若干具体状态或满足某些性质的路径信息描述
求解路径:从S0结点到G结点的路径
状态空间的一个解:一个有限的操作算子序列
例:八数码问题
状态集S:所有摆法
操作算子:将空格向上移Up
将空格向左移Left
将空格向下移Down
将空格向右移Right
状态空间图:
组合优化:规模增加一点,计算量是非线性增加的
启发式搜索策略:
运用启发式搜索的基本情况:
一个问题由于在问题陈述和数据获取方面固有的模糊性,可能会使它没有一个确定的解
虽然一个问题可能有确定解,但是其状态空间特别大,搜索中生成扩展的状态数会随着搜索的深度呈指数增长
启发式搜索:利用启发信息进行的搜索
求解问题中能利用的大多是非完备的启发信息:
求解问题系统不可能知道与实际问题有关的全部信息,因此无法知道该问题的全部状态空间,也不可能用一套算法来求解所有问题
有些问题在理论上虽然存在着求解算法,但是无法在工程实践中,这些算法不是效率太低,就是根本无法实现
启发信息的分类:
陈述性启发信息
过程性启发信息
控制性启发信息
利用控制性启发信息的情况:
没有任何控制性知识作为搜索的依据,因为搜索的每一步完全是随意的
有充分的控制知识作为依据,因而搜索的每一步选择都是正确的,但这不现实
估价函数:
定义:从初始结点经过n结点到达目的结点的路径的最小代价估计值,一般形式是:f(n)=g(n)+h(n)
一般的,在f(n)中,g(n)的比重越大,越倾向于bfs,而h(n)的比重越大,启发式性能越强
例:八数码问题
最简单的估价函数:取一格局与目的格局相比,其位置不符的牌的数目
较好的估价函数:将各牌移到目的位置所需要移动的距离的总和
第三种估价函数:对每一对逆转牌乘一个倍数
A搜索算法:
启发式搜索的基本特点:如何寻找并设计一个与问题有关的h(n)及构造出f(n)=g(n)+h(n),然后以f(n)的大小来排列待扩展状态的次序,每次选择f(n)值最小者进行扩展
A搜索算法流程:
open表:保留所有已生成而来扩展的状态
closed表:记录扩展过的状态
进入open表的状态是根据其估值的大小插入到表中合适的位置,每次从表中优先取出启发估价函数值最小的状态加以扩展
例:用A算法求解八数码问题
解:
定义估价函数:
f(n)=d(n)+w(n)
d(n):状态的深度,每步为代为代价
w(n):以"不在位"的牌数作为启发信息的度量
h*(n):为状态n到目的状态的最优路径代价
A*搜索算法:
特性:
可采纳性:当一个搜索算法在最短路径存在时能保证找到它
单调性:在整个搜索空间都是局部可采纳的,一个状态和任一个子状态之间的差由该状态与其子状态之间的实际代价所限定
信息性:在两个A*启发策略的h1和 h2中,如果对搜索空间中的任一状态n都有h1(n)<=h2(n),就称策略h2比h1具有更多信息性
博弈树搜索
博弈过程中始终站在一方立场上,所有能使自己一方获胜的终局都是本原问题,相应的节点是可解节点;所有使对方获胜的终局都是不可解节点
极大极小搜索过程:
根据问题的特性信息定义一个估计函数,用来估算当前博弈树端节点的得分
当端节点的估值计算出后,再计算父节点的估值
推算方法:
对或节点,选其子节点中一个最大值作为父节点的得分,对与节点,选其子节点中一个最小值作为父节点的得分
α-β剪枝:
一边生成节点一边对节点剪枝
采用有界深度优先的策略,再生成规定升读的节点时,计算叶节点的静态估值,并倒推非端节点的值