关于3个水壶问题:
我们有3个水壶,第一个水壶的容量是12个,第二个水壶的容量是8个,第三个水壶的容量是3个。 初始状态是:(0,0,0) 后继功能是:目标状态是:(1,1,1)
我想绘制其状态树。我自己做了,但我不确定它是否正确?
(0,0,0)
/ | \
/ | \
/ | \
(12,0,0) (0,8,0) (0,0,3)
(12,0,0)的子节点是:(12,0,0),(12,8,0),(12,8,3),(0,8,3),(0 ,0,3),(0,0,0),(9,8,3),(12,8,0),(4,8,3),(12,0,3),(12,5 ,3),(12,5,3),(12,8,0)
其中(12,0,0),(0,0,0)==>因为它在root中,(12,8,0)==> 是失败节点,我们不扩展它们。
我想如果我展开(0,0,3),我将达到我的目标状态: 节点(0,0,3)的子节点:(3,0,0),(0,3,0),(0,0,3),(1,1,1)(1,1,1) )是我的目标状态吗?
问题:我理解正确吗?这些是状态还是生成树?
答案 0 :(得分:3)
图表对于第一步是正确的,但是 - 您将兄弟姐妹(12,0,0),(0,8,0)和(0,0,3)错误地展开。
你应该做一个步骤,而不是每次迭代多次,而不是尝试做很多步骤。
因此:
successors((12,0,0)) = { (12,0,3), (12,8,0), (0,0,0), (9,0,3), (4,8,0) }
successors((0,8,0)) = { (12,8,0), (0,8,3), (8,0,0), (0,5,3), (0,0,0) }
successors((0,0,3)) = { (12,0,3), (0,8,3), (3,0,0), (0,3,0), (0,0,0) }
(从每个州,你只能做1次允许的操作,而不是更多 - 获得继承者/后续状态。)
通过不断扩展这些,你将最终获得所有可能性。
仅供参考,此问题有时称为The Die Hard Problem,并且是通过构建状态graph并运行路径查找算法(例如{{3)来使用缩减来解决问题的典型示例}或A*。