定义

先复制一则定义

A*算法在人工智能中是一种典型的启发式搜索算法

启发中的估价是用估价函数表示的:

h(n)=f(n)+g(n)

其中f(n)是节点n的估价函数

g(n)表示实际状态空间中从初始节点到n节点的实际代价

h(n)是从n到目标节点最佳路径的估计代价。

另外定义h'(n)为n到目标节点最佳路径的实际值。

如果h'(n)≥h(n)则如果存在从初始状态走到目标状态的最小代价的解

那么用该估价函数搜索的算法就叫A*算法。

有点繁琐,但也看得过去

通俗来讲

的核心在于上面所讲到的估价函数

他是干什么用的呢

就是我们在搜索的过程中,保证更优的先搜用的

还是有些繁琐对不对,嗯,我也不大会讲啊(没事我会加油)


嘿,认真看下面,我可认真了的啊。。。

如果一个题目要求我们求前K个代价最小的解(只是一个典型,不是所有题目都这样)

假设我们现在有一个状态在

已经要记录到答案里面的代价是(我喜欢用这个)

我们发现如果爆搜的话状态会是乱的对不对,肯定会使搜索搜到太多

而如果直接把状态按照排序的话不能保证答案就会正确(当然,不然就去贪心去)

所以我们引进一个估价函数状态

当然要求一般是可以预处理出一个状态到答案状态的最优解

回到前面讲到的当前状态

如果我们把与并列的所有状态按排序呢?

既不影响答案的正确性,又可以减少坏状态的转移

(因为题目要求是K个最优状态,而这样待决策状态会有序且跑完K个就可以结束,所以会变快)

好吧,还有点蒙对不对,那我们看例题

例题

[洛谷P2901 USACO08MAR]牛慢跑Cow Jogging

好像其他很多都有,但是是权限。。。

题目简述

要求我们求出从起点n到终点1的最短K条路径的长度

(只能从编号大的点往编号小的点走&边有边权)

很裸对吧?

  1. 预处理估价函数

先跑一遍反向边的预处理出每个点到1的最短路作为估价函数

  1. 直接跑(这里用实现)

从n号点开始,用堆来代替队列(实现上面所讲的排序)

这时候先到1节点的肯定答案更优(也就是路径更短)

原因很简单吧:估价函数保证答案合法,而排序之后答案有序

搜到K个到达1节点的路径就可以结束,快的飞起。。。

放个代码?

好不容易写一次注释

#include<bits/stdc++.h>
#define lst long long
#define ldb double
#define N 1050
#define M 10050
#define qw ljl[i].to
using namespace std;
const lst Inf=1e15;
int read()
{
int s=0,m=0;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')m=1;ch=getchar();}
while( isdigit(ch))s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
return m?-s:s;
}
int n,m,K,Done;
bool in[N];
lst dis[N];
queue<int> Q;
int hd[N],cnt;
struct EDGE{int to,nxt,v;}ljl[M<<1];
void Add(int p,int q,int o){ljl[++cnt]=(EDGE){q,hd[p],o},hd[p]=cnt;}
void SPFA()
{
for(int i=2;i<=n;++i)dis[i]=Inf;
while(!Q.empty())Q.pop();
Q.push(1),dis[1]=0,in[1]=true;
while(!Q.empty())
{
int now=Q.front();Q.pop(),in[now]=false;
for(int i=hd[now];i;i=ljl[i].nxt)
if(qw>now&&dis[qw]>dis[now]+ljl[i].v)
{
dis[qw]=dis[now]+ljl[i].v;
if(!in[qw])in[qw]=true,Q.push(qw);
}
}
}
//h[i]=g[i]+f[i]---->ans[i]=D+dis[i]
struct NODE{
lst D;int id;
bool operator<(const NODE &X) const
{
return D+dis[id]>X.D+dis[X.id];
}
};priority_queue<NODE> H;
void A_star_Bfs()
{
while(!H.empty())H.pop();
H.push((NODE){0,n});
while(!H.empty())
{
NODE temp=H.top();
int now=temp.id;H.pop();
if(now==1)
{
printf("%lld\n",temp.D);
if(++Done==K)return;continue;
}
for(int i=hd[now];i;i=ljl[i].nxt)
if(qw<now)H.push((NODE){temp.D+ljl[i].v,qw});
}while(Done<K)++Done,puts("-1");
}
int main()
{
n=read(),m=read(),K=read();
for(int i=1;i<=m;++i)
{
int p=read(),q=read(),o=read();
Add(p,q,o),Add(q,p,o);
}
SPFA(),A_star_Bfs();
return 0;
}
/************
1.A*算法在人工智能中是一种典型的启发式搜索算法
启发中的估价是用估价函数表示的:
h(n)=f(n)+g(n)
其中f(n)是节点n的估价函数
g(n)表示实际状态空间中从初始节点到n节点的实际代价
h(n)是从n到目标节点最佳路径的估计代价。
另外定义h'(n)为n到目标节点最佳路径的实际值。
如果h'(n)≥h(n)则如果存在从初始状态走到目标状态的最小代价的解
那么用该估价函数搜索的算法就叫A*算法。
2.第K最短路的算法
我们设源点为s,终点为t,我们设状态f(i)的g(i)为从s走到节点i的实际
距离,h(i)为从节点i到t的最短距离,从而满足A*算法的要求,
当第K次走到f(n-1)时表示此时的g(n-1)为第K最短路长度。
3.这里是kuai的xzy的。。。别怪我。。。
*************/

总结

暂时就将这么多吧

主要是看到网上没有写的那么通俗的搜索

就想自己总结一下(其实也不通俗。。。)

撤撤撤溜了溜了*_*

A*(A star)搜索总结的更多相关文章

  1. A*(A_star)搜索总结

    \(A^*(A star)\)搜索总结 标签:算法--搜索 阅读体验:https://zybuluo.com/Junlier/note/1299772 定义 先复制一则定义 \(A^*\)算法在人工智 ...

  2. T4 模板自动生成带注释的实体类文件 - 只需要一个 SqlSugar.dll

    生成实体就是这么简单,只要建一个T4文件和 文件夹里面放一个DLL. 使用T4模板教程 步骤1 创建T4模板 ,一定要自已新建,把T4代码复制进去,好多人因为用我现成的T4报错(原因不明) 点击添加文 ...

  3. grep 正则表达式

    本文转自:http://www.jb51.net/article/31207.htm 正则表达式只是一种表示法,只要工具支持这种表示法, 那么该工具就可以处理正则表达式的字符串.vim.grep.aw ...

  4. T4 模板自动生成带注释的实体类文件

    T4 模板自动生成带注释的实体类文件 - 只需要一个 SqlSugar.dll 生成实体就是这么简单,只要建一个T4文件和 文件夹里面放一个DLL. 使用T4模板教程 步骤1 创建T4模板 如果你没有 ...

  5. Linux正则表达式grep与egrep

    grep -io "http:/=[A-Z0-9]\{16\}" ./wsxf.txt >wsxf_urls.txt Linux正则表达式grep与egrep 正则表达式:它 ...

  6. grep与正则表达式,grep、egrep和fgrep

    grep用法详解:grep与正则表达式 首先要记住的是: 正则表达式与通配符不一样,它们表示的含义并不相同!正则表达式只是一种表示法,只要工具支持这种表示法, 那么该工具就可以处理正则表达式的字符串. ...

  7. grep用法

    正则表达式只是一种表示法,只要工具支持这种表示法, 那么该工具就可以处理正则表达式的字符串.vim.grep.awk .sed 都支持正则表达式,也正是因为由于它们支持正则,才显得它们强大:在以前上班 ...

  8. grep与正则表达式详解和实例

    转载自:http://www.jb51.net/article/31207.htm grep 工具,以前介绍过. grep -[acinv] '搜索内容串' filename -a 以文本文件方式搜索 ...

  9. grep用法详解:grep与正则表达式

    首先要记住的是: 正则表达式与通配符不一样,它们表示的含义并不相同!正则表达式只是一种表示法,只要工具支持这种表示法, 那么该工具就可以处理正则表达式的字符串.vim.grep.awk .sed 都支 ...

  10. 每天一个linux命令8之grep高级篇

    1语法       grep -[acinv] '搜索内容串' filename -a 以文本文件方式搜索-c 计算找到的符合行的次数-i 忽略大小写-n 顺便输出行号-v 反向选择,即找 没有搜索字 ...

随机推荐

  1. 【HITCON 2017】SSRFme——最简单伪协议思路

    [HITCON 2017]SSRFme 1. 看题 代码: <?php if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $http_x_header ...

  2. 深入了解PBKDF2加密技术:原理与实践

    摘要:本文详细介绍了PBKDF2(Password-Based Key Derivation Function 2)加密技术,包括其原理.算法流程和实际应用,旨在帮助读者更好地理解这一重要的加密方法. ...

  3. 使用React+SpringBoot开发一个协同编辑的表格文档

    本文由葡萄城技术团队发布.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前言 随着云计算和团队协作的兴起,协同编辑成为了许多企业和组织中必不可少的需求.通 ...

  4. 如何给el-table中某一列加指定内容和点击事件

    背景: 小颖最近在写项目时遇到了要给  element-ui 中的  el-table 在 v-for  el-table-column 标签时给某列加内容和点击事件,项目忙完了想着总结一下,下面一起 ...

  5. WPF应用开发之控件动态内容展示

    在我们开发一些复杂信息的时候,由于需要动态展示一些相关信息,因此我们需要考虑一些控件内容的动态展示,可以通过动态构建控件的方式进行显示,如动态选项卡展示不同的信息,或者动态展示一个自定义控件的内容等等 ...

  6. jmeter--jsr223组件使用和功能详解

    相比于BeanShell 取样器,JSR223取样器具有可大大提高性能的功能(编译)如果需要,一定要使用JSR223取样器编写脚本是更好的选择!!! 属性描述名称:显示的此取样器的描述性名称,可自定义 ...

  7. 数字孪生融合GIS系统能够为物流行业提供什么解决方案?

    全球贸易和电子商务的不断发展,让物流行业面临着越来越多的挑战.其中,提高运输效率.降低成本.优化供应链和增强可持续性等问题成为业界关注的焦点.在这个数字化时代,数字孪生和GIS系统的融合为物流行业带来 ...

  8. ElasticSearch之Close index API

    关闭指定的索引. 索引关闭之后: 停止对读.写操作的响应. 停止检索操作的响应. 在索引关闭前,允许执行的操作,关闭之后均不允许执行. ElasticSearch取消对索引的相关维护操作,包含内存中的 ...

  9. 2023.2 IDEA安装激活教程

    1.下载安装IntelliJ IDEA 先去官网下载,我这里下载的是最新版本的2023.2,测试过2023最新版本以及2022版本以上的版本没问题. 安装然后打开 提示要输入激活码,先关闭应用,等下再 ...

  10. CentOS配置DNS服务器(BIND 9.11.*版本),并配置3种转发模式

    BIND 9.11.*版本可以yum直接安装 安装BIND组件,开启DNS服务,检查状态 yum install bind bind-utils systemctl start named syste ...