C# RushHour 迭代加深优化

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

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

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

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

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

代码

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

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


回答:

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

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

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

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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