如何使用 A* 算法找到最 “自然” 的直接路径?

我已经在 AS3 中实现了 A* 算法,并且它运行良好,但有一件事例外。通常,生成的路径不是到达目标最“自然”或平滑的路线。在我的环境中,对象可以像水平或垂直移动一样,以相同的代价对角移动。这是一个非常简单的例子;起点用 S 标记,终点用 F 标记。

 | | | | | | | | | |
 |S| | | | | | | | |
x| | | | | | | | | |
x| | | | | | | | | |
x| | | | | | | | | |
x| | | | | | | | | |
x| | | | | | | | | |
 |F| | | | | | | | |
 | | | | | | | | | |
 | | | | | | | | | |

如你所见,在第一轮查找中,节点 [0,2]、[1,2]、[2,2] 都将被添加到可能的节点列表中,因为它们都具有 N 的分数。我遇到的问题出现在下一步,当我尝试决定接下来要处理哪个节点时。在上面的示例中,我使用 possibleNodes[0] 来选择下一个节点。如果我将其更改为 possibleNodes[possibleNodes.length-1],我会得到以下路径。

 | | | | | | | | | |
 |S| | | | | | | | |
 | |x| | | | | | | |
 | | |x| | | | | | |
 | | | |x| | | | | |
 | | |x| | | | | | |
 | |x| | | | | | | |
 |F| | | | | | | | |
 | | | | | | | | | |
 | | | | | | | | | |

然后用 possibleNextNodes[Math.round(possibleNextNodes.length / 2)-1]

 | | | | | | | | | |
 |S| | | | | | | | |
 |x| | | | | | | | |
x| | | | | | | | | |
x| | | | | | | | | |
x| | | | | | | | | |
x| | | | | | | | | |
 |F| | | | | | | | |
 | | | | | | | | | |
 | | | | | | | | | |

所有这些路径都具有相同的成本,因为它们都包含相同数量的步骤,但是,在这种情况下,最合理的路径如下…

 | | | | | | | | | |
 |S| | | | | | | | |
 |x| | | | | | | | |
 |x| | | | | | | | |
 |x| | | | | | | | |
 |x| | | | | | | | |
 |x| | | | | | | | |
 |F| | | | | | | | |
 | | | | | | | | | |
 | | | | | | | | | |

有没有一种正式认可的方法可以使路径看起来更合理,而不仅仅是数学上正确?


回答:

你需要为你的启发式函数添加一个决胜器。这里的问题是有很多路径具有相同的成本。

对于一个简单的、倾向于直线的决胜器,你可以使用叉积。也就是说,如果 S 是起点,E 是终点,X 是算法中的当前位置,你可以计算 S-E 和 X-E 的叉积,并对启发式函数添加一个惩罚,惩罚的大小取决于它偏离 0(= 直线)的程度。

用代码表示:

 dx1 = current.x - goal.x
 dy1 = current.y - goal.y
 dx2 = start.x - goal.x
 dy2 = start.y - goal.y
 cross = abs(dx1*dy2 - dx2*dy1)
 heuristic += cross*0.001

另请参阅 http://theory.stanford.edu/~amitp/GameProgramming/Heuristics.html#S12,这是一个关于 A* 的优秀教程。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注