找回密码
 欢迎注册
楼主: ssikkiss

[求助] 关于寻径算法

[复制链接]
发表于 2010-1-6 22:10:15 | 显示全部楼层
没写过论文,那张表也不知道是谁帮我画的,比原来好看多了。

9#的做法有个地方需要修正一下:

在查询的时候才合并标记是来不及的,如下图所示:

wa3.PNG

即使合并了,s和t的颜色还是不一样,于是错误地回答“无路”了。

所以合并标记的工作必须在前期完成:

wa4.PNG

这样查询的时候就保证不会有某个点两边的标记不一样的情况了。

于是前期工作包括:

把m个障碍排序、环绕障碍并标记、把标记排序、合并标记。

这些操作的时间复杂度均为O(m*log(m)),所以前期花费仍然是O(m*log(m))的。

另外,想到一个比较好玩的东西:

1个障碍似乎可以写成4个箭头。

多个障碍可以表示成多箭头相加。

当正反向箭头重合的时候,两个箭头就互相抵消了。

如下图所示:

wa5.PNG

而加法满足交换律,所以前期就用不着把障碍排序了,直接把箭头相加就可以了。

计算结果就是我想要的环路,从而省去了把m个障碍排序的工作。

但箭头还是要排序的,所以前期工作的时间复杂度并没有变化。

想到这里,发现4楼的障碍遍历法我忽略了一道重要的工序:

必须先把障碍排序!

这样才可以从一个障碍出发然后往相邻的障碍走。

不然的话寸步难行。

例如:我站在障碍(5,8),怎么知道(4,7)、(4,8)、(4,9)等地是不是障碍?

不排序的话,我得在整个障碍列表中检查一遍有没有(4,7)、(4,8)、(4,9)这些障碍。

排序了就可以二分查找了。

所以性能指标需要修正。

现修正如下:

性能指标预编译法障碍遍历法环绕障碍法
前期花费时间O(n^2)O(m*log(m))O(m*log(m))
前期花费空间O(n^2)O(m)O(m)
查询花费时间O(1)O(m*log(m))O(log(m))
查询花费空间O(1)O(m)O(1)
地图修改维护时间O(n^2)O(m*log(m))O(log(m))
地图修改维护空间O(n^2)O(m)O(m)


因为我一直以来都只用预编译法,后面的方法是看了此贴之后临时想出来的,还没有实现过。

所以难免会有疏漏之处。请大家原谅。

如果还有疏忽之处,请指正。

谢谢各位的热心帮助。

###############################

这是我的第100张贴子,做个记号,留作纪念。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-1-6 23:39:14 | 显示全部楼层
呵呵,那个Smiley很吸引眼球~~
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-1-12 23:19:03 | 显示全部楼层
谢谢以上各位帮忙!因为我的地图比较小,障碍较多,而且是实时变化的,我还是选了A*。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-1-21 11:50:46 | 显示全部楼层
4楼的方法适合动态的障碍,而5楼的方法,对于静态的障碍,只需要建立一个2维数组,初始化一次就行了。都非常好
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-1-22 14:11:51 | 显示全部楼层
呵呵,不懂,顶下。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-2-4 19:10:52 | 显示全部楼层
很好的题目
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-4-27 21:41 , Processed in 0.045029 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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