ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 关于线路最短的解法

[复制链接]

TA的精华主题

TA的得分主题

发表于 2011-10-23 05:26 | 显示全部楼层
灰袍法师 发表于 2011-10-22 15:38
是可以转化为TSP
不过你看上面的示意图,也没什么特别蠢的走线,应该用什么方法都优化不了多少了。。。楼 ...

法师说的是。 受教了

TA的精华主题

TA的得分主题

发表于 2011-10-23 10:40 | 显示全部楼层
还是法师大牛。评估一下我想的一个类似的做法有没有可能取得好的结果。
想法也是用贪婪算法,只是因为单纯算法本身是一种短视行为,所以我打算每步贪婪的时候预贪婪几步(比如说3步),就像棋类算法那样。从起点开始,按贪婪算法,求出距离较短的前三个点,再次按这三个点的结果计算下一步的三个点,再……,最后比较后选择 这三个点中  后继  3步  空走距离和 最小的那个点作为下一个点,如此往复……

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-10-23 12:56 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2011-10-23 15:44 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 灰袍法师 于 2011-10-23 18:16 编辑
Moneky 发表于 2011-10-23 10:40
还是法师大牛。评估一下我想的一个类似的做法有没有可能取得好的结果。
想法也是用贪婪算法,只是因为单纯 ...

这个想法当然可以,而且应该会比只看一步要快
n条线段贪婪法
最简单的贪婪方式,只看一步只取最短的话,搜索空间是 1,只在一种可能性里面找
我和楼主的带点随机的贪婪方式,只看一步只取前m个短线的话,搜索空间是 m^n
你的想法,搜索空间应该是 9^(n/3)
所以你的搜索空间会少很多,速度应该会快得多
你这个算法有“分治”的思想在里面了,分成3个动作的小块去做。

目前最困扰我的是:究竟还能好多少?
楼主和你的程序测试上千万次,我自己也测试了上亿次(花了2000秒)
貌似最终结果也没有好多少
要么是因为好的结果本身就极其稀少,随机数十亿次也绝对找不到一个。
要么是因为根本不存在比现在结果好10%以上的解(我比较相信这一点)
对付TSP问题,目前最好的算法应该是蚁群算法,不过这个东东的参数调试起来就跟遗传算法一样,麻烦。

TA的精华主题

TA的得分主题

发表于 2011-10-23 20:11 | 显示全部楼层
本帖最后由 Moneky 于 2011-10-23 21:05 编辑

NC文件查看器源代码及更新

现在可以拖动文件到查看器界面来打开了,不需要通过打开文件对话框。另外工具支持命令行了,可以在VBA中调用工具来打开指定文件,命令行只有一个参数,就是需要打开的NC文件带路径全名。

究竟还能好多少?真难想象,不过现在明白世界为何需要超级计算机了{:soso_e100:}

有时间了我也把上面的那个想法变成现实,看看结果到底如何。

NC-Viewer.rar

14.5 KB, 下载次数: 36

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-10-24 23:37 | 显示全部楼层
这个贴的最大意义   使我学会了一些算法,  也使我真正体会到VB处理数组的速度的快捷

同时重复使用到的数据必须先将结果算出后,再进行调用,对运算速度提高的极大帮助!

再次对各位参与者表示感谢!

TA的精华主题

TA的得分主题

发表于 2011-10-26 00:00 | 显示全部楼层
闲着无聊之下,把这个问题转化为旅行商问题,用Lingo去求解
1 用VBA代码转数据格式为 Lingo求解模型要用到的距离矩阵, 连接状态矩阵,强迫连接的矩阵
2 写一个好。。复。。杂。。的Lingo求解模型,主要是把每个 X-Y 坐标当作一个城市节点,这样每个动作等于两个城市
要求每个城市出入一次,要求城市之间的连接必须符合 强迫连接矩阵的约束,也就是同一个动作的两个城市必须连接

3 OLE方式调用Lingo求解
4 求解结果是一个遍历城市的顺序表,用VBA把这个顺序表翻译回 雕刻动作的数据表示,这样就可以用 ViewData 去看结果了

果然不出我之所料,两点都料中了
1 Lingo可以找到比 随机+贪婪 算法更好的解,但是只能好一丁点,不到3%。
2 Lingo的求解时间非常长,在10秒到几百秒不等,对于动作很多的求解,是得不偿失。

结论:解决优化问题,自己写VBA其实比Lingo更好。
附件包括
可以独立运行的 .xls,直接用 VBA 调用 Lingo ,但这个方法在求解时间很长的时候,会导致OLE等待超时,求解结果无法自动写回EXCEL工作表
更好的做法是:打开 .xls,然后用 Lingo 打开 .lg4 文件,这样就可以无限时地求解,而且还不会导致EXCEL繁忙
Lingo求解带限制连接的TSP问题.rar (122.71 KB, 下载次数: 56)

测试的nc格式文件,查看nc文件的 viewdata程序在之前回帖下载,不再打包在一起了。

TA的精华主题

TA的得分主题

发表于 2018-12-5 01:15 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-15 01:57 , Processed in 0.036731 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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