在 JavaScript 中优化迭代深化尖峰小时算法时遇到问题
Having trouble optimizing Iterative Deepening Rush Hour algorithm in JavaScript
我有一个学校作业,要做一个迭代深化算法来解决一个 6x6 尖峰时间难题。我选择使用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 并实现算法的方式:
- 检查当前节点是否为最终状态,如果是,则将其添加到解决方案数组中并返回 true。
- 否则,请检查您是否达到了最大深度,如果是,则返回 false。
- 如果没有,则对于处于此状态的每个战车,为它们可以进行的所有移动创建新节点(在上一步中移动的节点除外)
- 访问您刚刚创建的所有孩子(返回步骤 1),如果它们返回 false,请将其删除。
- 如果没有显示任何子节点是最终状态,则返回到父节点并探索其邻居。否则,就会产生真正的连锁反应。
- 重复此步骤,直到找到最终状态。如果你回到顶部,那么将maxDepth增加1并重复整个过程。
我看到的一个问题是我的数据结构可能有点复杂。由于 JavaScript 将对象和对象数组作为引用传递,因此必须使用以下方法对其进行深度复制:
JSON.parse(JSON.stringify(node))
这里的主要问题是 - 我错过了什么吗?删除"坏"子节点并在迭代深化算法中一次又一次地遍历整个树是否正确,还是我误解了这一点?它们是否应该被标记为"已检查",然后返回,然后稍后通过它们,这样就不必再次生成整个树?
首先,您必须分析代码执行。否则,这只是猜测,您可能会花费大量时间更改代码以获得 0.1% 的收益。
牢记上述内容,当您知道对象的结构(如此处所示)时,可以通过手动复制每个属性而不是使用 stringify
更快地克隆对象。
相关文章:
- 内部分区字体大小获胜'调整浏览器窗口大小时不会随媒体查询而更改
- 调整窗口大小时,可拖动的对象会出现在容器外部
- 用每小时的差值填充数组/列表-从下拉列表中给定两个时间值
- 循环比赛位置算法
- javascript扫雷器floodfill算法不能正常工作
- 如何在iOS应用程序中从Firebase中删除超过6小时的数据
- IE在将字符串转换为日期时从日期中删除4小时
- 调整屏幕大小时更改属性值
- Node JS中的排名系统算法
- 将直流图表库中的折线图缩放限制为小时
- 查找仅适用于原始图像的图像放大算法的名称
- 在数组的 2/3 上调用自身的排序算法
- 为什么要做新的.Date()与new相差1小时.日期().到ISOString()
- 让谷歌数据图表有一个24小时x轴
- Jqgrid 24小时格式的日期列
- Luhn算法的实现
- 算法:从数组(javascript/angular)中按当前日期获取上一个和下一个事件
- 如果在过去两个小时内没有记录,返回0,javascript逻辑
- 解析云代码作业:删除在数据库中已经存在一个小时的行
- 在 JavaScript 中优化迭代深化尖峰小时算法时遇到问题