Algorithm 改进的a星寻路启发式设计

Algorithm 改进的a星寻路启发式设计,algorithm,path-finding,a-star,Algorithm,Path Finding,A Star,首先,, 理想路径是(按重要性顺序): 我的启发(f)是: 这是一辆四轮马车,因为它喜欢朝着目标转向的路径,然后蜿蜒返回 第二,, 理想的道路是: 1. shortest 2. approaches the destination from the same y coordinate (if of equal length) 我的灵感没有变。在达到目标后,我在最后检查了第二个标准。该启发式算法的效率稍低(用于解决转向问题),这也导致始终搜索必要的相邻坐标 第三,, 理想路径: 1. short

首先,, 理想路径是(按重要性顺序):

我的启发(f)是:

这是一辆四轮马车,因为它喜欢朝着目标转向的路径,然后蜿蜒返回

第二,, 理想的道路是:

1. shortest
2. approaches the destination from the same y coordinate (if of equal length)
我的灵感没有变。在达到目标后,我在最后检查了第二个标准。该启发式算法的效率稍低(用于解决转向问题),这也导致始终搜索必要的相邻坐标

第三,, 理想路径:

1. shortest
2. approaches the destination from the same y coordinate (if of equal length)
3. takes the least number of turns
现在我试着做启发式(f):

这当然适用于标准1和标准3,并从本质上解决了转向问题。不幸的是,它现在的效率如此之高,以至于最后对标准#2的测试不起作用,因为所探索的节点集不够大,无法重建最佳解决方案

有人能告诉我如何将标准#2融入启发式(f)中,或者如何解决这个问题吗


标准2示例:如果目标为(4,6),且到(3,6)和(4,5)的路径长度相同,则理想解应通过(3,6),因为它从Y平面接近,而不是从X平面接近(4,5)。但是,如果长度不相同,那么不管最短路径在哪个平面上接近,都必须选择最短路径。

您似乎混淆了A*启发式,即所谓的h,以及部分路径成本g。这些因素共同构成了优先级f=g+h

启发式应该是对从当前点达到目标的成本的乐观估计。曼哈顿距离适用于h,前提是台阶向上、向下、向左和向右移动,并且至少需要单位成本

然而,你的标准2应该是路径成本g,而不是h。我不确定你所说的“从同一y坐标接近目的地”到底是什么意思,但你可以通过给所有其他方法一个无限或非常高的路径代价来禁止/惩罚进入目标节点。严格来说,没有必要修改启发式h


到目前为止的匝数也应计入部分路径成本g。如果你能便宜地计算出这样一个数字,你可能想在h中加入一个(乐观的)估计,估计还剩多少转弯。你似乎把a*启发式,也就是所谓的h,与部分路径成本g混淆了。这些因素共同构成了优先级f=g+h

启发式应该是对从当前点达到目标的成本的乐观估计。曼哈顿距离适用于h,前提是台阶向上、向下、向左和向右移动,并且至少需要单位成本

然而,你的标准2应该是路径成本g,而不是h。我不确定你所说的“从同一y坐标接近目的地”到底是什么意思,但你可以通过给所有其他方法一个无限或非常高的路径代价来禁止/惩罚进入目标节点。严格来说,没有必要修改启发式h


到目前为止的匝数也应计入部分路径成本g。如果你能便宜地计算出这样一个数字,你可能想在h中加入一个(乐观的)估计,估计还剩多少圈。

用一点技巧回答我自己的问题。如果你知道更好的解决方法,你仍然对其他答案、想法、评论感兴趣

Hacked manhattan距离是向Y平面中最近的正方形计算的,而不是向目的地本身计算的:

dy = min(absolute_value(dy), absolute_value(dy-1));
然后在构造启发式(f)时:

h=hacked_manhattan_distance();
if(h<2)
//我们离目标很近
//切换回真实距离
h=真实的曼哈顿距离();

回答我自己的问题时有点粗鲁。如果你知道更好的解决方法,你仍然对其他答案、想法、评论感兴趣

Hacked manhattan距离是向Y平面中最近的正方形计算的,而不是向目的地本身计算的:

dy = min(absolute_value(dy), absolute_value(dy-1));
然后在构造启发式(f)时:

h=hacked_manhattan_distance();
if(h<2)
//我们离目标很近
//切换回真实距离
h=真实的曼哈顿距离();

澄清一下:我所说的启发式算法是用来对节点进行排序的,以决定先检查哪个节点。我对a-star的技术不太了解,这是一个定制的实现。你所说的“圈数”是指目前为止在部分路径中的圈数吗,或者估计还需要的圈数?圈数=部分路径中的圈数问题是我的算法有太多的特殊情况等,它实际上是一个非常复杂的a-star版本,试图提高效率,当我必须添加新的东西时,一些特殊情况被打破。澄清一下:启发式我说的是用来对节点进行排序的,用来决定先检查哪个节点。我对a-star的技术不太了解,这是一个定制的实现。你所说的“圈数”是指目前为止在部分路径中的圈数吗,或者估计还需要的圈数?圈数=部分路径的圈数问题是我的算法有太多的特殊情况等,它实际上是一个非常复杂的a-star版本,试图提高效率,当我必须添加新的东西时,一些特殊情况被打破了。我真的不认为我用的字母应该很重要。我一直直接使用f作为“启发式”,用于对节点进行排序。我可以修改g或h,但结果是一样的,因为f由这两个变量组成。它们很重要,因为它们表示完全不同的变量,这两个变量都必须满足A*算法正确的约束条件。如果你开始混合路径成本和启发式,就很难对算法的保证和性能进行推理或交流
manhattan distance (h) + path length (g) * number of turns (t)
dy = min(absolute_value(dy), absolute_value(dy-1));
h = hacked_manhattan_distance();
if (h < 2)
   // we are beside close to the goal
   // switch back to real distance
    h = real_manhattan_distance();