Java 食人族和传教士使用IDDF和GreedyBFS

Java 食人族和传教士使用IDDF和GreedyBFS,java,algorithm,artificial-intelligence,river-crossing-puzzle,Java,Algorithm,Artificial Intelligence,River Crossing Puzzle,三个食人族和三个传教士必须过河。他们的船只能载两个人。如果食人族的数量超过传教士,那么在河的两边,传教士都有麻烦了(我不会描述结果)。每个传教士和食人族都可以划船。这六个人怎么能过河呢 我找不到使用IDDFS(迭代深化深度优先搜索)和GreedyBFS(贪婪的最佳优先搜索)解决这个问题的算法。一个如何解决这个问题的想法也会让我很高兴 编辑: 我在wiki上找到了IDDFS的算法: IDDFS(root, goal) { depth = 0 repeat { result =

三个食人族和三个传教士必须过河。他们的船只能载两个人。如果食人族的数量超过传教士,那么在河的两边,传教士都有麻烦了(我不会描述结果)。每个传教士和食人族都可以划船。这六个人怎么能过河呢

我找不到使用IDDFS(迭代深化深度优先搜索)和GreedyBFS(贪婪的最佳优先搜索)解决这个问题的算法。一个如何解决这个问题的想法也会让我很高兴

编辑:

我在wiki上找到了IDDFS的算法:

IDDFS(root, goal)
{
  depth = 0
  repeat
  {
    result = DLS(root, goal, depth)
    if (result is a solution)
      return result
    depth = depth + 1
  }
}


DLS(node, goal, depth) 
{
  if (depth == 0 and node == goal)
    return node
  else if (depth > 0)
    for each child in expand(node)
      DLS(child, goal, depth-1)
  else
    return no-solution
}
但我不知道DLS()中的扩展(节点)在我的问题中应该完成什么。 这是我的节点类:

public class Node{
    //x-no of missionaries
    //y-no of cannibals
    //z-position of boat
    int x,y;
    boolean z;
    Node(int x,int y,boolean z){
        this.x=x;
        this.y=y;
        this.z=z;
    }
    public int getM(){
        return this.x;
    }
    public int getC(){
        return this.y;
    }
    public boolean getB(){
        return this.z;
    }
    public void setM(int x){
        this.x=x;
    }
    public void setC(int y){
        this.y=y;
    }
    public void setB(boolean z){
        this.z=z;
    }

}

我非常感谢您的帮助。

如何不用算法求解它?您的模型很小,不需要任何编程就可以求解,先是两个食人族去另一边,然后其中一个带着船回来,把另一个食人族带到另一边,现在有三个食人族在另一边,其中一个背着,两个传教士去了另一边(现在两个c和两个m在另一边)。在这一次,一个
c
和一个
m
返回(首先是2个c和2个m),然后再向另一侧移动2个m(另一侧有一个c,另一侧有3个c),另一侧只有一个c返回并在另一侧携带两个c(另一侧有2个c和3个m),再次有一个c返回并将最新的c移动到另一侧


如何用DFS等算法模拟它?创建一个有向图,有2^6个位置(所有可能的{1,2,3,4,5,6}子集),如果您可以使用可用的移动从一个位置移动到另一个位置,则它们彼此相关。有些节点是死节点(在一侧导致更多的同类相食的节点),您将从图形中删除这些节点,然后您的任务是检查是否有办法从节点0{}到节点63{1,2,3,4,5,6},这可以通过BFS、DFS等太多方法解决。

为了使用您提到的算法,你需要弄清楚问题的状态空间是什么。状态是对问题中情况的完整描述(无论是起始情况、最终情况还是中间情况)。诀窍是在一个状态中包含足够的信息,以便能够确定该状态是否是问题的解决方案,如果不是,下一步该做什么。在您的例子中,一种可能的表示状态的方法是使用三个变量:整数m表示河流起始侧有多少传教士,整数c表示起始侧有多少食人族,布尔值b表示船在哪一侧。给定(m,c,b)的值,您可以确定可以采取哪些可能的操作,以及这将使您达到哪些其他状态。您提到的算法实际上是通过一组连接状态进行搜索的算法。

您是否在努力了解如何通过搜索来探索状态空间,或者最佳路径的标准是什么?“六个如何通过河流?”如果您指的是“活的或半消化的”,这个问题很简单!;)这通常不是搜索方法,而是您对问题的表示。在这个问题中,所有可能的行为和状态是什么?还要注意的是,人们可以在河的任何一边上船,而不仅仅是他们出发的那一边。我正在尝试使用ID和GBFS实现搜索算法。但我不知道它们(ID和GBFS)是如何工作的。如果大多数食人族都在船上怎么办?