大连理工大学《人工智能》大作业离线作业答案

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档