渡河问题的分析

来源:互联网 发布:java pdf在线预览功能 编辑:程序博客网 时间:2024/05/02 21:22

形式化的描述:

初始状态:河的两岸,一岸有3个野人3个传教士,和一条一次可渡过一个或两个人的船

目标测试:6人全部到达另一岸,摆渡过程中,任何地方野人数量不超过传教士的数量

后继函数:船载人从一岸到另一岸

耗散函数:船来回的次数

 

状态空间:(以数据代替图形更为直观)

考虑船上状态可转变,是中间状态(当与某一岸接触时可算作那一岸的一部分)最终可用人初始在的一岸的野人数,传教士人数,船的情况构成三元组来表示状态空间,则初始状态为(3,3,1),结束状态(0,0,0);所有的中间状态可以是:(渡字全部指自初始岸到要到的另一岸)

————自初始状态,

渡一人:(2,3,0),最终回到原来的状态(3,3,1)

渡二人:(1,3,0),然后回来一人(2,3,1);(2,2,0),回来传教士(2,3,1)

————自状态(2,3,1)

渡一人:(1,3,0),(2,2,0);最终回到(2,3,1);

渡二人:.(0,3,0),回来一人(1,3,1),两人(2,3,1)

————自状态(1,3,1)

渡一人:(0,3,0)最终与前同;

渡两人:若(1,1,0),回来2传教士(1,3,1)与前同;回来一传教士一野人(2,2,1)

————自状态(2,2,1)

渡一人:无

渡两人:到(1,1,0)回到原来与前同;到(2,0,0),接下了起另一段

  可让要到的对岸的野人(1个)渡回到原岸通过两次来回的摆渡将原岸的两野人渡到对岸会;依次出现(3,0,1),(1,0,0),(2,0,1),(0,0,0);至此达到目的状态

  在此过程中,当状态为(1,0,0),若一传教士回到原岸,出现(1,1,1)的状态,其他的可能要么无法出现(与后继函数矛盾),要么重复以前的状态,故一种最优的状态切换为(3,3,1),(1,3,0),(2,3,1),(0,3,0),(1,3,1),(1,1,0),(2,2,1),(2,0,0),(3,0,1),(1,0,0),(2,0,1),(0,0,0)

  简单的思路便是,先让一个野人做船工到达(1,3,1),传教士两人到对岸,状态(1,1,0),此时回1传教士1野人,到(2,2,1),然后两传教士渡到对岸至(2,0,0),之后让已到到对岸的野人做船工,将原岸的两野人接来。

  当然最优的路径不唯一,譬如第1次的野人的渡河工作的第一个野人被渡工作可以由传教士完成,第2次的野人的渡河工作的第二个野人被渡工作可以由传教士完成

如此,最优的渡河方案可有三种

总结一下,上面出现的所有状态,都满足题意,且已经完备,以此三元组(定义在开头)的形式将状态空间成功完全描述。

即:(3,3,1),(1,3,0),(2,3,1),(0,3,0),(1,3,1),(1,1,0),(2,2,1),(2,0,0),(3,0,1),(1,0,0),(2,0,1),(0,0,0)

另加:(2,2,0),(1,1,1)

上述的许多状态间可以循环重复

B.

  由上述的推理过程可知,只要避免状态的重复出现,任意的搜索算法在按照后继函数的规定所产生的搜索路径进行,搜索总能实现目标状态的出现,剔除重复过程则一定是最优的。

  为产生最优的求解方案,检查剔除重复状态是必须的。

C.

首先状态空间概念的定义难以把握,很难准确把握,即使准确不一定最简无重复说明。

在推理的过程中,推理类似搜索,可见人类在复杂搜索任务面前多么无力,很难判断是否重复,很多时候把握不住,以为问题无解。

问题条件复杂,因此找到问题的关键即找到问题解决的简单思路,极其困难,不得不走机器式的直接搜索试探方案,而非目标确定(向状态(1,1,0)、(2,2,1)靠近)的启发式(人脑的搜索优势)试探

此题的多解性,亦增加了问题的难度

 

原创粉丝点击