Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript中优化迭代加深高峰时间算法时遇到问题_Javascript_Arrays_Algorithm_Iterative Deepening - Fatal编程技术网

在JavaScript中优化迭代加深高峰时间算法时遇到问题

在JavaScript中优化迭代加深高峰时间算法时遇到问题,javascript,arrays,algorithm,iterative-deepening,Javascript,Arrays,Algorithm,Iterative Deepening,我有一个学校作业要做一个迭代深化算法来解决一个6x6的高峰时间难题。我选择使用JavaScript是因为我需要练习。然而,我在优化算法时遇到了很大的困难 我试图解决一个难题,它的解决方案在树中有8层,我发现我访问了7350669个节点,我的计算机花了将近13分钟来解决 我正在寻找了解算法本身的技巧和帮助 我做了两个类-节点和车辆。这些措施的实施可能是问题的一部分: class Vehicle { constructor(x,y,length,horizontal){ this.x =

我有一个学校作业要做一个迭代深化算法来解决一个6x6的高峰时间难题。我选择使用JavaScript是因为我需要练习。然而,我在优化算法时遇到了很大的困难

我试图解决一个难题,它的解决方案在树中有8层,我发现我访问了7350669个节点,我的计算机花了将近13分钟来解决

我正在寻找了解算法本身的技巧和帮助

我做了两个类-节点和车辆。这些措施的实施可能是问题的一部分:

class Vehicle {
  constructor(x,y,length,horizontal){
    this.x = x; //X position of the upper/left block of the vehicle
    this.y = y; //y postion
    this.length = length; //length of the vehicle
    this.horizontal = horizontal; //boolean - false if vertical
  }
}

class Node {
  constructor(grid,vehicles,moved,depth){
    this.grid = grid; //A 6x6 char array grid
    this.vehicles = vehicles; //array of vehicles on the game board
    this.moved = moved; //index of vehicle moved in last turn
    this.depth = depth; //Depth of this node
  }
}
我的假设是正确的吗?既有一个“二维”的网格阵列,也有一个车辆阵列,这是一种过度的杀伤力?当检查可能的移动时,我迭代车辆数组,但使用网格只是快速检查车辆是否有前方的自由通道。我会回到我看到的问题上来

我无法公开发布该算法的代码,但以下是我如何理解IDDF并实现该算法的:

  • 检查当前节点是否为最终状态,如果为最终状态,则将其添加到解决方案数组中,并返回true
  • 否则,检查是否达到maxDepth,如果达到,则返回false
  • 如果不是,则为此状态下的每辆车辆创建新节点,用于其可以进行的所有移动(上次移动中移动的除外)
  • 访问您刚创建的所有子项(返回步骤1),如果返回false,则删除它们
  • 如果没有任何子节点显示为最终状态,则返回父节点并探索其邻居。否则,就会发生真正的连锁反应
  • 重复此操作,直到找到最终状态。如果返回顶部,则将maxDepth增加1并重复整个过程
  • 我看到的一个问题是,我的数据结构可能有点复杂。由于JavaScript将对象和对象数组作为引用传递,因此必须使用以下方法对其进行深度复制:

    JSON.parse(JSON.stringify(node))
    

    这里的主要问题是——我错过了什么吗?删除“坏”子节点并在迭代深化算法中一遍又一遍地遍历整个树是正确的还是我误解了这一点?是否应该将它们标记为“已检查”,然后返回,然后稍后再通过它们,这样就不必再次生成整个树?

    首先,您必须分析代码的执行情况。否则,这只是猜测,您可能会花费大量时间更改代码,以获得0.1%的收益


    记住以上几点,如果你知道对象的结构(这里就是这种情况),你可以通过手动复制每个属性而不是使用
    stringify

    来更快地克隆对象!我们只剩47秒了!!!这大约减少了95%的时间。你太棒了,谢谢:)@petertherobster不客气!但正如我所说,这是一个幸运的猜测没有剖析。你还在寻找其他的改进吗?是的,当然:)但是我今天还没睡,我还得想办法确定一个谜题是否根本没有答案。所以我想我会先睡觉。你帮了我很多忙,再次感谢你:)我仍然很难弄清楚如何确定一个谜题没有答案。我认为我能弄明白的唯一方法是,每次我生成一个新的状态节点时,我都必须以某种方式检查以前生成的所有节点,以确定状态是否已经生成,并重复,直到无法生成新的状态。然而,这对我来说似乎非常昂贵。有更有效的解决方案吗?如果你恰好回到顶部而没有达到最大深度,它不能自然停止吗?