搜索算法Heuristic Search
-
启发式搜索
- 定义: 利用问题拥有的启发信息来引导搜索,达到减少搜索范围、降低问题复杂度的目的,这种利用启发信息的搜索过程称为启发式搜索
- 启发函数
h(n)- 定义: 提供从给定节点到目标节点(当有多个目标节点时选取其中最小一个)的代价估计,而当该节点为目标节点时对应的值应为0
- 形式:
f(n) = h(n) + g(n),其中g(n)仅仅表示从开始节点到该节点的开销,但是h(n)可以表示从当前节点到目标节点的估计
- 容许界限
- 启发式函数的容许界限定义为,对于所有节点的
h(n)值必然小于该节点到目标节点的最优路径长度,也就是说容许界限决定了h(n)预估值必然小于实际花销 h*(n)为最优路径长度值,则对于所有节点n,都有h(n) <= h*(n)
- 启发式函数的容许界限定义为,对于所有节点的
-
经典启发函数A*算法
- A*算法中,通过从点A开始,检查相邻节点的方式,向外扩展直到找到目标节点且当且仅当目标节点从开启列表中移出时搜索结束
- 从开启列表中找到
f(n)值最小/大的节点,并寻找该节点的所有邻近且不在关闭列表中的节点 - 对邻近节点处理,设置其临时的
f(n)值,其中h(n)为该邻近节点到目标节点的代价估值,g(n)则为1中找到的节点的g(no)值 + 该节点到该邻近节点的实际代价 - 检查开启列表,当邻近节点不在列表中时则加入,若在则检查临时的
f(n)值是否大/小于列表中的值,若满足要求则更新节点信息 - 重复步骤
1,直到从开启列表中找到的节点为目标节点时停止
-
与贪心搜索比较,优缺点、实例:
- 实例:
- BFS(广度优先->一层接一层)是A*算法的特列,其中
h(n)=0,同Dilkstra算法 -> f = g - 贪婪算法GBF则是
f(n)=0,是最简单的启发式函数,可能陷入死循环 -> f = h
- BFS(广度优先->一层接一层)是A*算法的特列,其中
- 优点:
- A*算法结合二者优点,考虑当前代价以及预估代价,是最有效的直接搜索算法
- 缺点:
- A*算法空间增长是指数级别,且不保证获得最优解
- 实例:
-
博弈树
- 特征: 博弈树双方都有各自利益需求且冲突,博弈双方绝对理性以达到最优状态
- 特质: 零和问题,一方获胜另一方必输->冲突,明确的不存在偶然因素且所有状态都可观察,不存在隐藏信息
-
MinMax
MinMax的基础是以先手A为视角建立决策树,具体为列出所有情况并作出奖惩值,此时再从下往上传递值并最终获得路径图即为于A的最优决策路径- 由于该决策树是以A为先手,树的叶子节点即末端节点则为当前A能取得的结果值,由于博弈是零和问题,
A方会选择当前情况下的最优值,而另一方B则会选择A能获取的最小值 - 在此基础上,即决策树向上值传递的方法即
MinMax问题的关键,即当B选择时都会选择下一层中最小值以供上一层(下轮)的A选择其内的最大值
-
Alpha-Beta剪枝
- 剪枝则基于上述的零和问题中
A方选择最大值,B方选择最小值的规律对决策树的路径搜索的优化方案 - 在
A方选择时,当该层未有取值或下层取值中没有比该层取值集合中最小值大的值时,选择下层中最大的值并更新集合,当搜索下层取值时发现第一个比该层最小值大的值时,取该值并停止继续搜索,转而搜索下一个兄弟节点,B方类似,取第一个小于该层最大取值集合中最大的值的值作为该节点值 - 无论是否取所能取得最优值,最终结果依然会被
A/B方筛选,因此先一步筛选减少了后续的搜索层次,减少分支 - 剪枝问题的根本在于博弈双方是理性的

- 剪枝的流程/规律
- 同一层的第一个节点为根的子树的枝不剪
- 除第一个节点外,从左到右查看子节点的值,直到遇到第一个符合当前情景的值,即比较当前流程下找到的最小值,根据α/β取第一个大/小于最小值的值作为子树根节点的值,剪掉剩余的枝(α部取第一个大于最小值)
- 以整棵树的根节点开始,从左到右处理 (上到下从左到右) ,类似中缀表达式的遍历过程,因此当前的最小值适用于整棵树无关那一层的问题


- 剪枝则基于上述的零和问题中
-
约束满足问题CSP
- 定义: 由一个变量集合和一个约束集合组成。问题的一个状态是由对一些或全部变量的一个赋值定义的完全赋值:每个变量都参与的赋值。问题的解是满足所有约束的赋值,或更进一步,使目标函数最大化。
- 约束图: CSP问题的约束图则是由
代表变量的圆以及代表约束关系的直线组成(无向边表示相互约束),即
-
回溯法解决CSP
- 对于CSP的回溯法即从当前可取变量集中**(此时忽略约束条件,只观察下一层可取变量,与前向检测法相呼应)**选择一个赋值并弹出变量集合和更新变量约束集合,当变量集合不为空且无可赋值变量时则回溯上一层选取另一个变量赋值直到变量集合为空
- CSP的回溯法处理关键在于下一个选取哪个变量赋值以及赋值后对其他变量约束条件的影响的判断
- 基本原则:
- 变量排序:MRV 选择最少剩余值(可选值)的变量优先赋值
- 值排序:度启发 在上述选择变量的可选值集合中优先选择对其他变量产生最多约束的值给当前变量赋值 -> 减少后续的分支
-
前向检测
- 前向检测是相对于回溯法中直接获取下层可选变量集合进行优化,即在获取集合前先通过约束条件缩减变量集合,若可选变量集合为空则回溯,直到变量集合为空则停止

- 前向检测是相对于回溯法中直接获取下层可选变量集合进行优化,即在获取集合前先通过约束条件缩减变量集合,若可选变量集合为空则回溯,直到变量集合为空则停止
-
MAC 维持弧相容
- 相容即不违反任何约束条件的赋值称为相容的或合法的赋值
- 弧相容即某变量值域中的所有取值满足该变量的所有二元约束 -> 一元约束即类似 A != green只涉及一个变量A, 二元约束即类似A != B涉及两个变量A、B之间的关系
- 弧可以看作是约束图中的两点与之间的直线
- MAC就是用于对变量赋值后检测未赋值变量是否满足弧相容即是否有可取值,与前向检测略微不同,前者是判断整个约束图的剩余待赋值变量是否满足要求而后者只判断下一个变量的可取变量集合是否未空,其中前者通过AC-3算法检测弧相容
- AC-3步骤
- 给定变量集合X、变量值域集合D、约束条件集合C即
(X,D,C)->D为X取值的集合的集合 - 初始时,按照上述对当前选定变量
Xj赋选定值后,修改该变量的值域集合Dj,将变量Xj产生约束的所有弧如(Xi,Xj)放入工作集worklist中(如Xi <= Xj,Xj取值对Xi有约束,Xi->Xj表示Xi受Xj约束) - 函数
ac_3从工作集中弹出一个弧即(Xi,Xj),遍历检查Di中的所有取值判断是否在Dj中至少存在一个取值使得Di的取值和Dj取值满足变量(Xi,Xj)之间的约束(即函数revise),若有,则弹出下一个弧再次检查;若无则需要将Di中不存在满足约束的取值从Di中删除,处理完成后判断Di是否为空,若为空则表示该变量已无可取变量,弧不相容,若不为空则将变量Xi产生的约束放入到工作集中,继续步骤3
- AC-3的时间复杂度为(c个二元约束,变量值域最大为d个元素)
O ( c d 3 ) O(cd^3) O(cd3)
function ac_3 (X, D, C){ while (!worklist_empty()){ (Xi,Xj)=remove_first(worklist) if revise(csp,Xi,Xj){ if (sizeof(Di)==o){ return false; } for each Xk in Xi.NEIGHBORD-{ Xj} do{ add(Xk,Xi)to worklist; } } } return true; } function revise(csp,xi,xj){ revised=false; for each x in Di{ if(no value y in Dj allows(x,y) to satisfy the constraint between Xi and Xj){ delete x from Di; revised=true; } } return revised; } -
GAC 通用弧相容
- MAC是变量之间只满足二元约束,而GAC中变量之间可能满足多元约束即受多个变量约束
- 当所有变量满足多元约束时称该CSP是通用弧相容
-
GAC算法
- GAC算法原理同AC-3,更新所有弧直接工作集为空,条件不满足则回溯,也和前向检验类似
- 经典实例问题
- 数独 ,即变量之间相互约束,多元约束->GAC,与弧相容问题类似解法,每次取变量后都需要更新约束集合直到满足所有约束条件

- 数独 ,即变量之间相互约束,多元约束->GAC,与弧相容问题类似解法,每次取变量后都需要更新约束集合直到满足所有约束条件
-
贝叶斯准则
P ( Y ∣ X ) = P ( X ∣ Y ) P ( Y ) P ( X ) P(Y|X)=\frac{P(X|Y)P(Y)}{P(X)} P(Y∣X)=P(X)P(X∣Y)P(Y)- 上述准则可用部分重叠的关系图理解,交叉面积
S固定下通过X、Y之间的面积占比比例可以获得即
- 上述准则可用部分重叠的关系图理解,交叉面积

本文详细介绍了人工智能中的搜索算法,重点讲解了启发式搜索和A*算法,同时探讨了博弈树的概念,包括Minimax算法和Alpha-Beta剪枝。此外,还涵盖了约束满足问题的解决方法,如回溯法和弧相容性。最后,概述了机器学习的基础知识,包括监督学习、无监督学习和强化学习的主要算法和特点。

最低0.47元/天 解锁文章
1715

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



