Algorithm 给定初始条件,如何构造所有可能条件的图?

Algorithm 给定初始条件,如何构造所有可能条件的图?,algorithm,graph,permutation,Algorithm,Graph,Permutation,考虑一下流行的容器问题: 我们有三个容器,一个是10升,一个是7升,一个是4升。10升容器为空,7升和4升容器为满。列举通过将一个容器的内容物倒入另一个容器,直到a)倾倒容器为空或b)接收容器为满为止,您可以达到的方法(其他一些状态) 对于家庭作业(我已经完成了),我们应该讨论如何将这类问题解释为一个图,然后在图上运行什么算法来找到解决方案 我的问题是,在一定的初始条件下,我们如何生成三个容器所有可能状态的图表?对于一组给定的容器,可能有N个可能的状态,但我想象有M个不相交的状态,它们不可能从初

考虑一下流行的容器问题:

我们有三个容器,一个是10升,一个是7升,一个是4升。10升容器为空,7升和4升容器为满。列举通过将一个容器的内容物倒入另一个容器,直到a)倾倒容器为空或b)接收容器为满为止,您可以达到的方法(其他一些状态)

对于家庭作业(我已经完成了),我们应该讨论如何将这类问题解释为一个图,然后在图上运行什么算法来找到解决方案


我的问题是,在一定的初始条件下,我们如何生成三个容器所有可能状态的图表?对于一组给定的容器,可能有N个可能的状态,但我想象有M个不相交的状态,它们不可能从初始条件达到。那么我们如何找到有效图的N-M个顶点,以及连接这些顶点的边呢?

一个图有节点和

节点表示一种状态。也就是说,所有容器的状态

表示状态之间的(有效)转换

如果可以枚举更改状态的所有方法,则可以将节点的所有传出边枚举给其他节点

以容器为例:

状态:10升容器(内部一定量)、7升容器(内部一定量)和4升容器(内部一定量)

状态转换功能:

  • 将4升容器中的内容物倒入7升容器中
  • 将7升容器中的内容物倒入10升容器中
  • 将4升容器中的内容物倒入10升容器中
  • 将7升容器中的内容物倒入4升容器中
  • 将10升容器中的内容物倒入4升容器中
  • 将10升容器中的内容物倒入7升容器中
对这些功能的限制:一个浇灌直到浇灌容器为空,或接收容器为满

您有n个容器,这些容器之间可能存在(n选择2)交互

调用这些函数中的任何一个都可能使您进入另一种状态

您可以定义与每个边转换关联的成本。在像这样的简单问题中,所有的边过渡函数都有相同的代价(1),但在现实世界中的示例中,如在地图上的城市之间移动,代价可能是沿边移动的距离

也许你想尽量减少倒出4升的容器。对于涉及将4升容器倒入任何其他容器的所有边缘,可以将边缘权重指定为2而不是1

现在我们已经根据节点和边定义了图,我们可以搜索它了

也许你有一些像你提到的开始状态(10升的容器是空的,7升和4升的容器是满的)。你想进入另一个状态(10升的容器是满的,7升的容器是空的,4升的容器有1升)。您可以从初始状态开始搜索图形,并在达到目标时停止搜索

传统的图搜索技术有广度优先搜索(BFS)和深度优先搜索(DFS)。我会让你去学的。其他的图形搜索技术,如*定义了一个启发式或经验法则,用于尝试以最快的速度到达目标状态。启发式包括估计距离目标还有多长时间,还有各种各样的研究为特定问题定义启发式(提出启发式可能非常困难!)


实际上,可以通过前面描述的BFS或DFS方法来生成稍后要搜索的图形。简单地说,创建一个描述初始条件的节点,然后对其应用所有状态转换函数以生成所有可访问的节点。将这些节点放在列表中(这些节点已生成但尚未展开)。对于列表中的每个元素,以相同的方式展开它。将已完成扩展的节点放在一个封闭列表中,这样您就可以确保不再尝试两次生成同一个节点。

也许我不清楚,但我想知道如何生成要搜索的图,而不仅仅是搜索已经存在的图。或者你是说我们一个BFS或DFS就足以生成图形?@TyLarrabee一个BFS和DFS就足以生成图形。至少,可以从开始节点访问的所有节点的图形。正确。谢谢你的帮助!