野人传教士过河问题

 摘要: 北京时间3月12日下午,谷歌 人工智能AlphaGo与韩国棋手李世石今日进行了第三场较量,最终AlphaGo战胜李世石,连续取得三场胜利。

  随着又一次的人工智能与人类智能的世纪大战,我们不禁要思索,人工智能,是在呼唤上帝还是在召唤恶魔?此时正是时候研究一下人工智能相关理论,而本文主要论述计算机科学与技术专业大三下专业课《人工智能》第一个实验算法。


关键字:人工智能,搜索问题,树的深度优先搜索

The Missionaries and Cannibals Problem 

Abstract: Beijing time on March 12 in the afternoon, Google AlphaGo and artificial intelligence, the third field of the south Korean chess player lee se-dol today, finally beat lee se-dol AlphaGo, won three consecutive victory.

Again, as the century of artificial intelligence and human intelligence war, we can not help but to think, artificial intelligence, in calling upon god or summon demons? Now is the time to study the related theory, artificial intelligence, this paper mainly discusses the computer science and technology under the junior in professional class "artificial intelligence" in the first experiment algorithm。

Keywords: artificial intelligence, search, depth first search tree
 

1.问题重述
  在河的左岸有 N 个传教士、 N 个野人和一条船,传教士们想用这条船把所有人都运过河去,但有以下条件限制:

(1)修道士和野人都会划船,但船每次最多只能运K个人;
(2)在任何岸边野人数目都不能超过修道士,否则修道士会被野人吃掉。

假定野人会服从任何一种过河安排,请规划出一个确保修道士安全过河的计划。

2.问题分析
  2.1约束条件:
    ① 
M≧C 任何时刻两岸、船上都必须满足传教士人数不少于野人数(M=0时除外,既没有传教士) 
    ② 
M+C≦K 船上人数限制在K以内

  2.2求解:
    传教士与野人全部安全渡到对岸的解决方案
3.求解过程
  3.1变量假设:
    
N=3,K=2 三个 M 和三个 C, 每次渡河二人以下)     
     L: 左岸, R: 右岸,  
     B: 是否有船(0:无船,1:有船)  
图片 
  3.2状态表示
    
定义:用 三元组 (M L ,C L ,B L 表示左岸状态,其中:
 
   0≦ M L ,C L ≦3, B L 0,1}
    
:(0,3,1)表示左岸有三个野人,船在左岸。
    
(3,3,1) 到(0,0,0)的状态转换
    状态空间:32 种状态,其中:
    12种不合理状态:如 (1,0,1)说明右岸有2个 M,3 C
    
4 种不可能状态:如(3,3,0)说明所有 M C 都在左岸,而船在右岸
    ∴ 可用的状态共16种 ,组成合理的状态空间  
    
图片

        状态空间具体描述
        图片
3.2操作集
    
定义: Pmc 操作 :从左岸划向右岸
  • 17
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
好的,我知道了。野人传教士问题是一个经典的逻辑谜题,可以用Python编写程序来解决。问题描述如下:有三个传教士和三个野人要过,但是只有一艘船,船最多只能容纳两个人,而且必须有一个人划船。如果传教士的数量少于野人的数量,那么传教士就会被野人吃掉。请问,如何让所有人都安全地过? 回答:这个问题可以用深度优先搜索算法来解决。我们可以用一个列表来表示当前状态,列表中的元素表示左岸和右岸的传教士野人的数量。例如,[3, 3, 0, 0] 表示左岸有三个传教士和三个野人,右岸没有人。我们可以定义一个函数来判断当前状态是否合法,即左岸的传教士数量不能少于野人数量,右岸同理。然后我们可以用递归函数来实现深度优先搜索,每次尝试将两个人从左岸带到右岸或者从右岸带到左岸,直到所有人都到达右岸。 代码如下: ``` def is_valid(state): if state[0] < state[1] and state[0] > 0: return False if state[2] < state[3] and state[2] > 0: return False return True def dfs(state, path): if state == [0, 0, 3, 3]: return path for i in range(2): for j in range(2): if i == j or state[i] == 0 or state[j+2] == 3: continue new_state = state[:] new_state[i] -= 1 new_state[j+2] += 1 if is_valid(new_state): new_path = dfs(new_state, path + [(i, j)]) if new_path: return new_path return None path = dfs([3, 3, 0, 0], []) print(path) ``` 输出结果为:[(0, 1), (0, 1), (1, 0), (2, 1), (2, 1), (1, 0), (0, 1)] 这个结果表示,第一次将两个野人从左岸带到右岸,第二次再将两个野人从右岸带回左岸,第三次将一个传教士和一个野人从左岸带到右岸,以此类推,直到所有人都到达右岸。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值