C# 寻找无边贴图的路径算法
我有2D世界地图,基本上是墨卡托式的投影(如果你向西走足够长的时间,你就会在你开始的地方以东结束) 我的问题是:你能用*来计算这些类型地图上的路径吗 我想不出有什么原因不能(我想你可以简单地表示边缘贴图节点,这样北、南、东、西,“边界”节点就可以简单地连接到另一侧)C# 寻找无边贴图的路径算法,c#,c++,algorithm,C#,C++,Algorithm,我有2D世界地图,基本上是墨卡托式的投影(如果你向西走足够长的时间,你就会在你开始的地方以东结束) 我的问题是:你能用*来计算这些类型地图上的路径吗 我想不出有什么原因不能(我想你可以简单地表示边缘贴图节点,这样北、南、东、西,“边界”节点就可以简单地连接到另一侧) 提前谢谢,如果有人以前看过类似的东西,或者能给我一些提示,我将不胜感激 我无法想象为什么墨卡托式投影会给a*带来问题,只要启发式函数正确逼近距离。我认为下面的功能应该可以正常工作 float heuristic(point from
提前谢谢,如果有人以前看过类似的东西,或者能给我一些提示,我将不胜感激 我无法想象为什么墨卡托式投影会给a*带来问题,只要启发式函数正确逼近距离。我认为下面的功能应该可以正常工作
float heuristic(point from, point to, size mapsize) {
float x = from.x - to.x;
if (abs(x) > mapsize.x/2)
x = mapsize.x - x;
float y = from.y - to.y;
if (abs(y) > mapsize.y/2)
y = mapsize.y - y;
return sqrt(x*x+y*y);
}
寻路算法并不真正关心地图的全局拓扑。唯一棘手的部分是为a*获得一个好的估计值,但是如果你的地图确实是三维空间中的一个曲面,并且步长成本是步长,那么使用三维距离应该是可以的
你的地图可能有各种奇怪的“连接”(包括例如打结的桥梁),如果你正确地实现了*,这将不会是一个问题。编辑::我知道我被边缘这个词的非图论用法误导了(问题标题强烈建议了一个图形算法问题:) 为什么你认为没有边缘?您可以对许多逻辑离散位置进行建模,并且它们之间的连接有限(例如,墙不在其中:)。好了,你有你的优势 您可能的意思是,您不想在数据中表示边(您不必这样做,但仍然存在连接位置/点的逻辑边) 也就是说: 你会问是否有人见过这样的事情。我隐约记得在Knuths
Dancing Links
article(DLX)中看到了与此相关的东西,这是一种A*算法的实现技术
尽管非常奇怪和不规则的远程传送点可能会使创建一个好的路径变得更加困难,但启发式(因此,保持较低的搜索空间)会变得更加困难,尤其是当快捷方式可以动态更改时。@delnan:True。这就是为什么我说“如果你的地图是3d空间中的一个曲面,你的步长成本是步长”。显然,如果你有一个“传送”,那么步长成本就不是步长。@6502谢谢你的回答,我将采用a*实现。请先测试它,我不是100%相信它。我认为应该在if语句块中使用
x=mapsize.x-x
和y=mapsize.y-y
。不,我的意思是它完全错误。如果出于论证的考虑,mapsize.x
为1.0,x
-差为0.6,并且如果from
点正好位于x边上,那么基本上你应该能够以0.6的一种方式到达它,以0.4的另一种方式到达它。(换句话说,两条路径最终都会增加地图的大小。)因此,您应该使用整个mapsize
值,而不是它的一半。另外,给定相同的参数,mapsize.x/2
等于0.5,0.5-0.6等于-0.1,这很奇怪。是的,由于平方运算,负数将在距离公式中起作用,但绝对值本身是完全错误的。@PlatinumAzure那么你是说启发式可以超过实际距离吗?也许你也应该问一下:我很确定舞蹈链接是AlgorithmX解决精确覆盖问题的一种实现技术,你确定它也能做到吗?我记得它们是1和同样的东西。现在我可能完全偏离了轨道,但那是一段真实的记忆。基本上:不,我不确定。只是希望OP能够识别出一个潜在的匹配。如果有人能指出我的错配或任何重大错误,我很乐意删除答案。改写了我的舞蹈链接介绍,提高了期望值:)@sehe对此表示抱歉!以后我会尽量更加小心我的问题措辞。