吴飞教授 人工智能 模型与算法 启发式搜索课件发散分析

一、文章介绍

本文是针对吴飞教授在MOOC课程 :《人工智能:模型与算法》 2.1节 启发式搜索的课前发散
课程介绍
在课程2.1节 启发式搜索章节中,吴飞教授以如何计算城市地图两点之间最短路径为例,重点讲授了贪婪最佳优先搜索A*搜索算法;但并未使用“笨办法”:遍历查询的方式来解决该需求,对于算法初学者来讲无法直观比较出搜索算法带来的效率提升。故本文目的在于通过遍历查询不借助任何算法,利用python内建数据结构与方法实现任意两点的所有可能路径及开销。

二、信息收集

根据课件,我们可以知晓以下信息:

  1. 城市地图
  2. 相邻城市的实际距离

地图如下:
map_info
将以上信息录入python字典:

city_map = {'Arad':{'Zerind':75,'Sibiu':140,'Timisoara':118},
            'Zerind':{'Oradea':71},
            'Oradea':{'Sibiu':151},
            'Timisoara':{'Lugoj':111},
            'Lugoj':{'Mehadia':70},
            'Mehadia':{'Drobeta':75},
            'Drobeta':{'Craiova':120},
            'Craiova':{'Pitesti':138},
            'Sibiu':{'Fagaras':99,'Rimnicu Vilcea':80},
            'Rimnicu Vilcea':{'Craiova':146,'Pitesti':97},
            'Fagaras':{'Bucharest':211},
            'Pitesti':{'Bucharest':101},
            'Bucharest':{'Giurgiu':90,'Urziceni':85},
            'Urziceni':{'Hirsova':98,'Vaslui':142},
            'Hirsova':{'Eforie':86},
            'Vaslui':{'Iasi':92},
            'Iasi':{'Neamt':87},   
            
}

问题1: 信息录入我们采取水平分割的录入方式,每个城市只录入下游相邻节点。 以Sibiu为例,其上游城市为AradOradea; 但是并不录入,只录入FagarasRimnicu Vilcea.

三、代码实现

3.1 数据处理

为了解决上述问题1,需要针对收集的城市数据进行处理,输出直观的全邻接信息。

# 统计city_map节点邻接关系
fullmesh_city_map={}      #  用于记录全互联地图

# 遍历手工地图信息,正向解析下游城市
for k,v in city_map.items():
    next_hop={}
    for _k,_v in v.items():
        next_hop[_k]=_v
        if _k in city_map:   # 逆向解析上游城市
            if _k in fullmesh_city_map:
                fullmesh_city_map[_k].update({k:_v})
            else: # 
                fullmesh_city_map[_k] = {k:_v}
        else:  # 处理边界城市
            fullmesh_city_map[_k] = {k:_v}

    if k in fullmesh_city_map:
        fullmesh_city_map[k].update(next_hop)
    else:
        fullmesh_city_map[k]=next_hop

# 打印
for k,v in fullmesh_city_map.items():
    print(k,v)

输出结果如下:

Zerind {‘Arad’: 75, ‘Oradea’: 71}
Sibiu {‘Arad’: 140, ‘Oradea’: 151, ‘Fagaras’: 99, ‘Rimnicu Vilcea’: 80}
Timisoara {‘Arad’: 118, ‘Lugoj’: 111}
Arad {‘Zerind’: 75, ‘Sibiu’: 140, ‘Timisoara’: 118}
Oradea {‘Zerind’: 71, ‘Sibiu’: 151}
Lugoj {‘Timisoara’: 111, ‘Mehadia’: 70}
Mehadia {‘Lugoj’: 70, ‘Drobeta’: 75}
Drobeta {‘Mehadia’: 75, ‘Craiova’: 120}
Craiova {‘Drobeta’: 120, ‘Pitesti’: 138, ‘Rimnicu Vilcea’: 146}
Pitesti {‘Craiova’: 138, ‘Rimnicu Vilcea’: 97, ‘Bucharest’: 101}
Fagaras {‘Sibiu’: 99, ‘Bucharest’: 211}
Rimnicu Vilcea {‘Sibiu’: 80, ‘Craiova’: 146, ‘Pitesti’: 97}
Bucharest {‘Fagaras’: 211, ‘Pitesti’: 101, ‘Giurgiu’: 90, ‘Urziceni’: 85}
Giurgiu {‘Bucharest’: 90}
Urziceni {‘Bucharest’: 85, ‘Hirsova’: 98, ‘Vaslui’: 142}
Hirsova {‘Urziceni’: 98, ‘Eforie’: 86}
Vaslui {‘Urziceni’: 142, ‘Iasi’: 92}
Eforie {‘Hirsova’: 86}
Iasi {‘Vaslui’: 92, ‘Neamt’: 87}
Neamt {‘Iasi’: 87}

根据以上结果,可以发现任意城市都记录了上下游相邻城市。这便于后续代码的实现。

3.2 路径计算

本节代码用于计算任意两个给定城市间的可能路径和代价。因采用遍历的形式,且无任何标志用于判断程序是否已经得出两点之间的全部可能路径,故只能通过夸张的遍历次数来进行覆盖。

需求如下:
计算 城市’Oradea’与’Neamt’之间的可能路径与代价。

代码实现如下:

root = 'Oradea'
start = root
end = 'Neamt'

path = []
finnal_path=[]
times = 0
update_pop =[None]

while times<100000:    
    for k,v in fullmesh_city_map[start].items():
        if update_pop[0] == None:
            temp_path = [start,k,v]
            path.append(temp_path)
        else:
            if k in update_pop:
                path.append(update_pop)
            else:
                update_pop.insert(-1,k)
                update_pop[-1] += v
                path.append(update_pop)
                update_pop=[]
                for i in x_copy:
                    update_pop.append(i)
                
    for x in path:
        if x[-2] == end:
            _a = []
            for _x in x:
                _a.append(_x)
            if _a not in finnal_path:
                finnal_path.append(_a)
            else:pass
         
    update_pop = path.pop(0)
    x_copy = []
    for i in update_pop:
        x_copy.append(i)
    start = update_pop[-2]    
    times+=1

# 打印结果
path_number = 1
for i in finnal_path:
    print("线路{}: ".format(path_number),("--->".join(i[0:-1])),"距离 ",i[-1])
    path_number += 1

经过计算,共有12条可选路径。

四、完整代码

以下代码运行后会出现12条可选路径。大家可自行验证。 自此,大家在学习玩搜索算法后方便感知算法的带来的效率改善情况。

city_map = {'Arad':{'Zerind':75,'Sibiu':140,'Timisoara':118},
            'Zerind':{'Oradea':71},
            'Oradea':{'Sibiu':151},
            'Timisoara':{'Lugoj':111},
            'Lugoj':{'Mehadia':70},
            'Mehadia':{'Drobeta':75},
            'Drobeta':{'Craiova':120},
            'Craiova':{'Pitesti':138},
            'Sibiu':{'Fagaras':99,'Rimnicu Vilcea':80},
            'Rimnicu Vilcea':{'Craiova':146,'Pitesti':97},
            'Fagaras':{'Bucharest':211},
            'Pitesti':{'Bucharest':101},
            'Bucharest':{'Giurgiu':90,'Urziceni':85},
            'Urziceni':{'Hirsova':98,'Vaslui':142},
            'Hirsova':{'Eforie':86},
            'Vaslui':{'Iasi':92},
            'Iasi':{'Neamt':87},   
            
}



# 统计city_map节点邻接关系
fullmesh_city_map={}      #  用于记录全互联地图

# 遍历手工地图信息,正向解析下游城市
for k,v in city_map.items():
    next_hop={}
    for _k,_v in v.items():
        next_hop[_k]=_v
        if _k in city_map:   # 逆向解析上游城市
            if _k in fullmesh_city_map:
                fullmesh_city_map[_k].update({k:_v})
            else: # 
                fullmesh_city_map[_k] = {k:_v}
        else:  # 处理边界城市
            fullmesh_city_map[_k] = {k:_v}

    if k in fullmesh_city_map:
        fullmesh_city_map[k].update(next_hop)
    else:
        fullmesh_city_map[k]=next_hop

# 打印
for k,v in fullmesh_city_map.items():
    print(k,v)



root = 'Oradea'
start = root
end = 'Neamt'

path = []
finnal_path=[]
times = 0
update_pop =[None]

while times<100000:    
    for k,v in fullmesh_city_map[start].items():
        if update_pop[0] == None:
            temp_path = [start,k,v]
            path.append(temp_path)
        else:
            if k in update_pop:
                path.append(update_pop)
            else:
                update_pop.insert(-1,k)
                update_pop[-1] += v
                path.append(update_pop)
                update_pop=[]
                for i in x_copy:
                    update_pop.append(i)
                
    for x in path:
        if x[-2] == end:
            _a = []
            for _x in x:
                _a.append(_x)
            if _a not in finnal_path:
                finnal_path.append(_a)
            else:pass
         
    update_pop = path.pop(0)
    x_copy = []
    for i in update_pop:
        x_copy.append(i)
    start = update_pop[-2]    
    times+=1

# 打印结果
path_number = 1
for i in finnal_path:
    print("线路{}: ".format(path_number),("--->".join(i[0:-1])),"距离 ",i[-1])
    path_number += 1

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Materialise Mimics各版本安装指南

Materialise Mimics下载链接 https://pan.baidu.com/s/1GYnAuXfbgk_n-OXLNSOt6w?pwd0531 1.鼠标右击【Materialise Mimics21】压缩包&#xff08;win11及以上系统需先点击“显示更多选项”&#xff09;【解压到 Materialise Mimics21】。 2.打开解压后的文件夹&#xff0c;鼠…

网页设计与制作web前端设计html+css+js成品。电脑网站制作代开发。vscodeDrea 【企业公司宣传网站(HTML静态网页项目实战)附源码】

网页设计与制作web前端设计htmlcssjs成品。电脑网站制作代开发。vscodeDrea 【企业公司宣传网站&#xff08;HTML静态网页项目实战&#xff09;附源码】 https://www.bilibili.com/video/BV1Hp4y1o7RY/?share_sourcecopy_web&vd_sourced43766e8ddfffd1f1a1165a3e72d7605

大学物理-实验篇——用拉伸法测定金属丝的杨氏(弹性)模量(胡克定律、杨氏模量、平面反射镜、三角函数、螺旋测微器)

目录 预备知识 力学&#xff1a;胡克定律&#xff08;Hookes law&#xff09; 材料力学&#xff1a;杨氏模量 光学&#xff1a;平面反射镜 数学&#xff1a;三角函数 螺旋测微器 实验目的 实验仪器 实验原理 1.拉伸法测杨氏弹性模量 2.光杠杆放大法测量微小伸长量 …

Mac M1 Parallels CentOS7.9 Install Parallels Tools

一、挂载parallels-tools安装包 mkdir /media/cdrom/ mount /dev/cdrom /media/cdrom/ mount: /dev/sr0 写保护&#xff0c;将以只读方式挂载二、GCC升级 yum install -y centos-release-scl yum install -y devtoolset-8-gcc*# 切换当前会话中gcc版本为8 scl enable devtool…

HarmonyOS应用开发学习笔记 UIAbility组件与UI的数据同步 EventHub、globalThis

1、 HarmoryOS Ability页面的生命周期 2、 Component自定义组件 3、HarmonyOS 应用开发学习笔记 ets组件生命周期 4、HarmonyOS 应用开发学习笔记 ets组件样式定义 Styles装饰器&#xff1a;定义组件重用样式 Extend装饰器&#xff1a;定义扩展组件样式 5、HarmonyOS 应用开发…

重磅!图扑软件获评国家级专精特新“小巨人”企业

2023 年 7 月&#xff0c;工业和信息化部审核并公布了第五批国家级专精特新“小巨人”企业&#xff0c;图扑软件成功入选&#xff0c;荣膺国家级专精特新“小巨人”企业称号。 此次荣获国家级专精特新“小巨人”企业称号&#xff0c;不仅是对图扑软件在可视化和数字孪生领域专业…

ARCGIS PRO SDK Geoprocessing

调用原型&#xff1a;Dim gpResult AS IGPResult await Geoprocessing.ExecuteToolAsync(调用工具名称, GPValue数组, environment, null, null, executeFlags) 一、调用工具名称&#xff1a;地理处理工具名称。如面转线&#xff1a;management.PolygonToLine&#xff0c;而非…

实例:NodeJS 操作 Kafka

本人是C#出身的程序员&#xff0c;c#很简单就能实现&#xff0c;有需要的可以加我私聊。但是就目前流行的开发语言&#xff0c;尤其是面向web方向应用的&#xff0c;我感觉就是Nodejs最简单了。下面介绍&#xff1a; 本文将会介绍在windows环境下启动Kafka&#xff0c;并通过n…

java contains区分大小写吗?String的contains方法区分大小写

文章目录 一、contains区分大小写二、重写contains方法&#xff0c;实现忽略大小写 一、contains区分大小写 Java中的contains方法默认是区分大小写的&#xff0c;如果要忽略大小写&#xff0c;可以使用String类的equalsIgnoreCase()方法来代替。 Java中的contains方法默认是…

STM32CubeMX教程20 SPI - W25Q128驱动

目录 1、准备材料 2、实验目标 3、实验流程 3.0、前提知识 3.1、CubeMX相关配置 3.1.1、时钟树配置 3.1.2、外设参数配置 3.1.3、外设中断配置 3.2、生成代码 3.2.1、外设初始化调用流程 3.2.2、外设中断调用流程 3.2.3、添加其他必要代码 4、常用函数 5、烧录验…

React入门 - 02(工程目录结构解析)

本章内容 目录 1 外层“文件”说明2 各个“文件夹”说明 接着上一节的内容&#xff0c;我们继续这一节的内容–工程目录文件解析。打开上一节已经建好的工程 react-demo,详细的来了解一些里面的文件。 1 外层“文件”说明 .gitignore — 当我们使用 git 的时候&#xff0c;希…

听GPT 讲Rust源代码--compiler(31)

File: rust/compiler/rustc_ast_passes/src/node_count.rs 在Rust源代码的rust/compiler/rustc_ast_passes/src/node_count.rs文件中&#xff0c;它定义了Rust编译器中的AST节点计数器。该文件的作用是统计不同类型的AST节点在程序中的数量&#xff0c;以便在优化和调试过程中能…

FaceChain-FACT:免训练的丝滑体验,秒级别的人像生成

​ 项目主页&#xff1a;FaceChain-fact&#xff1a;Face Adapter for Human AIGC github项目&#xff1a;https://github.com/modelscope/facechain 1.介绍 作为AI人像写真开源项目的佼佼者&#xff0c;FaceChain凭借其丰富多样的风格模版和卓越的人像保真度&#xff0c;深…

【IPC通信--消息队列】

消息队列&#xff08;也叫做报文队列&#xff09;是一个消息的链表。可以把消息看作一个记录&#xff0c;具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以向消息队列中按照一定的规则添加新消息&#xff1b;对消息队列有读权限的进程则可以从消息队列中读走消息…

Type-C双盲插显示器,无需外挂MOS最简版本

在2021年5月&#xff0c;USB-IF协会破茧而出&#xff0c;发布了全新的USB PD3.1规范&#xff0c;如同凤凰涅槃&#xff0c;将快充功率上限从100 W扶摇直上至240 W。这一壮举不仅让USB PD的影响力渗透到手机、笔记本电脑的领域&#xff0c;更是将其触角延伸至了更为广阔的天地&a…

SpikingJelly笔记之泊松编码

文章目录 前言一、泊松编码的原理二、生成符合泊松分布的脉冲序列三、SpikingJelly中的泊松编码四、Lena图像的泊松编码与还原1.原始图像2.图像编码3.图像还原 总结 前言 记录SpikingJelly中泊松编码的使用方法&#xff0c;对图像数据进行编码与还原 一、泊松编码的原理 基于…

在版权付费方面,OpenAI 比人想象中的还要「小气」

随着新闻出版商与AI公司达成“使用新闻训练AI模型”的协议&#xff0c;像 OpenAI 等科技企业愿意为受版权保护的信息支付的价格逐渐浮出水面。 据 The Information 报道&#xff0c;OpenAI 每年愿意向出版商提供 100万到500万美元来支付受版权保护的新闻文章训练其AI模型。 但…

微软最新研究成果:使用GPT-4合成数据来训练AI模型,实现SOTA!

文本嵌入是各项NLP任务的基础&#xff0c;用于将自然语言转换为向量表示。现有的大部分方法通常采用复杂的多阶段训练流程&#xff0c;先在大规模数据上训练&#xff0c;再在小规模标注数据上微调。此过程依赖于手动收集数据制作正负样本对&#xff0c;缺乏任务的多样性和语言多…

成功面试软件工程师的关键素质

目录 前言1 过硬的技术1. 1 不断学习的重要性1.2. 编码实践的重要性1.3 技术分享促进个人成长 2 良好的沟通能力2.1 建立信任与共鸣2.2 沟通技巧的重要性2.3 构建积极的沟通氛围 3 具有良好的性格结语 前言 在当今科技飞速发展的时代&#xff0c;软件工程师作为技术领域的中流…

汪林望教授将于每周三以互动问答直播形式教您如何用龙讯旷腾计算软件PWmat计算不同材料性质

打开VX→搜索“汪林望计算讲座”&#xff0c;关注汪老师的频道&#xff0c;每周三下午16:00我们准时直播&#xff01; 大家提前准备好问题&#xff0c;可直接提问讨论&#xff0c;当面请教 汪林望教授 中科院半导体所首席科学家 北京龙讯旷腾科技有限公司创始人 美国劳伦斯…