【问题标题】:A star algorithm, unusual behaviour明星算法,异常行为
【发布时间】:2012-11-21 00:21:53
【问题描述】:

我正在为大学计算机游戏项目编写明星算法。老实说,我担心一旦我提到大学,我就会有任何响应者向西走,我也承认我用来处理的二维节点数组的大小非常大,宽度 = 800 &高度 = 800 我已经设法得到它的最佳部分工作。但是我遇到了一个有趣的错误

if (!diagonalMovementAllowed) {
                            if ((x != 0) && (y != 0)) {
                                continue;
                            }
                        }

没有下面的代码,我可以从任何坐标找到目标,只要它在二维数组的范围内,但是如果我使用上面的代码,算法似乎无法达到目标,例如,如果起点或目标距离相当大,则

如果目标 x = 700 & y = 700 如果 start x = 0 & y = 700,没问题

但是,如果目标 x = 700 & 目标 y = 700 如果开始 x = 690 & y = 720 好像找不到路径

我的问题是 数组列表(打开或关闭列表)能否达到一个点,它根本找不到目标,并且已经达到了一个非常高的大小以至于它只是退出并且有没有办法识别导致这种情况的原因,而无需遍历每个 x 和 y 坐标使用调试器?

我确实觉得这是一个相当模糊的问题,但我希望我能得到一个笼统的答案,因为我觉得没有多少人会太倾向于引导我完成整个解释,尤其是因为我确实提到了这是一个项目,我的讲师似乎什么都知道。我希望我能得到一些建议和答案,并提前致谢。

编辑: 回答以下 2 个问题(感谢您的快速回复)

for(int x = -1; x < 2; x++){
     for(int y = -1; y < 2; y++){


    if (!diagonalMovementAllowed) {
          if ((x != 0) && (y != 0)) {
              continue;
          }
        }
int neighborX = x + current.x;
int neighborY = y + current.y;
      }
    }

上面的代码是其中的一部分,我显然不想全部发布,因为我的讲师可能会因为获得太多帮助而开枪(或失败) 但是要解释一下上面是做什么的

当 openList 不为空时,循环遍历 x 和 y 的邻居 x = x -1 或 x = x +1 y = y -1 或 y = y +1

0,0 0,1 0,2 1,0 1,1 1,2 2,0 2,1 2,2 如果您在 1,1(开始)并且如果您不希望对角线移动,那么应该允许以下 (0,0) (2,0) (2,2) 或 (0,2) 这是通过阻止 x 和 y 不等于 0 例如

neighborX = x + current.x
  1       = 0 + 1
 neighborY = y + current.y
   2         1 + 1
(1,2)

neighborX = x + current.x
  1       = 0 + 1
 neighborY = y + current.y
  0        -1 + 1
(1,0)

neighborX = x + current.x
  2       = 1 + 1
 neighborY = y + current.y
  0        -1 + 1
(2,0)

neighborX = x + current.x
  0       = -1 + 1
 neighborY = y + current.y
  0        -1 + 1
(0,0)

【问题讨论】:

    标签: java algorithm a-star


    【解决方案1】:

    我假设您的代码 sn-p 是后继生成逻辑的一部分。不幸的是,我认为逻辑不正确:

    if (!diagonalMovementAllowed) {
        if ((x != 0) && (y != 0)) {
            continue;
        }
    }
    

    当不允许对角线移动时,这将防止从内部位置(不在 x==0 列或 y==0 行中的位置)生成任何后继。

    如果我对您的代码的假设是正确的,这就是为什么当起始位置类似于 x = 690 & y = 720 时找不到解决方案——起始位置没有后继!

    【讨论】:

    • 老实说,我不完全明白你所说的继任者是什么意思。如果你不介意的话,你认为你可以说得更详细吗
    • @tommyknocker - 抱歉;我想自从我研究这个术语以来,术语已经改变了。这和“邻居”是一回事。
    【解决方案2】:

    我相信达到大小限制会导致错误并停止程序,所以我认为这不是问题。我不太了解您的代码段:您能否包含更多上下文(x,y 与是否允许对角线移动有什么关系?)

    【讨论】:

      【解决方案3】:

      800 的大小本身并不“大”,它对您来说只是大。当它的800万时回来:P。

      只要你有足够的内存来处理它,ArrayList 的大小应该不是问题。我建议你的算法有问题。如果您可以发布更多代码,我相信有人会有想法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-02
        相关资源
        最近更新 更多