在JavaScript中优化迭代加深高峰时间算法时遇到问题
我有一个学校作业要做一个迭代深化算法来解决一个6x6的高峰时间难题。我选择使用JavaScript是因为我需要练习。然而,我在优化算法时遇到了很大的困难 我试图解决一个难题,它的解决方案在树中有8层,我发现我访问了7350669个节点,我的计算机花了将近13分钟来解决 我正在寻找了解算法本身的技巧和帮助 我做了两个类-节点和车辆。这些措施的实施可能是问题的一部分:在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 =
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并实现该算法的:
JSON.parse(JSON.stringify(node))
这里的主要问题是——我错过了什么吗?删除“坏”子节点并在迭代深化算法中一遍又一遍地遍历整个树是正确的还是我误解了这一点?是否应该将它们标记为“已检查”,然后返回,然后稍后再通过它们,这样就不必再次生成整个树?首先,您必须分析代码的执行情况。否则,这只是猜测,您可能会花费大量时间更改代码,以获得0.1%的收益
记住以上几点,如果你知道对象的结构(这里就是这种情况),你可以通过手动复制每个属性而不是使用
stringify
来更快地克隆对象!我们只剩47秒了!!!这大约减少了95%的时间。你太棒了,谢谢:)@petertherobster不客气!但正如我所说,这是一个幸运的猜测没有剖析。你还在寻找其他的改进吗?是的,当然:)但是我今天还没睡,我还得想办法确定一个谜题是否根本没有答案。所以我想我会先睡觉。你帮了我很多忙,再次感谢你:)我仍然很难弄清楚如何确定一个谜题没有答案。我认为我能弄明白的唯一方法是,每次我生成一个新的状态节点时,我都必须以某种方式检查以前生成的所有节点,以确定状态是否已经生成,并重复,直到无法生成新的状态。然而,这对我来说似乎非常昂贵。有更有效的解决方案吗?如果你恰好回到顶部而没有达到最大深度,它不能自然停止吗?