我正在寻找要在我制作的赛车游戏中使用的算法。地图/级别/航迹是随机生成的,因此我需要找到两个位置,即开始位置和目标位置,以充分利用大部分地图。
关于距离的计算,由于缺少更好的词,它不应该是“鸟路”。如果A和B之间存在壁(或其他阻挡区域),则它们之间的路径应更长。
不确定从哪里开始,非常欢迎提出评论,建议的解决方案是伪代码的首选。
编辑: 对。浏览完gs的代码后,)我又给了它一个镜头。这次我不是用python,而是用C ++编写的。但是,即使在阅读了Dijkstras算法,floodfill和Hosam Alys解决方案之后,我也没有发现任何关键的差异。我的代码仍然可以运行,但运行速度不如您看起来快。完整信息来自于粘贴。唯一有趣的行(我想)是第78-118行的Dijkstra变体本身。
但是速度不是这里的主要问题。如果有人足够友善地指出算法上的差异,我将非常感谢您的帮助。
假设地图是矩形,则可以在所有边界点上循环,然后开始填充以查找距起点最远的点:
bestSolution = { start: (0,0), end: (0,0), distance: 0 }; for each point p on the border flood-fill all points in the map to find the most distant point if newDistance > bestSolution.distance bestSolution = { p, distantP, newDistance } end if end loop
我想这会在O(n^2)。如果我没有记错的话,它是(L+W) * 2 * (L*W) * 4,其中地图L的长度和W宽度是,(L+W) * 2代表周界上边界点(L*W)的数量,是点的数量,并且4是洪水填充将最大访问点的假设4次(从所有方向)。由于n等于点数,因此等于(L + W) * 8 * n,应优于O(n2)。(如果地图为正方形,则顺序为O(16n1.5)。)
O(n^2)
(L+W) * 2 * (L*W) * 4
L
W
(L+W) * 2
(L*W)
4
n
(L + W) * 8 * n
O(n
)
O(16n
更新: 根据评论,由于地图更像是一个迷宫(比起我最初想的那样,没有一个简单的障碍),您可以在上面做同样的逻辑,但是要检查地图中的所有点(而不是地图上的点)仅边框)。这应该是O(4n2的量级,)仍然比FW和Dijkstra的都好。
O(4n
注意: 因为所有顶点仅通过4个边界直接连接,所以洪水填充更适合此问题。地图的广度优先遍历可以相对快速(仅O(n))产生结果。我假设可以从洪水填充中的每个4个邻居中检查每个点,因此上述公式中的系数。
O(n)
PS任何意见或更正,欢迎。