人工智能基础---上机1:猴子摘香蕉

人工智能基础—上机1:猴子摘香蕉

一、题目

利用一阶谓词逻辑求解猴子摘香蕉问题:房内有一个猴子,一个箱子,天花板上挂了一串香蕉,其位置如图 1 所示,猴子为了拿到香蕉,它必须把箱子搬到香蕉下面,然后再爬到箱子上。请列出问题的初始化状态(即下图所示状态),目标状态(猴子拿到了香蕉,站在箱子上,箱子位于位置 b),并编程实现解题过程。
人工智能基础---上机1:猴子摘香蕉_第1张图片

二、解题思路

正向思维:猴子走到箱子->猴子将箱子搬到香蕉下->猴子爬上箱子->猴子摘到香蕉;
逆向思维:猴子要摘到香蕉,就得站在箱子上,在这之前它得爬上箱子,再之前得将箱子搬到香蕉下,再之前得走到箱子所在的位置;
人工智能基础---上机1:猴子摘香蕉_第2张图片

三、代码

#include 
using namespace std;
struct state
{
	char monkey;//猴子的位置:∈{a,b, c}
	char banana;//香蕉的位置:∈{a,b, c}
	char box;//箱子的位置:∈{a,b, c}
	int have;//猴子是否拿到香蕉
	int on;//猴子是否在箱子上
};
static int step = 0;//记录步数
bool go_to_box(struct state& s)
{
	//猴子不在箱子处要先走向箱子
	if (s.monkey != s.box)
	{
		step++;
		cout<<"第"<<step<<"步:" << "猴子从" << s.monkey << "处走到箱子" << s.box << endl;
		s.monkey = s.box;
		return true;
	}
	return false;
}
bool move_box(struct state& s)
{   //猴子到达箱子处要移动箱子到香蕉下(箱子和香蕉在同一位置就不需要移动了)
	if (s.monkey == s.box && s.box!=s.banana)
	{
		step++;
		cout << "第" << step << "步:" << "猴子把箱子从" << s.box << "处移到" << s.banana << endl;
		s.monkey = s.banana;
		s.box = s.banana;
		return true;
	}
	return false;
}
bool climb_box(struct state& s)
{
	//猴子把箱子搬到香蕉下就可以爬上箱子
	if (s.monkey == s.banana && s.box == s.banana && s.on == 0)
	{
		s.on = 1;
		step++;
		cout << "第" << step << "步:"<< "猴子在" << s.monkey << "处爬上箱子" << endl;
		return true;
	}
	return false;
}
bool get_banana(struct state& s)
{
	//猴子爬上箱子就可摘香蕉了
	if (s.monkey == s.banana && s.box == s.banana && s.on == 1)
	{
		s.have = 1;
		step++;
		cout << "第" << step << "步:" << "猴子摘得香蕉!" << endl;
		return true;
	}
	return false;
}
void pick(struct state& s)
{
	//逆向思考:如果猴子已经摘得香蕉就退出
	if (get_banana(s) == true)
	{
		return;
	}
	if (climb_box(s) == true)
	{
		get_banana(s);
		return;
	}
	if (move_box(s) == true)
	{
		climb_box(s);
		get_banana(s);
		return;
	}
	if (go_to_box(s) == true)
	{
		move_box(s);
		climb_box(s);
		get_banana(s);
		return;
	}

}
int main()
{
	char monkey, banana, box;
	struct state s;

	cout << "用a,b,c表示猴子、香蕉、箱子的位置,中间用空格隔开" << endl;
	cin >> monkey >> banana >> box;
	cout << endl;
	cout << "猴子摘香蕉的过程如下:" << endl;

	//初始化 
	s.monkey = monkey;
	s.banana = banana;
	s.box = box;
	s.have = 0;
	s.on = 0;

	//摘香蕉过程 
	pick(s);

	system("pause");
	return 0;

}

文章参考自:https://blog.csdn.net/weixin_43979090/article/details/108768141

你可能感兴趣的:(人工智能基础,人工智能)