启发式搜索(A*、IDDFS、IDA*)

news2025/1/12 1:00:23

我们在解决图问题的时候,通常需要使用DFS和BFS搜索,可是这两种搜索方式的效率较低,我们会遍历到很多空白节点,有没有办法可以优化这种低效问题呢?今天要推出我们的主角:启发式搜索。

一、A*

什么是A*算法?

A* 算法是一种路径搜索算法,用于在图形(如地图)中寻找最短路径。A* 算法基于启发式搜索和贪心搜索的思想,通过估计从起始点到目标点的距离来选择下一步移动。它综合考虑了已走过的路径长度(即实际代价)和估计的剩余路径长度(即启发代价),找到从起始点到目标点的最佳路径。

A*算法使用一个开放列表和一个关闭列表来追踪已探索的节点。它通过计算每个节点的“f值”来确定下一步移动。f值等于从起始点到当前节点的实际代价(即已走过的路径长度)加上从当前节点到目标点的估计代价(即剩余路径长度)。

A*算法在每一步中选择f值最小的节点来移动。当找到目标点或遍历完所有可能的节点时,算法停止。如果找到目标点,路径会被重构,即从目标点沿父节点指针一直回溯到起始点。这样就找到了从起始点到目标点的最短路径。

A*算法在寻找路径问题中被广泛应用,例如在游戏中的AI路径规划、地图导航和机器人路径规划等。它具有较高的效率和准确性,并且可以根据需要进行优化和改进。

在A* 算法中,我们需要构建一个估价函数,简单来说,A*算法就是BFS+优先队列+估价函数

估价函数:
  f ( i ) = g ( i ) + h ( i ) \ f(i) = g(i) + h(i)  f(i)=g(i)+h(i)
其中g(i)是Dijkstra算法计算的当前i点离起点的最短路径,h(i)是用贪心算法预估当前i点到达终点需要的最短路径,但这里的预测不一定准确,在寻路时碰壁可以回溯到之前节点,重新寻找其他节点

如何设计h函数?
(1)曼哈顿距离:只能在四个方向(上下左右)移动
h ( i ) = a b s ( i . x − t . x ) + a b s ( i . y − t . y ) h(i) = abs(i.x - t.x) + abs(i.y - t.y) h(i)=abs(i.xt.x)+abs(i.yt.y)
(2)对角线距离:只能在八个方向移动
h ( i ) = m a x ( a b s ( i . x − t . x ) , a b s ( i . y − t . y ) ) h(i) = max(abs(i.x - t.x),abs(i.y - t.y)) h(i)=max(abs(i.xt.x),abs(i.yt.y))
(3)欧几里得距离:可以向任何方向移动
h ( i ) = s q r t ( ( i . x − t . x ) 2 + ( i . y − t . y ) 2 ) h(i) = sqrt((i.x - t.x)^2 + (i.y - t.y)^2) h(i)=sqrt((i.xt.x)2+(i.yt.y)2)

二、IDDFS

IDDFS(Iterative Deepening Depth-First Search)是一种启发式搜索算法,可用于在图或树上进行深度优先搜索(DFS)。

IDDFS结合了迭代深化和深度优先搜索的特点。它的基本思想是进行一系列深度限制的DFS,从深度为1开始,逐渐增加深度直到找到目标节点或遍历完整个图或树。

IDDFS的过程如下:

  1. 以深度为1开始,执行DFS搜索,探索从起始节点出发的深度为1的路径。
  2. 如果在深度为1的搜索中找到目标节点,搜索结束,返回结果。
  3. 如果在深度为1的搜索中没有找到目标节点,增加深度限制,将深度限制设为2,然后重复步骤1和2。
  4. 不断增加深度限制并重复步骤1和2,直到找到目标节点或遍历完整个图或树。

IDDFS的优点是可以控制搜索深度,避免无限循环或过度搜索的问题。它对于搜索空间较大且没有完整的启发式信息时非常有用。然而,IDDFS的时间复杂度较高,可能需要重复许多次深度受限的DFS搜索。

总结起来,IDDFS是一种可以在深度优先搜索中控制搜索深度的算法,适用于在没有完整启发式信息的情况下搜索图或树结构。

三、IDA*

IDA* 是结合A*与IDDFS的算法,即有估价函数的IDDFS,效率很高

下面给出一道IDA*的例题
在这里插入图片描述

#include <stdio.h>
#include <string.h>
const int N = 100;//设置最大层次
int num[N];//记录某一条路径上的数字,num[i]即该路径的第i个节点
int n, depth;
bool dfs(int now,int d){//now为当前路径走到的数字,d为now所在的层数
    if(d > depth)
        return false;
    if(now == n)
        return true;
    if(now << (depth - d) < n)//预估函数,如果最乐观的倍增法都无法在剩余可走层数到达最后结果,直接剪枝
        return false;
    num[d] = now;
    for (int i = 0; i <= d; i++){//继续下一层
        if(dfs(now + num[i], d + 1))
            return true;//加
        else if(dfs(now - num[i],d + 1))
            return true;
    }
    return false;
}

int main(){
    while(~scanf("%d",&n) && n != 0){
        for (depth = 0;; depth++){//IDDFS
            memset(num, 0, sizeof(num));
            if(dfs(1,0)){
                break;
            }
        }
        printf("%d\n", depth);
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1419655.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于如何将Win幻兽帕鲁服务端存档转化为单人本地存档的一种方法(无损转移)

本文转自博主的个人博客&#xff1a;https://blog.zhumengmeng.work,欢迎大家前往查看。 原文链接&#xff1a;点我访问 **起因&#xff1a;**最近大火的开放世界缝合体游戏幻兽帕鲁的大火也是引起了博主的注意&#xff0c;然后博主和周边小伙伴纷纷入手&#xff0c;博主也是利…

npm 和 yarn 的使用

安装 yarn npm i yarn -g查看版本 npm -v yarn --version切换 npm/yarn 的下包镜像源 // 查看当前的镜像源 npm config get registry// 切换淘宝镜像源 // 新的淘宝源&#xff0c;旧的淘宝源已于2022年05月31日零时起停止服务 npm config set registry https://registry.…

【英语趣味游戏】填字谜(Crossword)第2天

谜题出处 柯林斯字谜大全&#xff08;6&#xff09;&#xff0c;Collins——Big Book of Crosswords (Book 6) Puzzle Number: 115 本期单词 横向 1、Fetch (8) 拿&#xff0c;取&#xff0c;8个字母 答案&#xff1a;Retrieve&#xff0c;取到&#xff0c;拿回 5、Common s…

【JaveWeb教程】(34)SpringBootWeb案例之《智能学习辅助系统》的详细实现步骤与代码示例(7)配置文件的设置

目录 SpringBootWeb案例054. 配置文件4.1 参数配置化4.2 yml配置文件4.3 ConfigurationProperties SpringBootWeb案例05 前面我们已经实现了员工信息的条件分页查询以及删除操作&#xff0c;以及实现新增和修改员工。 本节的主要内容&#xff1a; 配置文件的设置 4. 配置文件…

<网络安全>《10 高级威胁检测系统ATD》

1 APT 高级长期威胁&#xff08;英语&#xff1a;Advanced Persistent Threat&#xff0c;缩写&#xff1a;APT&#xff09;&#xff0c;又称高级持续性威胁、先进持续性威胁等&#xff0c;是指隐匿而持久的电脑入侵过程&#xff0c;通常由某些人员精心策划&#xff0c;针对特…

FairGuard游戏加固入选《CCSIP 2023中国网络安全行业全景册(第六版)》

2024年1月24日&#xff0c; FreeBuf咨询正式发布《CCSIP 2023中国网络安全行业全景册(第六版)》。本次发布的全景图&#xff0c;共计展示20个一级分类、108个细分安全领域&#xff0c;旨在为广大企业提供网络安全产品选型参考&#xff0c;帮助企业了解中国网络安全技术与市场的…

selenium总结-css 定位高级语法

文章目录 推荐的定位方式的优先级定位元素的注意事项&#xff08;划重点&#xff09;CSS选择器组成id 选择器class 选择器标签选择器分组选择器属性选择器组合选择符伪类最佳实践 推荐的定位方式的优先级 优先级最高&#xff1a;ID优先级其次&#xff1a;name优先级再次&#…

C++3.0

#include <iostream>using namespace std;class Per//封装一个Per类 { private://表示私有属性string name;//姓名int age;//年龄int *height;//身高double *weight;//体重 public://无参构造函数Per(){cout << "Per::无参构造函数" << endl;}//有…

IndexedDB查询

Indexeddb 创建、增删改查_indexdb 删除表-CSDN博客本地数据库IndexedDB - 学员管理系统之条件筛选&#xff08;四&#xff09;_indexdb条件查询-CSDN博客 <div align"center"><input type"text" id"input_search"> <button id&q…

Vue深入学习3—数据响应式原理

1、数据响应式原理 1.1、MVVM是什么&#xff1f; 简单来说&#xff0c;就是数据变了&#xff0c;视图也会跟着变&#xff0c;首先你得定义一个带有{{ }}的模板Model&#xff0c;当数据中的值变化了&#xff0c;视图View就会跟着变化&#xff1b;视图模型View-model是模板Model和…

从零开始:Linux systemd Unit文件编写全攻略

从零开始&#xff1a;Linux systemd Unit文件编写全攻略 引言基础知识Systemd简介Unit文件的概念Unit文件的类型 Unit文件结构详解基本结构必要的配置项不同类型Unit文件的特殊配置 编写Unit文件的步骤准备工作和环境设置实际编写步骤 实战案例案例背景步骤一&#xff1a;编写服…

第九节HarmonyOS 常用基础组件13-TimePicker

1、描述 时间选择组件&#xff0c;根据指定参数创建选择器&#xff0c;支持选择小时以及分钟。默认以24小时的时间区间创建滑动选择器。 2、接口 TimePicker(options?: {selected?: Date}) 3、参数 selected - Date - 设置选中项的时间。默认是系统当前的时间。 4、属性…

关于C++ 出现Bus error问题的排查

前言 项目代码中经常出现莫名其妙的Bus error问题&#xff0c;并且代码中增加很多try catch 后依然不能将错误捕获&#xff0c;一旦Bus erro出现&#xff0c;进程直接崩溃掉。类似如下这种: 经查询google&#xff0c;出现该问题一般是因为地址未对齐引起的&#xff0c;也就是…

spark window源码探索

核心类&#xff1a; 1. WindowExec 物理执行逻辑入口&#xff0c;主要doExecute()和父类WindowExecBase 2. WindowFunctionFrame 窗框执行抽象&#xff0c;其子类对应sql语句的不同窗框 其中又抽象出BoundOrdering类, 用于判断一行是否在界限内(Bound), 分为RowBoundOrdering…

【Vue.js设计与实现】阅读笔记(持续更新)

从高层设计的角度去探讨框架需要关注的问题。 参考&#xff1a;速读《Vue.js 设计与实现》 - 掘金 (juejin.cn) 文章目录 第一章 权衡的艺术命令式和声明式性能与可维护性的权衡运行时和编译时 第二章&#xff1a;框架设计的核心要素__DEV__&#xff1a;在开发环境中为用户提供…

【AD9361 LVDS 时序图 补充】

ADI 官方图 ​2T2R LVDS 整理补充完整 特别注意调整frame

Visual Studio 2022 C++ 生成dll或so文件在windows或linux下用C#调用

背景 开发中我们基本使用windows系统比较快捷&#xff0c;但是部署的时候我们又希望使用linux比较便宜&#xff0c;硬件产商还仅提供了c sdk&#xff01;苦了我们做二次开发的码农。 方案 需要确认一件事&#xff0c;目前c这门语言不是跨平台的 第一个问题【C生成dll在window…

Unity3d Cinemachine篇(三)— FreeLook

文章目录 前言一、使用FreeLook制造第三人称跟随效果1. 创建一个游戏物体2. 创建FreeLook相机4. 完成 前言 上一期我们简单的使用了Dolly CamerawithTrack相机&#xff0c;这次我们来使用一下FreeLook 一、使用FreeLook制造第三人称跟随效果 1. 创建一个游戏物体 游戏物体比较…

美国将限制中国,使用Azure、AWS等云,训练AI大模型

1月29日&#xff0c;美国商务部在Federal Register&#xff08;联邦公报&#xff09;正式公布了&#xff0c;《采取额外措施应对与重大恶意网络行为相关的国家紧急状态》提案。 该提案明确要求美国IaaS&#xff08;云服务&#xff09;厂商在提供云服务时&#xff0c;要验证外国…

【Linux】fork()函数

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…