【问题标题】:Cannibals and missionaries using IDDFS and GreedyBFS食人族和传教士使用 IDDFS 和 GreedyBFS
【发布时间】:2012-03-24 11:27:25
【问题描述】:

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

我找不到使用 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() 中的 expand(node) 应该在我的问题中完成什么。 这是我的节点类:

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;
    }

}

我将不胜感激。

【问题讨论】:

  • 您是否正在苦苦思索如何通过搜索来探索状态空间,或者最佳路径的标准应该是什么?
  • “六个人怎么能过河?” 好吧,如果你的意思是“活着或半消化”,问题就简单了! ;)
  • 这通常不是搜索方法,而是您对问题的表述。这个问题中所有可能的动作和状态是什么?另请注意,人们可以在河的任何一侧上船,而不仅仅是他们开始的一侧。
  • 我正在尝试使用 IDS 和 GBFS 实现搜索算法。但我无法弄清楚它们(IDS 和 GBFS)是如何工作的。
  • 如果船上有大部分食人族,那会怎样?

标签: java algorithm artificial-intelligence river-crossing-puzzle


【解决方案1】:

如何在没有算法的情况下解决它?你的模型很小,可以在没有任何编程的情况下解决,前两个食人族去另一边,然后其中一个背着船和另一个食人族到另一边,现在另一边有 3 个食人族,其中一个是背,两个传教士去另一边(现在 2 c 和 2 m 在另一边)。在这一次,一个c 和一个m 回来了(2 c 和 2 m 排在第一位),然后 2 m 又回到了另一侧(3 m 在另一侧有一个 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 等多种方式解决。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-04-25
      • 1970-01-01
      • 1970-01-01
      • 2019-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多