C# RushHour 迭代加深优化

我需要使用迭代加深搜索来解决RushHour问题,我为每一步移动生成一个新节点,一切运作正常,只是计算所有步骤所需的时间太长了,原因是我生成了重复的节点。有什么方法可以检查重复节点吗?

首先我从根节点开始,然后有一个方法检查每辆车是否可以移动,如果可以,从当前节点创建一个新节点,但将那辆可以移动的车替换为具有新坐标的新车。

问题是算法越深入,重复移动就越多。

我尝试过不替换车,而是使用根节点中使用的相同集合,但这样车只能朝一个方向移动。

我想我需要以某种方式关联车的集合,但不知道怎么做。

代码

有什么方法可以停止生成重复节点吗?

题外话:我是C#的新手(读了几篇教程,然后使用了两天),所以你能告诉我我做错了什么或者我不应该做什么吗?


回答:

如果你想坚持使用迭代加深,那么最简单的解决方案可能是构建一个哈希表。然后你只需要对每个新节点做类似以下的事情:

NewNode = GenerateNextNodeif not InHashTable(NewNode) then  AddToHashTable(NewNode)  Process(NewNode) 

或者,RushHour中可能的位置(节点)数量相当少(假设你使用的是标准棋盘尺寸),并且可以相当容易地生成所有可能的(和不可能的!)棋盘。然后你可以从“解决方案”状态开始,而不是使用迭代加深,而是向后工作(标记所有可能的“父”状态),直到你到达起始状态。通过在可能状态的表上工作,你永远不会生成重复,并且通过标记每个状态一旦被访问,你就不会重新访问状态。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注