人工智能实验报告.docx
《人工智能实验报告.docx》由会员分享,可在线阅读,更多相关《人工智能实验报告.docx(27页珍藏版)》请在三一办公上搜索。
1、江苏科技大学实验报告(2012/2013学年第2学期) 课程名称: 人工智能 学生姓名: 陈嘉生 学生学号: 1040501211 院 系: 数理学院 专 业: 信息与计算科学 2013年 5 月 18 日实验一:知识表示方法一、实验目的状态空间表示法是人工智能领域最基本的知识表示方法之一,也是进一步学习状态空间搜索策略的基础,本实验通过牧师与野人渡河的问题,强化学生对知识表示的了解和应用,为人工智能后续环节的课程奠定基础。二、问题描述有n个牧师和n个野人准备渡河,但只有一条能容纳c个人的小船,为了防止野人侵犯牧师,要求无论在何处,牧师的人数不得少于野人的人数(除非牧师人数为0),且假定野人与
2、牧师都会划船,试设计一个算法,确定他们能否渡过河去,若能,则给出小船来回次数最少的最佳方案。三、基本要求输入:牧师人数(即野人人数):n;小船一次最多载人量:c。输出:若问题无解,则显示Failed,否则,显示Successed输出一组最佳方案。用三元组(X1, X2, X3)表示渡河过程中的状态。并用箭头连接相邻状态以表示迁移过程:初始状态-中间状态-目标状态。例:当输入n=2,c=2时,输出:221-110-211-010-021-000其中:X1表示起始岸上的牧师人数;X2表示起始岸上的野人人数;X3表示小船现在位置(1表示起始岸,0表示目的岸)。要求:写出算法的设计思想和源程序,并以图
3、形用户界面实现人机交互,进行输入和输出结果,如:Please input n: 2 Please input c: 2Successed or Failed?: SuccessedOptimal Procedure: 221-110-211-010-021-000四、实验组织运行要求本实验采用集中授课形式,每个同学独立完成上述实验要求。五、实验条件每人一台计算机独立完成实验。六、实验代码Main.cpp#include #include RiverCrossing.husing namespace std;/主函数void main()RiverCrossing:ShowInfo();int
4、n, c;coutn;coutc;RiverCrossing riverCrossing(n, c);riverCrossing.solve();system(pause);RiverCrossing.h#pragma once#include /船class Boatpublic:static int c;int pastor;/牧师int savage;/野人Boat(int pastor, int savage);/河岸状态class Statepublic:static int n;int iPastor;/牧师数量int iSavage;/野人数量int iBoatAtSide;/船
5、所在河岸State *pPrevious;/前一个状态State(int pastor, int savage, int boatAtSide);int getTotalCount();/获得此岸总人数bool check();/检查人数是否符合实际bool isSafe();/检查是否安全State operator + (Boat &boat);State operator - (Boat &boat);bool operator = (State &state);/过河问题class RiverCrossingprivate:std:list openList, closeList;St
6、ate endState;bool move(State *nowState, Boat *boat);/进行一次决策State* findInList(std:list &listToCheck, State &state);/检查某状态节点是否在列表中void print(State *endState);/打印结果public:static void ShowInfo();RiverCrossing(int n, int c);bool solve();/求解问题;RiverCrossing.cpp#include RiverCrossing.h#include #include #in
7、clude using namespace std;/类静态变量定义int State:n = 0;int Boat:c = 0;/*=Methods for class Boat=*/Boat:Boat(int pastor, int savage)this-pastor = pastor;this-savage = savage;/*=Methods for class State=*/构造函数State:State(int pastor, int savage, int boatAtSide)this-iPastor = pastor;this-iSavage = savage;this
8、-iBoatAtSide = boatAtSide;this-pPrevious = NULL;/获取此岸总人数int State:getTotalCount()return iPastor + iSavage;/检查人数是否在0到n之间bool State:check()return (iPastor =0 & iPastor = 0 & iSavage = x2/彼岸的安全:(n-x1) = 0 | (n-x1) = (n-x2)/将上述条件联立后得到如下条件return (iPastor = 0 | iPastor = n | iPastor = iSavage);/重载+符号,表示船开
9、到此岸State State:operator+(Boat &boat)State ret(iPastor + boat.pastor, iSavage + boat.savage, iBoatAtSide + 1);ret.pPrevious = this;return ret;/重载-符号,表示船从此岸开走State State:operator-(Boat &boat)State ret(iPastor - boat.pastor, iSavage - boat.savage, iBoatAtSide - 1);ret.pPrevious = this;return ret;/重载=符号
10、,比较两个节点是否是相同的状态bool State:operator=(State &state)return (this-iPastor = state.iPastor & this-iSavage = state.iSavage & this-iBoatAtSide = state.iBoatAtSide);/*=Methods for class RiverCrossing=*/显示信息void RiverCrossing:ShowInfo()cout*endl;cout 牧师与野人过河问题求解 endl;cout by 1040501211 陈嘉生 endl;cout*iBoatAtS
11、ide = 1) /船在此岸/过河的人越多越好,且野人优先int count = nowState-getTotalCount();count = (Boat:c = count ? count : Boat:c);for (int capticy = count; capticy = 1; -capticy) for (int i = 0; i iBoatAtSide = 0) /船在彼岸/把船开回来的人要最少,且牧师优先for (int capticy = 1; capticy = Boat:c; +capticy) for (int i = 0; i iBoatAtSide = 1) d
12、estState = new State(*nowState - *boat);/船离开此岸 else if (nowState-iBoatAtSide = 0) destState = new State(*nowState + *boat);/船开到此岸if (destState-check() /检查人数if (*destState = endState) /是否达到目标状态closeList.push_back(destState);print(destState);return true;/找到结果 else if (destState-isSafe() /检查是否安全if (!fi
13、ndInList(openList, *destState) & !findInList(closeList, *destState) /检查是否在表中/添加没出现过的状态节点到open表openList.push_back(destState);return false;delete destState;return false;/检查给定状态是否存在于列表中State* RiverCrossing:findInList(list &listToCheck, State &state)for (list:iterator ite = listToCheck.begin(); ite != l
14、istToCheck.end(); +ite) if (*ite = state)return *ite;return NULL;/根据达到的目标状态,回溯打印出求解过程void RiverCrossing:print(State *endState)cout=endl;if (!endState) coutSearch failed!endl; else coutSearch successed!endl;coutOptimal Procedure: endl;State *pState = endState;stack st;/用栈将链表逆序,以便输出while (pState) st.p
15、ush(pState);pState = pState-pPrevious;int count = 0;while (!st.empty() pState = st.top();st.pop();coutiPastor,iSavage,iBoatAtSide;if (st.size() 0)cout ;if (+count % 5 = 0)/每五个步骤换行coutendl;coutendl;coutTotal move: count - 1endl;cout=endl;七、实验结果实验二:九宫重排一、实验目的A*算法是人工智能领域最重要的启发式搜索算法之一,本实验通过九宫重排问题,强化学生对A
16、*算法的理解与应用,为人工智能后续环节的课程奠定基础。二、问题描述给定九宫格的初始状态,要求在有限步的操作内,使其转化为目标状态,且所得到的解是代价最小解(即移动的步数最少)。如:三、基本要求输入:九宫格的初始状态和目标状态输出:重排的过程,即途径的状态四、实验组织运行要求本实验采用集中授课形式,每个同学独立完成上述实验要求。五、实验条件每人一台计算机独立完成实验。六、实验代码Main.cpp#include #include NineGrid.husing namespace std;/主函数void main()NineGrid:ShowInfo();string start, end;c
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 人工智能 实验 报告
链接地址:https://www.31ppt.com/p-1666008.html