Java 曼哈顿启发式A*算法

Java 曼哈顿启发式A*算法,java,algorithm,Java,Algorithm,我正在二维数组中实现NXN puzzel(使用Java) 我的问题是: (一) 如何计算二维数组中的曼哈顿距离 (二) 如何在二维数组中生成节点(当前节点)的后续节点(邻居) 我在互联网上看到了很多例子,它们是如何在一维数组中实现的,但现在我需要它们在二维数组中 编辑 在Java中如何向上、向下、向左或向右移动平铺?我必须检查哪些东西?需要一些关于如何通过在二维数组中向上、向下、向左或向右移动来生成后续对象的说明 结果是| x2-x1 |+| y2-y1| 一个节点的继承者由游戏中当前节点的所有

我正在二维数组中实现NXN puzzel(使用Java)

我的问题是:

(一) 如何计算二维数组中的曼哈顿距离

(二) 如何在二维数组中生成节点(当前节点)的后续节点(邻居)

我在互联网上看到了很多例子,它们是如何在一维数组中实现的,但现在我需要它们在二维数组中

编辑 在Java中如何向上、向下、向左或向右移动平铺?我必须检查哪些东西?需要一些关于如何通过在二维数组中向上、向下、向左或向右移动来生成后续对象的说明

  • 结果是| x2-x1 |+| y2-y1|
  • 一个节点的继承者由游戏中当前节点的所有合法移动生成。如何做到这一点取决于游戏规则,而不仅仅是在2D板上玩的游戏
  • 编辑

    以下是生成二维阵列上相邻点列表的一种方法:

    ArrayList<Point> adjacentPoints(Point point) {
        // W and H are class fields indicating width/height of 2D array
        ArrayList<Point> points = new ArrayList<Point>();
        if (point.x > 0) {
            points.add(new Point(point.x - 1, point.y);
        }
        if (point.y > 0) {
            points.add(new Point(point.x - 1, point.y);
        }
        if (point.x < W - 1) {
            points.add(new Point(point.x + 1, point.y);
        }
        if (point.y < H - 1) {
            points.add(new Point(point.x, point.y + 1);
        }
        return points;
    }
    
    ArrayList邻接点(点){
    //W和H是表示二维数组宽度/高度的类字段
    ArrayList points=新的ArrayList();
    如果(点x>0){
    添加点(新点(点x-1,点y);
    }
    如果(点y>0){
    添加点(新点(点x-1,点y);
    }
    如果(点x
    当然,这在效率方面是可以改进的,但它确实起到了作用

  • 结果是| x2-x1 |+| y2-y1|
  • 一个节点的后续节点是由您的游戏从当前节点的所有合法移动生成的。这取决于游戏规则,而不仅仅是在2D棋盘上玩的游戏
  • 编辑

    以下是生成二维阵列上相邻点列表的一种方法:

    ArrayList<Point> adjacentPoints(Point point) {
        // W and H are class fields indicating width/height of 2D array
        ArrayList<Point> points = new ArrayList<Point>();
        if (point.x > 0) {
            points.add(new Point(point.x - 1, point.y);
        }
        if (point.y > 0) {
            points.add(new Point(point.x - 1, point.y);
        }
        if (point.x < W - 1) {
            points.add(new Point(point.x + 1, point.y);
        }
        if (point.y < H - 1) {
            points.add(new Point(point.x, point.y + 1);
        }
        return points;
    }
    
    ArrayList邻接点(点){
    //W和H是表示二维数组宽度/高度的类字段
    ArrayList points=新的ArrayList();
    如果(点x>0){
    添加点(新点(点x-1,点y);
    }
    如果(点y>0){
    添加点(新点(点x-1,点y);
    }
    如果(点x
    当然,这在效率方面是可以改进的,但它确实起到了作用

  • 从点(a,b)到(c,d)的距离=数学abs(a-c)+数学abs(b-d)

  • 看看一种叫做“洪水填充”的东西。它基本上是这样的:

    public void floodfill(x,y, distanceSoFar)
    {
        if (x is out of bounds || y is out of bounds)
            return
        if ((x,y) == destination))
        {
            distance = distanceSoFar;
            return;
        }
    
        floodfill(x+1,y,distanceSoFar + 1);
        floodfill(x-1,y,distanceSoFar + 1);
        floodfill(x,y+1,distanceSoFar + 1);
        floodfill(x,y-1,distanceSoFar + 1);
    }
    
  • 然后调用
    floodfill(x,y,0)
    其中x和y是起点。到目的地的距离将存储在全局可变距离中。(没有真正使用*虽然…)

  • 从点(a,b)到(c,d)的距离=数学abs(a-c)+数学abs(b-d)

  • 看看一种叫做“洪水填充”的东西。它基本上是这样的:

    public void floodfill(x,y, distanceSoFar)
    {
        if (x is out of bounds || y is out of bounds)
            return
        if ((x,y) == destination))
        {
            distance = distanceSoFar;
            return;
        }
    
        floodfill(x+1,y,distanceSoFar + 1);
        floodfill(x-1,y,distanceSoFar + 1);
        floodfill(x,y+1,distanceSoFar + 1);
        floodfill(x,y-1,distanceSoFar + 1);
    }
    

  • 然后调用
    floodfill(x,y,0)
    其中x和y是您的起点。到您的目的地的距离将存储在全局变量距离中。(没有真正使用*虽然…

    我必须根据f=g+h生成后续。g=从起始节点到当前节点的距离,h=曼哈顿hereustic(1步成本)@EddyFreeman-生成继任者与启发式搜索无关。公式
    f=g+h
    用于选择下一步要探索的继任者。如果您可以从数组中的任意点移动到任意4个相邻点(左、右、上、下;无对角移动),然后每一个都试一下,去掉那些有越界坐标的。很好的Ted。这就是我要找的。我认为我的问题没有很好地表述。我如何通过移动到四个相邻的点在Java中实现它。你能帮我解释一下吗?或者告诉我任何我能获得更多信息的来源。thanks@EddyFreeman-很乐意帮忙。请注意,如果规则允许围绕电路板进行包装(从右边缘向右移动会将您带到左边缘),则逻辑将被更改为使用模运算,而不是使用
    if
    测试。这样,您将始终有4个后续节点。我必须根据f=g+h生成后续节点。g=从开始节点到当前节点的距离,h=h(1步成本)@EddyFreeman-生成继任者与启发式搜索无关。公式
    f=g+h
    用于选择下一步要探索的继任者。如果您可以从数组中的任意点移动到任意4个相邻点(左、右、上、下;无对角移动),然后每一个都试一下,去掉那些有越界坐标的。很好的Ted。这就是我要找的。我认为我的问题没有很好地表述。我如何通过移动到四个相邻的点在Java中实现它。你能帮我解释一下吗?或者告诉我任何我能获得更多信息的来源。thanks@EddyFreeman-很乐意帮忙。请注意,如果规则允许围绕电路板进行包装(从右边缘向右移动会将您带到左边缘),然后逻辑将被更改为使用模运算,而不是使用
    if
    测试。这样,您将始终有4个后续节点。哎呀,我不知道为什么代码格式会出错…我是新的抱歉。没问题。我真的想用A*来解决它。哎呀,我不知道为什么代码格式会出错…我是新的抱歉。没问题。我是真的我想用A*来解决这个问题。