ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: aoe1981

[原创] 致敬淡出的大师:五种算法(CW节约、随机贪婪、插入、蚁群、交换优化)求解TSP旅行商问题

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-3-24 20:34 | 显示全部楼层
本帖已被收录到知识树中,索引项:其他结构和算法
aoe1981 发表于 2020-3-24 20:29
附件当中英文太多,没怎么看懂……

观察下图:

我也没看懂,那个原作者和您老人家差不多,那作者也还有个数独的例子的,

TA的精华主题

TA的得分主题

发表于 2020-3-24 20:43 | 显示全部楼层
高人,厉害了。mark下,留着以后学习

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-3-24 20:56 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
FOB_FN_L 发表于 2020-3-24 20:34
我也没看懂,那个原作者和您老人家差不多,那作者也还有个数独的例子的,

不过,这些所谓“一般情况”,我目前能想到的有两种:

1.某两个城市之间不连通的:可以人为设置这两个城市之间的距离为一个巨大数,比如9e+307;

2.由A到B和由B到A距离不同时,放弃根据城市坐标计算“欧氏对称距离”的办法,直接读取事先录入好的二维距离矩阵,比如您提供的附件中的44*44的二维表格中的数据。

然后,哈哈,程序就可以通用了。

TA的精华主题

TA的得分主题

发表于 2020-3-24 21:01 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
aoe1981 发表于 2020-3-24 20:56
不过,这些所谓“一般情况”,我目前能想到的有两种:

1.某两个城市之间不连通的:可以人为设置这两个 ...

这我就不知道了,您老人家慢慢研究~~这个虽是打着旅行的TITLE,但在我看来,实际应用还真不在旅行上,因为我以前也总出差,实际应用中,旅行上用这个还真玩不转~~~

TA的精华主题

TA的得分主题

发表于 2020-3-24 22:12 | 显示全部楼层
想起个事,您的那数独的应该写成个手机上的小应用,有些公司拿数独当作面试题考那些会计或出纳的岗位的人,

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-3-25 07:49 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
FOB_FN_L 发表于 2020-3-24 22:12
想起个事,您的那数独的应该写成个手机上的小应用,有些公司拿数独当作面试题考那些会计或出纳的岗位的人,

我不懂那些语言,手机上类似应用很多啊,我都试玩了好几款。

TA的精华主题

TA的得分主题

发表于 2020-3-25 15:00 | 显示全部楼层
本帖最后由 aimisiyou 于 2020-3-25 15:08 编辑

tsp问题网上好像是说遗传算法最好吧,100以内的小规模我用lisp实现了,没有优化,运行10分钟以内。设置N_d=3000,得到pr76的较好解108155.6347。
111.png

TA的精华主题

TA的得分主题

发表于 2020-3-25 15:15 | 显示全部楼层
蚂蚁算法的鲁棒性很强,原理根据不同路径上的信息素变化,蚂蚁越来越趋向于走信息素高的边,这也容易导致陷入局部最优解。如果前期加快收敛,后期放缓收敛,更利于搜到全局最优路径。例如如果当次循环中最长路径高出最短路径10%,更新所有边的信息素就按经过改该条边上所有蚂蚁路径的倒数和(如某条边上有蚂蚁1和蚂蚁2经过,该边上的信息素更新=0.1*该边原来信息素+0.9*(1/L1+1/L2)。如果当次循环中最长路径比最短路径不超过10%,更新所有边的信息素就按经过该条边上所有蚂蚁路径的倒数和的平均值(如某条边上有蚂蚁1、蚂蚁2和蚂蚁3经过,该表边上的信息素更新=0.1*该边原来的信息素+0.9*((1/L1+1/L2+1/L3)/3),这样就实现前期加速收敛,后期放缓收敛,尽量减少陷入局部最值。
之前仅用单纯的蚁群算法算出的结果质量很差,就放弃了蚁群算法。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-3-25 21:28 | 显示全部楼层
aimisiyou 发表于 2020-3-25 15:00
tsp问题网上好像是说遗传算法最好吧,100以内的小规模我用lisp实现了,没有优化,运行10分钟以内。设置N_d= ...

我只能得到:108159.44,资料中给出的最优解是:108159,我和法师的结果一样:

pr76图1.PNG

开了阉割优化,不开的话,我的蚁群40只蚂蚁500代最好可以到108343左右。

pr76图2.PNG

这个图为了占满地方,没有设计成横轴与纵轴同单位刻度的,看起来上下方向拉伸了。

pr76法师.PNG


这是法师的,和我的结果一样。


结果是(城市序号):

46        45        44        48        47        69        68        70        67        50        49        51        66        65        71        72        73        64        63        62        61        41        60        59        58        57        56        55        52        53        54        42        43        28        27        26        20        19        31        30        29        32        33        35        34        40        39        38        36        37        18        17        16        15        74        14        13        12        11        10        9        8        7        6        5        4        3        2        75        76        1        23        22        21        25        24



数据源:

http://elib.zib.de/pub/mp-testdata/tsp/tsplib/tsp/pr76.tsp


兄台厉害啊。

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-3-25 21:33 | 显示全部楼层
aimisiyou 发表于 2020-3-25 15:00
tsp问题网上好像是说遗传算法最好吧,100以内的小规模我用lisp实现了,没有优化,运行10分钟以内。设置N_d= ...

其实我做的交换优化算法可以应用于遗传算法的“变异”演化的,这样变异出来的都是优良个体,但是我一直没想好:如何让“交叉”出来的个体一定或大概率超过其父代的基因?


遗传算法的关键之处我以为是:如何根据父代基因交叉生成优异的下代基因,只有实现一代更比一代强,才会让算法收敛,防止退化或原地打转。


所以,目前没有动手去写。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-28 14:42 , Processed in 0.051107 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表