ImageVerifierCode 换一换
格式:DOCX , 页数:36 ,大小:190.48KB ,
资源ID:25391368      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/25391368.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(人工智能实验报告知识表示方法.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

人工智能实验报告知识表示方法.docx

1、人工智能实验报告知识表示方法江苏科技大学实验报告(2012/2013学年第2学期)课程名称: 人工智能 学生姓名: 学生学号: 院 系: 数理学院专 业: 信息与计算科学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#includeRiverCrossing.husingnamespace std;/主函数void main() RiverCrossing:ShowInfo(); int n, c;

4、 coutn; coutc; RiverCrossing riverCrossing(n, c); riverCrossing.solve(); system(pause);RiverCrossing.h#pragmaonce#include/船classBoatpublic: staticint c; int pastor;/牧师 int savage;/野人 Boat(int pastor, int savage);/河岸状态classStatepublic: staticint 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);/过河问题classRiverCrossingprivate: std:list openList, close

6、List; State endState; bool move(State *nowState, Boat *boat);/进行一次决策 State* findInList(std:list&listToCheck, State&state);/检查某状态节点是否在列表中 void print(State *endState);/打印结果public: staticvoid ShowInfo(); RiverCrossing(int n, int c); bool solve();/求解问题;RiverCrossing.cpp#includeRiverCrossing.h#include#in

7、clude#includeusingnamespace std;/类静态变量定义intState:n = 0;intBoat:c = 0;/*=Methods for class Boat=*/Boat:Boat(intpastor, intsavage) this-pastor = pastor; this-savage = savage;/*=Methods for class State=*/构造函数State:State(intpastor, intsavage, intboatAtSide) this-iPastor = pastor; this-iSavage = savage;

8、this-iBoatAtSide = boatAtSide; this-pPrevious = NULL;/获取此岸总人数intState:getTotalCount() return iPastor + iSavage;/检查人数是否在0到n之间boolState:check() return (iPastor =0 & iPastor = 0 & iSavage = x2 /彼岸的安全:(n-x1) = 0 | (n-x1) = (n-x2) /将上述条件联立后得到如下条件 return (iPastor = 0 | iPastor = n | iPastor = iSavage);/重载

9、+符号,表示船开到此岸StateState:operator+(Boat&boat) State ret(iPastor + boat.pastor, iSavage + boat.savage, iBoatAtSide + 1); ret.pPrevious = this; return ret;/重载-符号,表示船从此岸开走StateState:operator-(Boat&boat) State ret(iPastor - boat.pastor, iSavage - boat.savage, iBoatAtSide - 1); ret.pPrevious = this; return

10、ret;/重载=符号,比较两个节点是否是相同的状态boolState:operator=(State&state) return (this-iPastor = state.iPastor &this-iSavage = state.iSavage &this-iBoatAtSide = state.iBoatAtSide);/*=Methods for class RiverCrossing=*/显示信息voidRiverCrossing:ShowInfo() cout*endl; cout牧师与野人过河问题求解endl; cout by 1040501211 陈嘉生endl; cout*i

11、BoatAtSide = 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 iBoat

12、AtSide = 1) destState = newState(*nowState - *boat);/船离开此岸 elseif (nowState-iBoatAtSide = 0) destState = newState(*nowState + *boat);/船开到此岸 if (destState-check() /检查人数 if (*destState = endState) /是否达到目标状态 closeList.push_back(destState); print(destState); returntrue;/找到结果 elseif (destState-isSafe() /

13、检查是否安全 if (!findInList(openList, *destState) & !findInList(closeList, *destState) /检查是否在表中 /添加没出现过的状态节点到open表 openList.push_back(destState); returnfalse; delete destState; returnfalse;/检查给定状态是否存在于列表中State* RiverCrossing:findInList(list&listToCheck, State&state) for (list:iterator ite = listToCheck.b

14、egin(); ite != listToCheck.end(); +ite) if (*ite = state) return *ite; returnNULL;/根据达到的目标状态,回溯打印出求解过程voidRiverCrossing:print(State *endState) cout=endl; if (!endState) coutSearch failed!endl; else coutSearch successed!endl; coutOptimal Procedure: endl; State *pState = endState; stack st;/用栈将链表逆序,以便

15、输出 while (pState) st.push(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*算法是人工智能领

16、域最重要的启发式搜索算法之一,本实验通过九宫重排问题,强化学生对A*算法的理解与应用,为人工智能后续环节的课程奠定基础。二、问题描述给定九宫格的初始状态,要求在有限步的操作内,使其转化为目标状态,且所得到的解是代价最小解(即移动的步数最少)。如:三、基本要求输入:九宫格的初始状态和目标状态输出:重排的过程,即途径的状态四、实验组织运行要求本实验采用集中授课形式,每个同学独立完成上述实验要求。五、实验条件每人一台计算机独立完成实验。六、实验代码Main.cpp#include#includeNineGrid.husingnamespace std;/主函数void main() NineGrid

17、:ShowInfo(); string start, end; coutPlease input the initial state: (ex:134706582)start; coutPlease input the target state: (ex:123804765)end; NineGrid nineGrid(start, end); nineGrid.solve(); system(pause);NineGrid.h#pragmaonce#include#include#includeusingnamespace std;#defineSPACE0#defineAT(s, x, y

18、) (s)(x) * 3 + (y)enumMove UP = 0, DOWN = 1, LEFT = 2, RIGHT = 3;/九宫格状态classStatepublic: staticState *pEndState;/指向目标状态,用于评价h的值 string grid;/用字符串保存当前棋盘状态 int x, y;/空格所在位置 int moves;/到此状态的移动次数 int value;/价值 State *pPrevious;/前一个状态 State(string&grid, State *pPrevious = NULL); int getReversedCount();/获

19、取逆序数 void evaluate();/评价函数 bool check(Move move);/检查是否可以移动 State takeMove(Move move);/实施移动,生成子状态 /重载=运算符,判断两个状态是否相等 inlinebool operator = (State&state) return grid = state.grid; ;/九宫重排问题classNineGridprivate: vector openList, closeList; State startState, endState; clock_t startTime; bool compareRever

20、sed();/比较逆序数奇偶性是否相同 bool takeMove(State *nowState, Move move);/进行一次决策 State* findInList(vector&listToCheck, State&State);/检查某状态节点是否在列表中 void print(State *endState);/打印结果 /用于排序 staticbool greater_than(constState *state1, constState *state2);public: staticvoid ShowInfo();/显示信息 NineGrid(string&start, s

21、tring&dest); bool solve();/求解问题;NineGrid.cpp#includeNineGrid.h#include#include#includeusingnamespace std;State* State:pEndState = NULL;/*=Methods for class State=*/构造函数State:State(string&grid, State *pPrevious) this-grid = grid; this-pPrevious = pPrevious; if (this-pPrevious) this-moves = pPrevious-

22、moves + 1; else this-moves = 0; this-value = 0; evaluate(); for (int i = 0; i 3; +i) for(int j = 0; j 3; +j) if (AT(grid, i, j) = SPACE) x = i; y = j; return; boolState:check(Movemove) switch (move) caseUP: if (x - 1 = 3) returnfalse; break; caseLEFT: if (y - 1 = 3) returnfalse; break; returntrue;St

23、ateState:takeMove(Movemove) int destX, destY; switch (move) caseUP: destX = x - 1; destY = y; break; caseDOWN: destX = x + 1; destY = y; break; caseLEFT: destX = x; destY = y - 1; break; caseRIGHT: destX = x; destY = y + 1; break; string tGrid = grid; char t = AT(tGrid, destX, destY); AT(tGrid, destX, destY) = AT(tGrid, x, y); AT(tGrid, x, y) = t; returnState(tGrid, this);voidState:evaluate() if (!pEndState) ret

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1