大连理工大学《人工智能》大作业离线作业答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
学习中心:邢台技师学院
专业:计算机科学与技术
年级: 18年春季
学号: 180024407167
学生:邢亚辉
题目:农夫过河
1.谈谈你对本课程学习过程中的心得体会与建议?
通过这门课程的学习,我对人工智能有了一些简单的感性认识,我知道了人工智能从诞生,发展到今天经历一个漫长的过程,许多人为此做出了不懈的努力。我觉得这门课真的是一门富有挑战性的科学,而从事这项工作的人不仅要懂得计算机知识,还必须懂得心理学和哲学。
2.《人工智能》课程设计,从以下5个题目中任选其一作答。
《人工智能》课程设计
注意:从以下5个题目中任选其一作答。
总则:不限制编程语言,提交word文档
题目二:农夫过河
要求:(1)撰写一份word文档,里面包括(人工智能的具体应用、空间状态图)章节。
(2)选择一个领域,就人工智能的应用进行论述,至少
500字。
(3)有一个农夫带一只狐狸、一只小羊和一篮菜过河。假
设农夫每次只能带一样东西过河,考虑安全,无农夫看管时,
狐狸和小羊不能在一起,小羊和菜篮不能在一起。试设计求解该问题的状态空间,并画出状态空间图。
问题描述:
一农夫带着一头狼,一只羊和一个白菜过河,小船只能一次装载农夫和一样货物,狼会吃羊,羊会吃白菜,只有农夫在时才安全。现欲让所有物品包括农夫都安全过道河对岸,求最佳算法。
解法如下:
1.农夫带羊过去,自己回来
2.农夫带狼过去,带羊回来
3.农夫带白菜过去,自己回来
4.农夫带羊过去
全部安全过岸.
深度优先搜索方法:首先扩展最新产生的结点,每层只对一个结点进行扩展,除非搜索失败或以达到预先约定的最大深度,才会退回去搜索原来来忽略的结点。
广度优先搜索方法:以接近起始结点的程度依次扩展结点,即对下一层结点搜索前,必须先搜索完本层所有结点。
深度优先(栈)源代码:
#include
using namespace std;
#define VertexNum 16 //最大顶点数
typedef struct // 图的顶点
{
int farmer; // 农夫
int wolf; // 狼
int sheep; // 羊
int veget; // 白菜
}Vertex;
typedef struct
{
int vertexNum; // 图的当前顶点数
Vertex vertex[VertexNum]; // 顶点向量(代表顶点)bool Edge[VertexNum][VertexNum]; // 邻接矩阵. 用于存储图中的边,其矩阵元素个数取决于顶点个数,与边数无关
}AdjGraph; // 定义图的邻接矩阵存储结构
bool visited[VertexNum] = {false}; // 对已访问的顶点进行标记(图的遍历)
int retPath[VertexNum] = {-1}; // 保存DFS搜索到的路径,即与某顶点到下一顶点的路径
// 查找顶点(F,W,S,V)在顶点向量中的位置
int locate(AdjGraph *graph, int farmer, int wolf, int sheep, int veget)
{
// 从0开始查找
for (int i = 0; i < graph->vertexNum; i++) {
if ( graph->vertex[i].farmer == farmer && graph->vertex[i].wolf == wolf
&& graph->vertex[i].sheep == sheep && graph->vertex[i].veget == veget )
{
return i; //返回当前位置
}
return -1; //没有找到此顶点
}
// 判断目前的(F,W,S,V)是否安全
bool isSafe(int farmer, int wolf, int sheep, int veget)
{
//当农夫与羊不在一起时,狼与羊或羊与白菜在一起是不安全的
if ( farmer != sheep && (wolf == sheep || sheep == veget) )
{
return false;
}
else
{
return true; // 安全返回true
}
// 判断状态i与状态j之间是否可转换
bool isConnect(AdjGraph *graph, int i, int j)
{
int k = 0;
if (graph->vertex[i].wolf != graph->vertex[j].wolf) {
k++;
}
if (graph->vertex[i].sheep != graph->vertex[j].sheep)
{
k++;
}
if (graph->vertex[i].veget != graph->vertex[j].veget)
{
k++;
}
// 以上三个条件不同时满足两个且农夫状态改变时,返回真, 也即农夫每次只能带一件东西过桥
if (graph->vertex[i].farmer != graph->vertex[j].farmer && k <= 1)
{
return true;
}
else
{
return false;
}
}
// 创建连接图
void CreateG(AdjGraph *graph)
{
int i = 0;
int j = 0;