考虑一下流行的容器问题:
我们有三个容器,一个是10升,一个是7升,一个是4升。 10升容器是空的,7升和4升容器已满。列举一种方法,通过这种方法,只需将一个容器的内容物倒入另一个容器,直到a)浇注容器为空或b)接收容器已满,即可达到其他状态。
对于家庭作业(我已经完成),我们应该讨论如何将这类问题解释为图形,然后我们将在图表上运行哪些算法以找到解决方案。
我的问题是,在给定某些初始条件的情况下,我们如何生成三个容器的所有可能状态的图表?对于给定的一组容器,可能存在N种可能的状态,但我想有M个不相交的状态,这是从初始条件不可能达到的。那么我们如何找到有效图的N-M顶点,以及连接这些顶点的边?
答案 0 :(得分:0)
图表包含节点和边缘。
节点意味着一个州。也就是说,所有容器的状态
边缘意味着状态之间的(有效)转换。
如果您可以枚举更改状态的所有方法,那么您可以枚举节点到其他节点的所有传出边缘。
以容器为例:
状态:10升容器(内部量),7升容器(内部量)和4升容器(内部量)州过渡职能:
对这些功能的限制:一次浇注直至浇注容器为空,或接收容器已满。
您有n个容器,并且可能(n选择2个)这些容器之间的交互。
调用这些功能中的任何一个可能会使您转换到另一个状态。
您可以定义与每个边缘过渡相关联的费用。在像这样的简单问题中,所有边缘过渡函数都具有相同的成本(1),但在实际示例中,例如在地图上的城市之间移动,成本可能是沿边缘行进的距离。 / p>
也许您希望尽量减少倒出4升容器。对于涉及将4升容器倒入任何其他容器的所有边缘,您可以为2而不是1指定边缘权重。
现在我们已经根据节点和边缘定义了图形,我们可以搜索它!
也许你有一些像你提到的那样的起始状态(10升容器是空的,7升和4升容器已满)。而你想进入其他一些状态(10升容器已满,7升容器为空,4升容器为1升)。您可以从初始状态开始搜索图表,并在达到目标时停止搜索。
传统的图搜索技术是广度优先搜索(BFS)和深度优先搜索(DFS)。我会让你去wikipedia学习它们。其他图形搜索技术(如A *)定义了一个启发式或经验法则,试图以最快的速度进入目标状态。启发式方法包括估计在你达到目标之前你已经有多长时间了,并且有针对特定问题定义启发式的各种研究(提出启发式算法真的很难!)
实际上,生成您想要稍后搜索的图形可以通过前面描述的BFS或DFS方法完成。简单地说,创建一个描述初始条件的节点,然后在其上应用所有状态转换函数以生成所有可到达的节点。将这些节点放在列表中(这些节点是已生成但尚未展开的节点)。对于列表中的每个元素,以相同的方式展开它。将已完成扩展的节点放入已关闭的列表中,以确保您不会尝试两次生成相同的节点。