'3 jugs of water'的状态图

时间:2012-12-13 09:45:26

标签: algorithm artificial-intelligence graph-algorithm

关于3个水壶问题:

我们有3个水壶,第一个水壶的容量是12个,第二个水壶的容量是8个,第三个水壶的容量是3个。 初始状态是:(0,0,0) 后继功能是:

  1. 添加:完全填充jag
  2. 倒入另一个:将一个水壶的内容倒入第二个(直到第一个空或第二个完全装满)
  3. 空是:从其所有内容中清空一个jar
  4. 目标状态是:(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) )是我的目标状态吗?

    问题:我理解正确吗?这些是状态还是生成树?

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*