QQ超市最佳路径寻路算法改进尝试2
昨天一直在琢磨,看怎样能缩短时间。
函数、方法、判断什么的都没办法改进了。那就只有改善算法了。
后来总算想到一个还算可行的办法。
当如上图的情况下,很明显往后再怎么寻路,都不可能到达终点。
加个判断直接把此节点false掉岂不是能节省大部分的无用递归?
那如何判断呢?当point(2,5)遍历寻找四周可用节点进行递归之前,
先调用A*寻路看所有可用节点能否到达终点即可。无法到达则放弃。
此图里面,point(2,5)是被放弃的,后面省去的递归数至少好几千。
而如果每次递归之前调用A*的话,总时间是会翻好几番的。到底A*花的时间多,
还是省去的递归时间多,那就只能实际测试一下才知道了。
于是花了大量时间把A*独立出来,修改传入2个参数 a:要测试的可用节点,b:目前位置的路径(A*里面的作用就是障碍)。
搞定后用经典的1店4口进行测试,测试结果如下!
改善前 | 改善后 |
总路径数:95306 | 总路径数:95306 |
最大路径数:12 | 最大路径数:12 |
最大面数:52 | 最大面数:52 |
耗时:25秒 | 耗时:115秒 |
总递归数:3990114 | 总递归数:953791 |
递归数如预期般的大幅减少至测试前的25%!
可耗时涨了4倍多……经过测试,A*一共花了78秒……太悲哀了……
后来把A*改为深度优先,也没什么太大改善。
这次改善宣布失败><...