dfs
bfs
迭代加深搜索:首先给DFS一个比较小的深度限制,然后逐渐增加深度限制,直到找到解或找遍所以分支为止。
启发式搜索:利用知识来引导搜索,达到减少搜索范围,降低问题复杂度的目的。(A)
定义一个评价函数f,对当前的搜索状态进行评估,找出一个最有希望的节点来扩展。
评价函数的格式:
f(n) = g(n) + h(n)
f(n):评价函数,s到t的距离的估计值
h(n):启发函数,对n到t距离的估计值
h*(n):n到t距离的真实值
g(n):s到n距离的真实值
伪代码:
while 队列非空
获取队中f函数最小的状态now
if now为目标状态
输出并退出
for now所有可以到达的状态nxt
计算f(now,nxt)
if f(now,nxt)<f(nxt)
f(nxt)=f(now,nxt)
if nxt不在队列中
nxt入队
eg.八数码问题
f(n)=g(n)+h(n) 定义h(n)为当前不在位的牌的数量
红字为遍历顺序。
A算法的缺点?第一次找到的答案不一定是最优的答案
还有A*,模拟退火神马乱七八糟的。
剪枝:可行性剪枝,最优性剪枝
eg.背包问题:
1、可行性:如果当前已经装超了,就不要再装了
2、最优性:如果把后面所有物品都放上也不能超过当前最优解的话,就不用再搜索了