首页 > 其他分享 >搜索策略

搜索策略

时间:2024-06-03 18:12:30浏览次数:14  
标签:状态 策略 Open cost 搜索 代价 节点

Ch4 搜索策略

搜索的含义

搜索问题一般包括两个重要的问题:

  1. 搜索什么:通常指目标
  2. 在哪里搜索:即搜索空间,通常指一系列状态的汇集

搜索过程实际上是根据初始条件和扩展规则构造一棵解答树并寻找符合目标状态的节点的过程

启发式搜索:依靠经验,利用已有知识,根据问题的实际情况,不断寻找可利用知识,从而构造一条代价最小的推理路线,使问题得以解决的过程

典型问题:八数码

将每一个序列看作一个状态节点,将所有可能的状态节点看作一个状态空间,所有的操作构成一个算符空间,操作可以使状态转变,通过搜索算法在状态空间中寻找目标状态节点

  • 要成功地设计和实现搜索算法, 必须把下列疑点弄清楚: (评价准则)
    • 问题求解器是否一定能找到一个解? 【完备性】
    • 问题求解器是否能终止运行, 或是否会陷入一个死循环? 【可解性】
    • 当问题求解器找到解时, 找到的是否是最好的解?【最优性】
    • 搜索过程的时间与空间复杂性如何?
      • 怎样才能最有效地降低搜索的复杂性?

简化搜索问题——问题规约

问题规约的目的是将一个问题转化为另一个问题, 使得新问题的解也是原问题的解

img

端节点:不再有子节点的节点

可解节点:

  1. 任何终止节点都是可解节点
  2. 对于 或 节点, 如果它的某个子节点是可解节点,则它也是可解节点
  3. 对于 与 节点, 如果它的所有子节点都是可解节点,则它也是可解节点

状态空间的一般搜索

状态空间的搜索可以对应与图的搜索,搜索过程可以看作是在图中寻找一条从初始状态到目标状态的路径

符号约定

  • Open 表:存放刚生成的节点
  • Close 表:存放已经检查过的节点或将要检查的节点
  • \(S_0\): 初始状态
  • \(G\): 搜索图
  • \(M\): 表示当前扩展节点新生成的且未检查过的节点集
def Search(S0, goal):
    Open = [S0]
    Close = []
    while Open != []:
        N = Open.pop(0)
        if N == goal:
            return N
        M = Expand(N)
        for m in M:
            if m not in Close:
                Open.append(m)
        Close.append(N)

        spec_sort(Open) # 按某种策略对Open表进行排序
    return None

搜索策略的关键在于如何选择下一个节点,即如何对 Open 表进行排序,DFS 使新生成的节点优先,BFS 使旧节点优先。

DFS 不是最优的,不是完备的

代价树搜索

代价树搜索是一种启发式搜索,它是一种有向图搜索,每个节点都有一个代价值,搜索的目标是找到代价最小的路径,典型的代价树搜索问题是最短路径问题。

对于\(n_1\) 扩展的出的 \(n_2\), 他的代价值为 \(g(n_1) + c(n_1, n_2)\)

代价树广度优先搜索(按照节点的代价排序):

def CostSearch(S0, goal):
    Open = [(S0, 0)]
    Close = []
    while Open != []:
        N = Open.pop(0)
        if N == goal:
            return N
        M = Expand(N)
        for m in M:
            if m not in Close:
                Open.append((m, N[1] + c(N, m)))
        Close.append(N)

        sort(Open, key=lambda x: x[1]) # 按cost对Open表进行排序
    return None

代价树深度优先搜索(按照边的代价排序)

状态树的启发式搜索

问题本身的定义之外还利用问题的特定知识的策略

在对问题空间进行搜索时,提高搜索效率需要与问题相关的控制性信息作为搜索的指导

控制信息反映在估价函数中,估价函数的任务就是估计待搜索结点的重要程度,即估计从初始状态到目标状态的代价,代价包括两部分:从初始状态到当前状态的代价和从当前状态到目标状态的代价,代价越小,说明越能以最小的代价找到目标状态

估价函数\(f(n)\)定义为:\(f(n) = g(n) + h(n)\), 其中 \(g(n)\) 是从初始状态到节点 \(n\) 的代价,\(h(n)\) 是从节点 \(n\) 到目标状态的代价的估计值,\(f(n)\) 是从初始状态经过节点 \(n\) 到目标状态的代价的估计值

如果 h(n)=0,g(n)=d(n) 时,就是广度优先搜索法。一般讲在 f(n) 中,g(n)的比重越大,越倾向于广度优先搜索;h(n)的比重越大,越倾向于深度优先搜索

A 算法

在图算法的每一步利用估价函数 \(f(n)\) 对 open 表排序,则称为 A 算法

  • 全局择优:从 open 表中选取 f(n) 最小的节点进行扩展
  • 局部择优:从刚扩展的节点的子节点中选取 f(n) 最小的节点进行扩展(Gradient 上升是一种局部择优)

例子:八数码问题

估价函数为不在位的数码个数

img

A* 算法

是对 A 算法的估价函数加上某些限制的算法

假设 \(f^\star(n)\)是经过节点 \(n\) 到目标状态的最小代价,\(f(n)\)是估计值,且\(f^\star(n) = g^\star(n) + h^\star(n)\)

需要保证 \(h(n) \leq h^\star(n)\),实际上这样的限制能够有良好的性质, 即是可采纳的。\(h(n)\)越小,扩展的节点就越多,效率就越低

如果 \(h(n) = 0\), 那么可以看作是 Dijkstra 算法

因此就有了如下的限制

  • \(h(n) \leq h^\star(n)\)

  • \(g(n) = g^\star(n), g(n) > 0\)

  • 可采纳性:当从初始节点到目标节点有路径存在,如果搜索算法总能在有限步骤内找到最佳路径,并在该条路径上结束,则称搜索算法是可采纳的

A* 算法的可采纳性可以证明

例:给定 4L 和 3L 水壶各一个。水壶上没有刻度。可以向水壶中加水。如何在 4L 的壶中准确的得到 2L 水?

思考:

(1)为什么 h(n)≡0 使搜索过程接近于宽度优先搜索?(因为扩展节点优先从到达的节点代价最小处扩展)
(2)为什么 g(n)≡0 使搜索过程接近于深度优先搜索?(因为扩展结点优先从到达最优解代价最小的节点扩展)

代码讲解来自 以及 RedBlobGames

def a_star_search(graph, start, goal):
    open_list = PriorityQueue()
    open_list.put(start, 0)

    came_from = {}
    cost_so_far = {}

    came_from[start] = None
    cost_so_far[start] = 0

    while not open_list.empty():
        current = open_list.get()

        if current == goal:
            break

        for next in graph.neighbors(current):
            new_cost = cost_so_far[current] + graph.cost(current, next)
            # 如果新的代价更小或者下一个节点不在代价表中
            if next not in cost_so_far or new_cost < cost_so_far[next]:
                cost_so_far[next] = new_cost
                priority = new_cost + heuristic(goal, next)
                open_list.put(next, priority)
                came_from[next] = current

    return came_from, cost_so_far

与或树搜索

例: 证明两个四边形全等

img

img

img

博弈树搜索

来自于博弈论

而二人零和、全信息、非偶然是最简单的博弈

在零和的条件下,两个玩家的利益是完全对立的,一个玩家的收益就是另一个玩家的损失

因此,博弈树的搜索就是在两个玩家之间进行的,每个玩家都希望自己的收益最大,而对方的收益最小,这就是一个 min-max 问题

而博弈树的搜索就是在一个操作与或树的搜索

博弈过程中,设我方为 A 方,则可供 A 方选择的若干行动方案之间是“或”关系;在 A 方行动方案基础上,B 方也有若干个可供选择的行动方案,则这些方案对 A 方来说就是“与”关系。

例:

img

img

(1)对于或结点(表示主方走),在它的全部后继结点中,若有一个为 S 结点,则标为 S;若全为 F 结点,则标为 F,否则为 H。
(2)对于与结点(表示对方走),在它的全部后继结点中,若全为 S 结点,则标为 S;若有一个为 F 结点,则标为 F,否则为 H。

而对于叶节点的估值方法:使用不同的得分表示结果,如胜利为 1,失败为 -1,平局为 0, 对于 non-leaves 节点,使用 min-max 算法向上倒退

img

例:分硬币游戏

img

标签:状态,策略,Open,cost,搜索,代价,节点
From: https://www.cnblogs.com/Blackteaxx/p/18229389

相关文章

  • 小程序大能量:盲盒平台搭建与营销策略
    一、引言在移动互联网的浪潮下,小程序以其轻量级、即用即走的特点,成为了商家与消费者沟通的新桥梁。盲盒经济作为近年来兴起的消费趋势,结合小程序平台,不仅为用户带来了全新的购物体验,也为商家带来了更多的商业机会。本文将深入探讨如何搭建一个成功的盲盒小程序平台,并制定相应......
  • 代码随想录算法训练营第二十二天 | 235.二叉搜索树的最近公共祖先 701.二叉搜索树中的
    235.二叉搜索树的最近公共祖先题目链接文章讲解视频讲解思路:递归遍历二叉搜索树   如果当前值大于p和q的值,向左遍历   如果当前值小于p和q的值,向右遍历   否则说明当前值介于p和q之间,直接返回当前节点classSolution{public:TreeNode*lowestCommonAnc......
  • AI预测体彩排3采取888=3策略+和值012路一缩定乾坤测试6月3日预测第10弹
        昨天的第二套方案已命中!今天继续基于888=3的大底进行测试,今天继续测试,好了,直接上结果吧~    首先,888定位如下:    百位:6,4,7,8,2,9,1,0    十位:2,3,4,1,6,7,8,9    个位:3,4,5,6,7,0,8,9    方案一:    一次缩......
  • AI预测福彩3D采取888=3策略+和值012路一缩定乾坤测试6月3日预测第10弹
             昨天的第二套方案再次成功命中!今天继续基于888=3的大底,使用尽可能少的条件进行缩号。好了,直接上结果吧~     首先,888定位如下:    百位:7,6,8,5,9,2,1,0    十位:6,7,8,5,9,2,1,0    个位:2,3,1,4,6,7,8,9    ......
  • 揭秘成功加盟招商背后的营销策略:如何让你的品牌脱颖而出?
    作为一名手工酸奶品牌的创始人,目前全国也复制了100多家门店,我来分享下我是如何做招商加盟,让品牌脱颖而出!一、成功加盟招商的典型营销策略分析1、线上线下渠道的有效整合:线上渠道:利用自媒体渠道、搜索引擎优化(SEO)、内容营销等方式,提高品牌曝光度和吸引力。还可以通过官方网站......
  • 压力测试接口选择策略指南
    选择哪些接口进行压力测试是确保系统在高负载下仍能正常运行的关键步骤。以下是一些策略,可以帮助你确定哪些接口需要进行压力测试:###1.业务关键性- 核心功能接口:选择那些对业务运作至关重要的接口。例如,支付、订单处理、用户登录等。- 高流量接口:识别那些在正常运......
  • 论文降重新策略:笔灵AI降重如何提高论文质量?
    论文降重一直是困扰各界毕业生的“拦路虎”,还不容易熬过修改的苦,又要迎来降重的痛。其实想要给论文降重达标,我有一些独家秘诀。话不多说直接上干货!1、同义词改写(针对整段整句重复)这是最靠谱也是比较费精力的办法,就是在保证同义的情况下改写内容,幅度要大。往往需要整段改写,一......
  • 淘宝商品id怎么实现批量自动获取?通过关键字搜索接口来获取批量商品id(淘宝API)
    item_search-按关键字搜索淘宝商品传入商品关键字,通常在商品标题中进行检索,将包含此关键字的商品展示出来,分页展示。公共参数名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,i......
  • 代码随想录算法训练营第二十一天 | 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众
    530.二叉搜索树的最小绝对差题目链接文章讲解视频讲解关键词:二叉搜索树-->中序遍历关于递归的返回值  由于需要遍历整棵二叉树,所以返回值为void,如果不是遍历整棵二叉树,需要在得到结果时立即返回结果,此时返回值才不为空怎样使用两个指针pre和cur使得pre始终指向cur的前......
  • 行为型模式之策略模式
    提示:本文只是想教会大家策略模式,案例代码用的是c++,如果你已经掌握了策略模式,请跳过。内容是模仿有关设计模式的一书《HeadfirstDesignPatterns》,如有差错请在评论区指出。从SimDuck应用设计中学习策略模式1.SimUDuck介绍2.需要鸭子会飞——Duck中添加fly方法3.代码......