我有一个学校作业,可以制作一个迭代深化算法来解决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并实现算法的方法:
我看到的一个问题是我的数据结构可能有点复杂。因为JavaScript将对象和对象数组作为引用传递,所以必须使用以下方法对它们进行深度复制:
JSON.parse(JSON.stringify(node))
这里的主要问题是 - 我错过了什么吗?删除"坏"是否正确?子节点并在迭代加深算法中一次又一次地遍历整个树或者我误解了吗?它们是否应该标记为"已检查"然后返回然后稍后通过它们以便不必再生成整个树?
答案 0 :(得分:2)
首先,您必须分析代码执行情况。否则,这是猜测,你可以花很多时间来改变你的代码,获得0.1%的收益。
牢记上述内容,您可以通过手动复制每个属性而不是使用stringify
来了解其结构时更快地克隆对象(如此处所示)。