📜  AI-热门搜索算法

📅  最后修改于: 2021-01-23 05:42:22             🧑  作者: Mango


搜索是AI中解决问题的通用技术。有一些单人游戏,例如平铺游戏,数独游戏,填字游戏等。搜索算法可帮助您在此类游戏中搜索特定位置。

单代理寻路问题

诸如3X3八块拼图,4X4十五块拼图和5X5二十四块拼图之类的游戏都是单人寻路的挑战。它们由带有空白图块的图块矩阵组成。要求玩家通过将砖垂直或水平地滑入空白空间来布置砖,以实现一些目的。

单主体寻路问题的其他示例包括:旅行推销员问题,Rubik多维数据集和定理证明。

搜索术语

  • 问题空间-这是进行搜索的环境。 (一组状态和一组运算符来更改这些状态)

  • 问题实例-它是初始状态+目标状态。

  • 问题空间图-它表示问题状态。状态由节点显示,运算符由边缘显示。

  • 问题的深度-从初始状态到目标状态的最短路径或最短运算符序列的长度。

  • 空间复杂度-内存中存储的最大节点数。

  • 时间复杂度-创建的最大节点数。

  • 可容许性-总是找到最佳解决方案的算法的属性。

  • 分支因子-问题空间图中平均子节点数。

  • 深度-从初始状态到目标状态的最短路径的长度。

蛮力搜索策略

它们最简单,因为它们不需要任何特定领域的知识。它们在少数可能的状态下可以正常工作。

要求-

  • 状态说明
  • 一组有效的运算符
  • 初始状态
  • 目标状态说明

广度优先搜索

它从根节点开始,先探索相邻节点,然后再向下一级邻居移动。它一次生成一棵树,直到找到解决方案。可以使用FIFO队列数据结构来实现。此方法提供了最短的解决方案路径。

如果分支因子(给定节点的平均子节点数)= b且深度= d,则级别d上的节点数= b d

最坏情况下创建的节点总数为b + b 2 + b 3 +…+ b d

缺点-由于保存了每个级别的节点用于创建下一个节点,因此会占用大量内存空间。存储节点的空间要求是指数级的。

它的复杂性取决于节点的数量。它可以检查重复的节点。

广度优先搜索

深度优先搜索

它是通过LIFO堆栈数据结构递归实现的。它仅按不同顺序创建与“广度优先”方法相同的节点集。

由于从根节点到叶节点的每次迭代中都存储单个路径上的节点,因此存储节点的空间要求是线性的。分支因子b和深度为m时,存储空间为bm。

缺点-此算法可能不会终止,并且会在一条路径上无限执行。解决此问题的方法是选择截止深度。如果理想截止值是d ,并且如果选择的截止值小于d ,则该算法可能会失败。如果选择的截止值大于d ,那么执行时间会增加。

它的复杂性取决于路径的数量。它无法检查重复的节点。

深度优先搜索

双向搜寻

它从初始状态向前搜索,从目标状态向后搜索,直到两者相遇以标识一个公共状态。

从初始状态开始的路径与从目标状态开始的反向路径串联在一起。每次搜索最多只能完成总路径的一半。

统一成本搜索

完成排序会增加到节点的路径成本。它总是扩展成本最低的节点。如果每个转换的成本相同,则与“广度优先”搜索相同。

它以成本递增的顺序探索路径。

缺点-可能存在多个长途路径,其成本≤C *。统一成本搜索必须将它们全部探索。

迭代加深深度优先搜索

它执行对级别1的深度优先搜索,重新开始,对级别2执行完整的深度优先搜索,并以这种方式继续进行直到找到解决方案。

在生成所有较低的节点之前,它永远不会创建节点。它仅保存一堆节点。该算法在找到深度d的解时结束。在深度d创建的节点数为b d ,在深度d-1创建的节点数为b d-1。

交互式深化DF搜索

各种算法复杂度的比较

让我们看看基于各种标准的算法的性能-

Criterion Breadth First Depth First Bidirectional Uniform Cost Interactive Deepening
Time bd bm bd/2 bd bd
Space bd bm bd/2 bd bd
Optimality Yes No Yes Yes Yes
Completeness Yes No Yes Yes Yes

知情(启发式)搜索策略

为了解决具有大量可能状态的大问题,需要添加特定于问题的知识以提高搜索算法的效率。

启发式评估功能

他们计算两个状态之间最佳路径的成本。通过计算每个磁贴从其目标状态开始的移动次数并为所有磁贴加上这些移动数,可以计算出滑动式游戏的启发式函数。

纯启发式搜索

它按照试探值的顺序扩展节点。它创建两个列表,一个是已扩展节点的关闭列表,另一个是已创建但未扩展节点的打开列表。

在每次迭代中,将扩展具有最小试探值的节点,并创建其所有子节点并将其放置在封闭列表中。然后,将启发式函数应用于子节点,并根据其启发式值将它们放置在打开列表中。保存的路径越短,放置的路径越长。

A *搜索

这是“最佳优先”搜索的最著名形式。它避免了扩展已经很昂贵的路径,但首先扩展了最有希望的路径。

f(n)= g(n)+ h(n),其中

  • g(n)到达节点的成本(到目前为止)
  • h(n)从节点到目标的估计成本
  • f(n)估算通过n到目标的路径的总成本。它通过增加f(n)使用优先级队列来实现。

贪婪最佳优先搜索

它扩展了估计最接近目标的节点。它根据f(n)= h(n)扩展节点。它是使用优先级队列实现的。

缺点-它可能卡在循环中。这不是最佳的。

本地搜索算法

他们从预期的解决方案开始,然后再移到相邻的解决方案。即使解决方案在结束前的任何时间被中断,他们也可以返回有效的解决方案。

爬山搜索

它是一种迭代算法,从任意问题的解决方案开始,然后尝试通过逐步更改解决方案的单个元素来找到更好的解决方案。如果更改产生更好的解决方案,则将增量更改视为新的解决方案。重复此过程,直到没有进一步的改进为止。

函数Hill-Climbing(问题),返回状态为局部最大值。

inputs: problem, a problem
local variables: current, a node
                 neighbor, a node
current 

缺点-该算法既不完整也不理想。

局部光束搜索

在此算法中,它在任何给定时间都拥有k个状态。首先,这些状态是随机生成的。这k个状态的后继者是借助目标函数来计算的。如果这些后继中的任何一个是目标函数的最大值,则算法停止。

否则,将(初始k个状态和k个状态的后继数= 2k个)状态放入池中。然后对该池进行数字排序。选择最高的k个状态作为新的初始状态。该过程一直持续到达到最大值为止。

函数BeamSearch( problem,k )返回解决方案状态。

start with k randomly generated states
loop
   generate all successors of all k states
   if any of the states = solution, then return the state
   else select the k best successors
end

模拟退火

退火是加热和冷却金属以改变其内部结构以改变其物理性能的过程。当金属冷却时,会抓住其新结构,并且金属会保留其新获得的特性。在模拟退火过程中,温度保持可变。

我们首先将温度设置为较高,然后随着算法的进行使其缓慢“冷却”。当温度高时,允许算法接受较差的高频解。

开始

  • 初始化k = 0; L =变量的整数;
  • 从i→j搜索性能差异Δ。
  • 如果Δ<= 0,则接受;否则,如果exp(-Δ/ T(k))> random(0,1),则接受;否则,接受。
  • 对L(k)步骤重复步骤1和2。
  • k = k&plus; 1;

重复步骤1到4,直到满足条件。

结束

旅行商问题

在此算法中,目标是找到一种廉价旅行,该旅行从一个城市开始,在路线中仅访问一次所有城市,然后在同一起始城市结束。

Start
   Find out all (n -1)! Possible solutions, where n is the total number of cities.
   Determine the minimum cost by finding out the cost of each of these (n -1)! solutions.
   Finally, keep the one with the minimum cost.
end

旅行商问题