无法在JavaScript

时间:2016-03-19 08:15:59

标签: javascript arrays algorithm iterative-deepening

我有一个学校作业,可以制作一个迭代深化算法来解决6x6 Rush Hour拼图。我选择使用所有东西的JavaScript,因为我需要练习。然而,我无法很好地优化算法。

我试图解决一个难题,它将解决方案的8个级别放入树中,我发现我访问了7,350,669个节点,我的计算机花了将近13分钟来解决。

我正在寻找提示和帮助理解算法本身。

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

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
  }
}

我是否正确地假设,同时拥有"二维"网格阵列以及一系列车辆是否过度杀伤?当检查可能的运动时,我会在车辆阵列上进行迭代,但是使用网格可以快速检查车辆是否已经自由前进。我会回到我看到的问题。

我不能公开发布算法的代码,但这是我理解IDDFS并实现算法的方法:

  1. 检查当前节点是否为最终状态,如果是,则将其添加到解决方案数组并返回true。
  2. 否则请检查您是否达到maxDepth,如果是,则返回false。
  3. 如果没有,那么对于这种状态下的每辆车,都可以为他们可以进行的所有动作创建新节点(除了最后一步移动的那些)
  4. 访问您刚刚制作的所有孩子(返回步骤1),如果他们返回假,则删除它们。
  5. 如果没有孩子被证明是最终状态,那么返回父节点并探索其邻居。否则返回真正的连锁反应。
  6. 重复直到找到最终状态。如果你回到顶部,那么将maxDepth增加1并重复整个过程。
  7. 我看到的一个问题是我的数据结构可能有点复杂。因为JavaScript将对象和对象数组作为引用传递,所以必须使用以下方法对它们进行深度复制:

    JSON.parse(JSON.stringify(node))
    

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

1 个答案:

答案 0 :(得分:2)

首先,您必须分析代码执行情况。否则,这是猜测,你可以花很多时间来改变你的代码,获得0.1%的收益。

牢记上述内容,您可以通过手动复制每个属性而不是使用stringify来了解其结构时更快地克隆对象(如此处所示)。