这个问题本来是《人工智能技术导论》第三章的课后题,今天上午考试正巧考到了这道题,要我们画状态转换图,我之前思考过一点,所以写出的状态表示应该没有问题,但这些状态太多了.......,十来种状态直接给我干懵逼了,两个小时的考试,差不多得有一个小时在推导状态转换关系,最后整个考场就剩下我和谭神两个人了,这里写下博客,整理一下这个问题。
网上搜索发现这个博主的做法和我的做法大致一样的,他最后给出了C++的实现方式。这篇博客状态分析部分就主要参考https://www.cnblogs.com/guanghe/p/5485800.html
后面再附上PROLOG程序的解决方案。
一、问题重述
在河的左岸有N个传教士、N个野人和一条船,传教士们想用这条船把所有人都运过河去,但有以下条件限制:
(1)修道士和野人都会划船,但船每次最多只能运K个人;
(2)在任何岸边野人数目都不能超过修道士,否则修道士会被野人吃掉。
假定野人会服从任何一种过河安排,请规划出一个确保修道士安全过河的计划。
二、问题分析
1、约束条件
① M≧C 任何时刻两岸、船上都必须满足传教士人数不少于野人数(M=0时除外,既没有传教士)
② M+C≦K 船上人数限制在K以内
2、求解
传教士与野人全部安全渡到对岸的解决方案
三、状态表示
设N=3,K=2(三个M和三个C,每次渡河二人以下)
L:左岸,R:右岸,
B:是否有船(0:无船,1:有船)
定义:用三元组(ML,CL,BL)表示左岸状态,其中:
0≦ML,CL≦3,BL∈{0,1}
如:(0,3,1)表示左岸有三个野人,船在左岸。
从(3,3,1)到(0,0,0)的状态转换
状态空间:32 种状态,其中:
12种不合理状态:如(1,0,1)说明右岸有2个M,3个C;