【问题标题】:Quickest path through a Maze (Dungeon) Dijstkra通过迷宫(地牢)Dijstkra 的最快路径
【发布时间】:2014-05-12 20:21:00
【问题描述】:

更新:

我相信一些随机路径的输出是在这里引起的:

if(openlist[x][y]!=1){

            if(min>copy[x][y]){
            min=copy[x][y];
            holdx = x;    
            holdy = y;
            }
        }

我相信在某些时候,当我的最短路径大于另一条路径时,它会测试每条路径(并输出它)。我将如何解决这个问题?

【问题讨论】:

  • “将危险降到最低”。这是否意味着通过一个 9 级怪物的路径优于 10 个 1 级怪物?如果怪物等级相同(9 级 1 和 1 级 9),是否有首选路径?
  • 最好从 StackOverflowError 发布堆栈跟踪
  • @heptadecagram 任务的重点是通过具有最低危险路径的网格。这意味着如果一条路径包含五个 lvl 1 怪物和一个 lvl 9,它会比包含五个 lvl 2 怪物和一个 lvl 6 怪物的路径更优化(第一条路径的总危险等级为 14,第二条路径的总危险等级为16)
  • @Will 我会得到大于 62 的任何东西:java.lang.AbstractStringBuilder 的线程“main”java.lang.StackOverflowError 异常。 lang.StringBuilder.(StringBuilder.java:85)
  • @JamesDoe - 仅供参考 - 错误中真正重要的部分是代码中的行,而不是核心 JDK 内容。不用担心在我的 IDE 中进行快速测试以找到您的错误。

标签: java traversal dijkstra shortest-path maze


【解决方案1】:

通过查看您的代码,我只能看到您没有正确地对您的状态进行主线化。 您有一个名为 moveToPosition() 的方法,但它会为每个节点调用 - 您最终会将每个 x/y 组合添加到 paths List

老实说,这其中的很多内容没有意义,而且我认为您遇到的问题不止一个。还有很多糟糕的编程技巧会被扣分:

  • 不是面向对象的——你到处都在使用静态。
  • 不使用适当的范围 - 一切都是公开的
  • 没有 cmets
  • 变量的名称不能解释它们所包含的内容。
  • 为不同的用途使用相同的变量 (holdx)

如果我是你,我会尝试完成你的教授示例。它将教你一些在 OO 设计中体面的可转移技能。我会忽略从文件中读取和写入的整个过程。只需在方法中模拟一个快速的 Node[3][3] 迷宫并将其传递给初始方法。您还需要跟踪您是否已经访问过某个节点,但这应该很容易。

对不起,我帮不上忙 - 我的解决方案与您的教授非常相似,您会发现同样难以理解,我反对为某人做作业 - 不能这样学习,而且编程非常一旦你克服了最初的困难,就会很愉快。

一切顺利


在设置size > 100 时,作为StackOverflowError 的解决方案,您需要增加stack 的大小。

要增加堆栈大小,请使用 Java VM 参数 -Xss 并将其设置为大于默认值。

-Xss64M 应该可以解决问题。

作为解释,随着您增加size 参数,您也在增加您正在执行的递归量,这意味着将越来越多的方法调用放在您的stack 上(如非常长的堆栈所示抛出错误时打印)。要继续以如此多的递归方式使用您的应用程序,您需要增加堆栈的大小。

详情请参阅SO question

【讨论】:

  • 这仍然只解决了我的一个问题,而不是我遇到的主要问题。感谢您的帮助,我会尽快编辑我的代码以适应您的修复。
  • 是的,可能稍后再看,但现在已经很晚了,我可以轻松修复 SO 错误。 :)
  • 感谢您的关注
  • 不,我明白了。我理解我教授的例子,只是不想实施所有方法;主要是因为我时间紧迫,还有其他任务要做(这就是我把所有事情都推迟到最后一分钟的结果)。我所做的编码很糟糕,我理解这一点,但它是我从不同的 powerpoint 和示例中抓取并修改它们的不同元素的混合体。
  • 所以是的,即使按照我的标准,它也很差。我能够在没有太多努力的情况下把它弄得那么近,而且我在试图理解它时也遇到了困难。不幸的是,如果我有更多的时间,我会以一种更简洁的方式进行尝试;但我没有,这就是我得到的。我感谢你的帮助,也理解你不愿意为我做这件事。谢谢你帮助你所做的一切。
【解决方案2】:

当您收到“真正的” StackOverflow 错误时,这意味着您的堆栈中有太多嵌套帧,让 JVM 感觉不到它正在取得进展。

要解决此问题,您可以调整 JVM,但这是一场失败的游戏。总会有一些东西需要更多的调优,而调优会使 JVM 失调以适应更小的迷宫。

要真正解决问题,您需要保留状态集合,有效地将本应存储在堆栈中的信息推入堆中。与堆栈不同,堆没有堆栈帧,因此您不能将它们嵌套得太深。你仍然会面临内存不足异常的风险(如果你填满了你的堆),但这可能会在很久以后发生(并且会出现更大的迷宫)。

【讨论】:

  • 对不起,我忘了把那部分拿出来,我修复了 SO 错误。不过谢谢。 @EdwinBuck
猜你喜欢
  • 1970-01-01
  • 2012-08-02
  • 2018-03-24
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2012-04-08
相关资源
最近更新 更多