【发布时间】:2015-12-21 20:09:53
【问题描述】:
我需要解决以下问题: 我有一个网格,你可以在其中向 8 个方向移动,N、S、E、W、NE、NW、SE、SW。
正交移动的成本始终为 1。如果先前的移动是正交的,或者如果先前的移动是对角的并且成本为 2,则对角移动的成本为 1,否则成本为 2。
所以举几个例子来更好地解释:
移动 NE,NE 将花费 1+2 = 3
移动 NE,E,NE 将花费 1+1+1 = 3
- 移动 NE,NE,NE 将花费 1+2+1 = 4
我认为这足以了解它的要点。
我不知道如何实现可以实现此目的的 A* 算法。我的启发式函数:
private double heuresticDistance(Node p1, Node p2){
double dx = Math.abs(p1.x - p2.x);
double dy = Math.abs(p1.y - p2.y);
// D = 1d, D2 = 1.5d;
return D * (dx + dy) + (D2 - 2 * D) * Math.min(dx, dy);
}
显然,在这种情况下它并不好,并且在某些情况下它不会走最短路径(成本方面),这意味着它可能会采用不同的方式来降低成本。
如果有多个,它总是会找到最便宜的或最便宜的一个,这一点非常重要。
你能给我一些提示吗?我的 A* 实现非常简单,我想我是根据 wikipedia 伪代码编写的。
编辑:
public class Node{
public int x,y;
}
【问题讨论】:
-
Node的定义是什么? -
这不是家庭作业。我正在编写一个游戏,这是我需要实现的,以便它正常工作。 @David 节点只包含 x 和 y 坐标。
-
网格有障碍物吗?
-
确实如此。但是我想要找到的路径将始终存在,因为它之前已检查过(使用递归函数,该函数知道要花费的剩余移动点以及它是否来自对角线移动以及先前移动的成本是多少)。每个节点有 8 个邻居,除非有障碍物。我有关于采用哪个网格单元的信息以及使用该信息生成节点邻居的函数(它创建 8 个邻居并删除被阻止的那些)
标签: algorithm path-finding a-star