如何为水壶问题定义启发式函数?

我在尝试将水壶问题转化为启发式函数时遇到了一些问题。

有两个水壶,一个可以装5加仑(x),另一个可以装3加仑(y)。目标是(y,x)=(0,4)。

我无法弄清楚如何将其转化为启发式函数,同时我对状态数量也有疑问。如果我承认以下操作(从水龙头装满一个水壶,向排水口倒空一个水壶,以及从一个水壶向另一个水壶倒水,直到接收的水壶装满或倒水的水壶变空),则有15种可能的状态,但如果我考虑所有关于加仑数的可能性,则有24种可能性。这是正确的吗?

(0,0)

(3,0)(0,5)

(0,3)(3,5)(3,2)

(3,3) (0,2)

(1,5) (2,0)

(1,0) (2,5)

(0,1) (3,4)

(0,4)

我认为这个问题的启发式函数可以定义为:

h(x,y) = (x * 5) + (y * 3)

但我在一个问题(水壶的启发式函数)中也找到了这个答案,现在我很困惑。能有人向我解释一下吗?

max(estimate_from_parent – action_cost, estimate_from_this_node)


回答:

状态数量和可达性:

关于理论上的状态数量你是正确的(假设水桶只能装整数加仑的水 – 否则是无限的)。因为水桶X可以装6种可能的加仑数,而水桶Y可以装4种可能的加仑数,所以总的状态数是6*4=24。

从技术上讲,(3,1)也是可达的,在你找到解决方案后,所以有16种可能的状态。

启发式函数:

关于启发式函数,你可能需要花点时间思考你的目标。你希望在水桶x中有四加仑水。所以你离在水桶x中有四加仑水越近,你就越接近你的目标,你的启发式函数的值应该越低(因为它是一个估计的成本)。因此,当水桶x中有四加仑水时,你的启发式函数的值应该最低。你在这里提出的启发式函数,h(x,y) = (x * 5) + (y * 3),在(0,0)时是最低的。由于这不是你的目标节点,这不太可能是一个好的启发式函数。

在思考启发式函数时,找到一个使你的问题变得更难的约束然后放宽它通常是有用的。这有助于提出一个可接受且一致的启发式函数,因为你的启发式函数基本上是一个最佳情况的估计。对于这个问题,一个相当大的约束是只能向水桶x中添加某些量的水(即水桶y中的量,或者填满水桶x所需的量)。我们可以放宽这个约束,基本上得到h(x,y) = |X-4|(在链接的帖子中讨论的启发式函数,适应你的问题)。这绝对是可接受且一致的,因为它有效地表示了从那个节点一步达到目标的成本,如果这样一步是可能的话。如果你在目标节点,它将等于0。请注意,你的成本计算方式对于使这个启发式函数有用至关重要。

这是否解除了你的困惑?

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中创建了一个多类分类项目。该项目可以对…

发表回复

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