分享好友 最新动态首页 最新动态分类 切换频道
利用百度地图API和群蚁算法,对TSP问题进行模拟与求解
2024-12-26 09:31

最近由于换了工作,期间也有反思和总结上家公司的得失,总觉得有什么事情当初可以完成或者完成得更好,其中TSP问题就是其中之一。当初在开发一个仓配系统的时候,有一个线路排程的需求,当时自己简单在纸上画了思路,发现求精确解算法复杂度是N!,所以去百度,发现了NPC问题的概念,但是一直以来都没有对这个问题好好研究过,最终只是选择了贪心算法这一求近似解的方案,正好这是我的第一篇博客,就拿这个“遗憾”开刀吧。

1、  利用百度地图API模拟TSP的各个城市点

1.1、 调用百度地图API解析经纬度

这里首先到百度地图API官网申请一个apiKey,调地址解析接口会使用到,其中地址解析接口的参数可以访问http://lbsyun.baidu.com/index.php?title=uri/api/web开查看,这里我先将它截图

 

将示例中的url(这里的output我采用json)在浏览器中输入,会得到如下结果

 

这里利用HttpRequest方法来调用地址解析接口,类似于爬虫,最后将结果反序列化为实体类,代码如下

///地址解析结果的实体类

 

///利用HttRequest调用API接口

 

 

 

1.2、利用经纬度计算两个地址间的距离

其实这个网上有大量雷同的计算方法,但是这个方法是我很久以前引用过来的,原出处已经翻不到了,只好在这里点出此算法非我原创,若有幸让原作者看到,请通知我注明出处。这里我先简单的介绍一下算法思路,以地球的球心作为坐标系原点作一个三维坐标系,如图

 

其中坐标A(x1,y1,z1),坐标B(x2,y2,z2),注意一下,其中x=r*sinɵ*cosɸ,y=r* r*sinɵ*sinɸ,z=r*cos ɵ,这里将角度转化为π来计算,让经纬度*π/180,那么坐标点在北纬时:ɵ=π/2-纬度*π/180;坐标点在南纬时:ɵ=π/2+纬度*π/180;坐标点在西经时:ɸ=π*2-经度*π/180;这个换算完成后,就可以通过给(x1-x2)^2+(y1-y2)^2+(z1-z2)^2开方计算出两点间的直线距离d,然后通过余弦定理求两点之间的夹角,最后计算出两点之间的球面距离,代码如下

 

 

 

2、  通过群蚁算法求最短路径的近似解

关于群蚁算法,网上的介绍也有很多,不过偷下懒,只关注了C#的实现,这里参考的是园子里数据之巅的群蚁算法理论与实践全攻略——旅行商等路径优化问题的新方法 ,我就指出我对这篇文章理解起来比较费力的几点吧。

(1)这里的轮盘赌注法是遗传算法的一种思路,即通过产生一个随机数来选择下一个访问的城市,可以把0.081、0.74、0.18视为[0,0.081],[0.081,0.821],[0.821,1]这么三个区间,然后产生一个0到1的随机数(保留两位有效小数,当这个随机小数属于区间[0,0.081]时,选择城市B,属于[0.081,0.821]时,选择城市C,属于[0.821,1]时,选择城市D。这里是对群蚁算法的一种优化,优化方式有多种,可以自行查阅资料。

 

(2)代码处关于List的深复制

 

这个原作者没有给出实现,我用拓展方法实现了一下,代码如下

 

 

(3)贪心算法的实现

 

这个原作者也没有给出,于是我自己实现了一下(可能在时间和空间复杂调用上有很大缺陷,这个的优化工作本人暂不处理,大家有兴趣的可以自己实现,代码如下

 

整个群蚁算法的代码基本沿用了原作者的代码,没有什么改变,所以就不贴整套的了。

 

3、 测试代码

 

 

运行结果

 

这里注意调整BaseTspAntSystem类构造方法的参数,信息素越强(参数a,即能见度越高,收敛性越强,得到的结果路径就越单一,精确性会差一些,大家可以自己调整下参数观察不同的结果。

4、 总结

最新文章
深入浅出:xhs小红书数据抓取工具使用详解
xhs 是一个基于 Python 开发的爬虫工具,专门用于从小红书网站提取数据。该工具通过封装网络请求,为用户提供了简洁的数据抓取接口。xhs 遵循 MIT 许可证,源代码在 GitHub 上公开,由开发者 @ReaJason 负责维护。其主要优势在于提供简单易
上海刚刚发生一起坠楼事件,深层数据分析执行_5DM45.622
近日,上海某高层住宅区发生了一起令人震惊的坠楼事件。据初步报道,一名男子从高楼坠落,不幸身亡。事件发生后,当地警方迅速介入调查,以确定事件的具体原因。这起悲剧不仅震动了社区,也引起了公众对于高层建筑安全问题的关注。上海作为
nba历史最佳小前锋排名?
1:拉里.伯德身高: 2.06米 / 6尺9寸 体重: 100公斤 / 220磅 选秀: 1978年第1轮第6位职业生涯897场常规赛,21791分 8974篮板 5695助攻 1556抢断 755盖帽场均:24.3分 10.0篮板 6.3助攻 1.73抢断 0.84盖帽 49.6%命中率季后赛164场,3897分 16
九大国产AI模型助力,共筑6亿国民的人工智能梦想
2024年 10 月 13 日,工业和信息化部总工程师,赵立国发表讲话:“我国人工智能核心产业的规模在不断提升,企业数量超过了 4500 家,完成注册并提供服务的生成式人工智能服务大模型数量已经超过200个,
最全OkHttp源码解析(小白必看,建议收藏),聪明人已经收藏了
最后 由于篇幅原因,就不多做展示了 本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录需要这份系统化的资料的朋友,可以点击这里获取 4、响应码 1** 信
高德地图商家标注,免费操作指南
本文将详细介绍高德地图商家如何免费标注自己的店铺位置,包括准备步骤、具体操作流程以及常见问题解答。通过本文的指导,您将能够轻松将自己的店铺添加到高德地图中,提高店铺的曝光率,吸引更多潜在客户。一、标题:高德地图商家标注,轻
高清美女写真生成:你也能用AI技术轻松打造自己的绝美写真!
在这个数字化迅猛发展的时代,人工智能(AI)正在悄然改变人们的生活方式。尤其是在艺术领域,AI绘画工具愈发显示出强大的潜力,比如最近在网络上热议的美女写真生成器。这些工具不仅能为我们带来极致的视觉享受,还能轻松地为我们的生活增
淘宝天猫SEO从入门到精通
    《天猫SEO从门到精通》手把手地教有需要的朋友掌握天猫SEO的本领,更是为了帮助大家释放天猫SEO的惊人作用,帮助大家将店铺造为“有排名、有流量、有口碑”的明星店铺,真正实现畅销加长销,帮助大家在天猫平台上纵横驰骋、步步攀升
关于Content-Type的配置
分片上传步骤较多,包括初始化、文件切片、各个分片上传、完成上传。为了简化分片上传,可以使用AWS.S3.ManagedUpload接口进行分片上传。Content-Type用于标识文件的资源类型,比如,是图片类型,, 是视频类型,, 是文本类型, 浏览器针
相关文章
推荐文章
发表评论
0评