人工智能-实验一

news2024/10/8 23:00:56

第一次实验

一.实验目的

  • 掌握有信息搜索策略的算法思想
  • 能够编程实现搜索算法
  • 应用A*搜索算法求解罗马尼亚问题

二.算法原理

1.A*搜索的评估函数

​ A算法是一种启发式算法。A*搜索对结点的评估包含两部分,一部分是到达此结点已经花费的代价,记为g(n);另一部分是该结点到目标结点的最小代价的估计值,记为h(n)。因此,经过结点n的最小代价解的估计代价为:
f ( n ) = g ( n ) + h ( n ) f(n) = g(n) + h(n) f(n)=g(n)+h(n)
​ 每次扩展结点时,首先扩展f(n)最小的结点。假设启发式函数h(n)满足特定的条件,则A
搜索既是完备的也是最优的。

2.保证最优性的条件

​ A*算法保证最优性的条件是可采纳性和一致性。

​ 可采纳性是指估计到达目标的代价时,估计值一定小于实际值,即f(n)一定不会超过经过结点n的解的实际代价。因此当搜索到目标结点时,得到的一定是最优解,没有其他结点的估计值更小。

​ 一致性只作用于图搜索。如果对于每一个结点n和通过任一行动a生成n的每个后继结点n’,结点n到达目标的估计代价不大于从n到n’的单步代价与从n’到达目标的估计代价之和。这保证了h(n)是经n到达目标结点的下界。
h ( n ) ≤ c ( n , a , n ′ ) + h ( n ′ ) h(n)\leq c(n,a,n') + h(n') h(n)c(n,a,n)+h(n)
​ 如果h(n)是可采纳的,则A*进行树搜索是最优的;如果h(n)是一致的,则图搜索的A*算法是最优的。在搜索时,由于A*算法的可采纳性,扩展的结点是下界值最小的,当扩展出目标结点时,得到的一定是最优解。因为目标结点的h(n)=g(n),而这个值小于等于任何其他结点的下界,又根据一致性,之后扩展的目标结点代价不会更低,因此第一个扩展到的目标结点一定是最优解。

3.完备性

​ 完备性要求代价小于等于C*(最优解路径的代价值)的结点是有穷的,每步代价都超过ε并且b是有穷的。

三.求解罗马尼亚问题的算法实现

​ 罗马尼亚问题是一个图的最佳路径搜索问题,可以使用A*算法解决。评估函数 f ( n ) = g ( n ) + h ( n ) f(n)=g(n)+h(n) f(n)=g(n)+h(n),g(n)是到达结点的代价,在扩展结点n时计算,h(n)是结点n距离终点的预计代价,采用直线距离,题中已经给出。由于启发信息h(n)采用直线距离,满足可采纳性和一致性,该搜索方式是最优的。

​ 具体实现时,每个结点需要保存的信息包含g(n),h(n),而f(n)=g(n)+h(n)。由于每次要取出f(n)最小的结点,重载<,便于对结点进行排序。

struct node{
    int g;
    int h;
    int f;
    int name;
    node(int name, int g, int h){
        this->name = name;
        this->g = g;
        this->h = h;
        this->f = g + h;
    };
    bool operator <(const node &a)const{
        return f < a.f;
    }
};

​ 图使用邻接矩阵来存储,并可以初始化所有边的信息。

class Graph{
public:
    Graph()	{memset(graph, -1, sizeof(graph));}
    int getEdge(int from, int to)	{return graph[from][to];}
    void addEdge(int from, int to, int cost){
        if (from >= 20 || from < 0 || to >= 20 || to < 0)
            return;
        graph[from][to] = cost;
    }
	void init(){
        addEdge(O, Z, 71);
		...添加所有边
	}
private:
    int graph[20][20];
};

​ 在搜索过程中,待扩展结点形成一个有序队列,每个结点只扩展一次,需要记录已经扩展过的结点。在初始状态下,每个结点的g(n)值是未知的,因此在扩展当前结点时,要更新当前结点能够到达的所有结点的g(n),保证g(n)取的是到达一个结点的最小代价,为了快速判断更新结点是否在队列中,可以直接记录结点是否在当前队列当中。

bool list[20];				//记录结点是否在当前队列
vector<node> openList;		//扩展队列
bool closeList[20];			//记录结点是否扩展过
stack<int> road;			//记录路径
int parent[20];				//记录路径

​ 开始搜索时首先将起点入队,只要队列中还有可扩展结点,就不断扩展,当扩展结点为目标结点时,搜索结束。扩展结点时,首先要判断当前结点是否能到达新结点,新结点是否扩展过。如果可扩展新结点,新结点在队列中,则遍历队列找到该结点,尝试更新g(n)和f(n),否则直接构造新结点并加入队列,扩展当前结点结束后,对队列进行排序,保证继续取出f(n)最小的结点扩展。

void A_star(int goal,node &src,Graph &graph){
    openList.push_back(src);
    sort(openList.begin(), openList.end());
    while (!openList.empty()){
        /********** Begin **********/
		node cur = openList[0];
        if(cur.name==goal) return;								//取出目标结点,搜索结束
        openList.erase(openList.begin());
        closeList[cur.name] = true;								//当前结点已扩展
        list[cur.name] = false;									//当前结点出队
        for(int i=0;i<20;i++){
            if(graph.getEdge(cur.name, i)!=-1 && !closeList[i]){
                int cost = cur.g + graph.getEdge(cur.name, i);	//到达下一个城市的代价
                if(list[i]){
                   //更新已有结点
                    for(int j=0;j<openList.size();j++){
                        if(openList[j].name==i){
                            if(openList[j].g>cost){
                               openList[j].g = cost;
                               openList[j].f = openList[j].h + cost;
                               parent[i] = cur.name;
                           }
                           break;
                       }
                   }
               }
               else{
                   //构造新结点
                   node newNode(i, cost, h[i]);
                   openList.push_back(newNode);
                   list[i] = true;
                   parent[i] = cur.name;
               }
            }
        }
        sort(openList.begin(), openList.end());
		/********** End **********/  
    }
}

​ 搜索结果是最优解。

在这里插入图片描述

​ 步骤代价为常数的问题,时间复杂度的增长是最优解所在深度d的函数,可以通过启发式的绝对错误和相对错误分析。绝对误差为 Δ = h ∗ − h Δ=h^*-h Δ=hh h ∗ h^* h为根节点到目标结点的实际代价。在最大绝对误差下,A*的时间复杂度为指数级 O ( b Δ ) O(b^Δ) O(bΔ),每步骤代价为常量,因此可以记为 O ( b ε d ) O(b^{εd}) O(bεd),d为解所在深度。

四.思考题

1.宽度优先搜索,深度优先搜索,一致代价搜索,迭代加深的深度优先搜索算法哪种方法最优?

​ 当每一步的行动代价都相等时,宽度优先搜索和迭代加深的深度优先搜索最优,否则一致搜索代价算法最优。宽度优先算法在最浅的目标处于有限深度时是完备的,但只有路径代价是基于结点深度的非递减函数时才是最优的,最典型的就是行动代价相等的情况,迭代加深的深度优先搜索类似,且二者时间复杂度与空间复杂度也相同。一致代价搜索时最优的,扩展路径消耗最小的结点,由于代价非负,第一个被扩展的目标结点一定是最优解。但一致代价搜索可能会探索代价小的行动的搜索树,开销更大。深度优先搜索既不是完备的,也不是最优的。

在这里插入图片描述

2.贪婪最佳优先搜索和A*搜索那种方法最优?

​ A*搜索算法是最优的。贪婪最佳优先算法不具有完备性,也不具有最优性,是否找到最优解与启发式函数有关。而A*搜索算法满足可采纳性和一致性就是最优的,只要分支是有限的就是完备的。

3.分析比较无信息搜索策略和有信息搜索策略。

​ 无信息搜索策略是盲目的搜索,可能需要较大的时间开销和空间开销才能找到解,但是具有好的通用性。有信息搜索策略通过启发式函数利用问题的额外信息,在搜索过程中向着可能有最优解的方向推进,能够提高搜索效率,性能与启发式函数的质量有关。

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

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

相关文章

笔记本电脑的BIOS是怎么保护安全的?

随着攻防技术的不断演进&#xff0c;像BIOS攻击、高级网络代码攻击等手段层出不穷&#xff0c;“受害者”也不仅限于企业级服务器、存储&#xff0c;很多魔爪也开始伸向了拥有商业机密数据的PC。 BIOS是Basic Input/Output System&#xff08;基本输入/输出系统&#xff09;的…

07. Web大前端时代之:HTML5+CSS3入门系列~H5 地理位置

Web大前端时代之&#xff1a;HTML5CSS3入门系列&#xff1a;Web大前端时代之&#xff1a;HTML5CSS3入门系列 - 毒逆天 - 博客园 源码&#xff1a;https://github.com/dunitian/LoTHTML5/tree/master/LoTHTML5/4.HTML5定位 定位类型 IP 定位 优点 任何位置都可用 在服务器端…

获奖!!!元年科技荣获信创“大比武”云平台技术支撑赛道单项奖

2022年底&#xff0c;由北京航空航天大学、北京理工大学、中国电子工业标准化技术协会信息技术应用创新工作委员会&#xff08;简称信创工委会&#xff09;共同主办的2022信创“大比武”活动圆满落幕。大赛由云平台技术支撑、操作系统生态建设、通信业务运营技术等七大赛道构成…

仙境传说RO:添加NPC的定义以及逻辑

仙境传说RO&#xff1a;添加NPC的定义以及逻辑 大家好我是艾西&#xff0c;前面几篇文章中我有跟大家讲解怎么定义一个NPC或是创建一个NPC去实现某个功能等。那么npc的定义是什么呢&#xff1f;今天艾西就跟大家讲解下定义一个npc时每一个参数的作用以及去哪里找每个参数填的值…

Spring AOP 学习(动态代理、JdbcTemplate、Junit)

动态代理 Proxy jdk动态代理&#xff0c;面向接口 cglib 第三方动态代理&#xff0c;面向父类 jdk动态代理 public class Test1 {public static void main(String[] args) {Dinner dinnernew Person("张三");// 通过Porxy动态代理获得一个代理对象,在代理对象中…

公司测试岗来了个卷王之王,还是个00后,真让人崩溃····

现在的小年轻真的卷得过分了&#xff0c;真是完全不把自己当人啊 都说00后躺平了&#xff0c;但是有一说一&#xff0c;该卷的还是卷。这不&#xff0c;前段时间我们公司来了个00后&#xff0c;工作都没两年&#xff0c;跳槽到我们公司起薪18K&#xff0c;都快接近我了。后来才…

京东业务系统数据库分库分表架构设计

有幸参与了整个技术方案实施落地&#xff0c;对架构设计及技术细节深入了解&#xff0c;欢迎大家讨论交流&#xff01; 一元抢宝系统是京东虚拟新兴的一个业务系统&#xff0c;上线以来订单量一直持续增长。在距离618前两个月时&#xff0c;京东商城商品虚拟研发部对系统做了整…

SpringBoot:SpringBoot约定大于配置?②

前言&#xff1a; 这一句话&#xff0c;有些人看过就当看过了&#xff0c;对这句话的解读很多文章我是不满意的&#xff0c;里面蕴含的知识量和信息是极少人关注到的。 基于此&#xff0c;我讲两句。 一、领悟约定大于配置 字面意思&#xff1a;约定的东西要大于配置&a…

Linux中的yum

一、yum介绍 yum是一个基于RPM包(RPM是 Red-Hat Package Manager 红帽软件包管理器的缩写)构建的软件更新机制,能够自动解决软件包之间的依赖关系,解决了日常工作中的大量查找安装依赖包的时间。 二、yum仓库简介 先在yum服务器上创建yum repository(yum仓库),在仓库…

Ranger从入门到精通以及案例实操系列

1、Ranger概述 1.1、什么是Ranger Apache Ranger是一个Hadoop平台上的全方位数据安全管理框架&#xff0c;它可以为整个Hadoop生态系统提供全面的安全管理。 随着企业业务的拓展&#xff0c;企业可能在多用户环境中运行多个工作任务&#xff0c;这就需要一个可以对安全策略进…

Mysql数据库--实现主从复制搭建与同步

Mysql数据库--实现主从复制搭建与同步 &#x1f53b; 一、mysql 同步复制有关概述⛳ 前言、何为主从复制⛳ 1.1 mysql支持的复制方式⛳ 1.2 mysql支持的复制类型1.2.1&#x1f341;异步复制1.2.2&#x1f341;同步复制1.2.3&#x1f341;半同步复制1.2.4&#x1f341;[图解]-异…

Spring高手之路2——深入理解注解驱动配置与XML配置的融合与区别

文章目录 1. 配置类的编写与Bean的注册2. 注解驱动IOC的依赖注入与XML依赖注入对比3. Spring中组件的概念4. 组件注册5. 组件扫描5.1 使用ComponentScan的组件扫描5.2 xml中启用component-scan组件扫描5.3 不使用ComponentScan的组件扫描 6. 组件注册的其他注解7. 将注解驱动的…

MySQL 5.7 主从集群搭建

IP功能Linux版本192.168.56.136MasterCentOS 7.9192.168.56.140SlaveCentOS 7.9 一、安装前的准备 1、卸载老版本 &#xff08;1&#xff09;查看是否安装mariadb&#xff08;centos7默认安装&#xff09; 命令&#xff1a; rpm -qa | grep mariadb &#xff08;2&#xff…

嵌入式软件工程师培训:提升技能、实现卓越

如果您对嵌入式培训感兴趣&#xff0c;以下是一些建议和关键点&#xff0c;可以帮助您进行嵌入式培训&#xff1a; 培训目标&#xff1a;明确确定您的嵌入式培训目标。是为了提升员工的技能水平&#xff0c;使他们能够承担更高级别的嵌入式开发工作&#xff0c;还是为了向非嵌入…

16、DMA直接存储区访问

0x01、DMA简介 DMA(Direct Memory Access)一直接存储器存取&#xff0c;是单片机的一个外设&#xff0c;它的主要功能是用来搬数据&#xff0c;但是不需要占用 CPU&#xff0c;即在传输数据的时候&#xff0c;CPU 可以于其他的事情&#xff0c;好像是多线程一样数据传输支持从…

2022 中国开源创新大赛,时序数据库 TDengine 榜上有名

近日&#xff0c;2022 中国互联网发展创新与投资大赛暨 2022 年中国开源创新大赛在北京落下帷幕&#xff0c;本次大赛由中央网信办信息化发展局指导&#xff0c;中国互联网发展基金会、中国网络空间研究院、中国互联网投资基金联合主办。非常荣幸的是&#xff0c;凭借着强大的开…

他们用卫星,让中国量子通信领跑全球

光子盒研究院 上周二&#xff08;5月30日&#xff09;&#xff0c;中国宣布其神舟十六号飞船与天宫三号空间站成功对接&#xff0c;官方媒体称景海鹏、朱杨柱和桂海潮这三名中国宇航员将有机会研究“新的量子现象”。这意味着中国量子技术发展的一大突破&#xff1a;我们现在可…

IVD体外诊断已经发展成为医疗健康市场活跃领域之一

体外诊断领域的布局覆盖免疫诊断、血液诊断、尿液诊断、生化诊断、微生物诊断等。得益于自主研发驱动下的技术积累和产品创新 近年来&#xff0c;体外诊断已经发展成为医疗健康市场最活跃、增长最快的领域之一。 从全球体外诊断发展来看&#xff0c;据Kalorama Information的统…

接口测试 —— Requests库介绍

1、Requests库 Requests库是用Python语言编写&#xff0c;基于urllib3模块&#xff0c;采用Apache2 Licensed开源协议的 HTTP 库。 虽然Python的标准库中urllib3模块已经包含了平常我们使用的大多数功能&#xff0c;但是它的 API使用起来让人感觉不太友好。而Requests库使用的…

Vue+springboot果蔬有机蔬菜商城销售种植系统与设计

对于网站的前台设计&#xff0c;要保证主界面的整洁有序&#xff0c;能够抓住人的眼球&#xff0c;不会产生视觉疲劳&#xff0c;更重要的是&#xff0c;带给人容易操作的直观感受&#xff0c;这样才能留住用户去进行使用&#xff0c;增加三分热度的延续期。在系统的后台设计上…