收藏 分享(赏)

AI实验讲义.doc

上传人:hwpkd79526 文档编号:8089587 上传时间:2019-06-08 格式:DOC 页数:44 大小:317KB
下载 相关 举报
AI实验讲义.doc_第1页
第1页 / 共44页
AI实验讲义.doc_第2页
第2页 / 共44页
AI实验讲义.doc_第3页
第3页 / 共44页
AI实验讲义.doc_第4页
第4页 / 共44页
AI实验讲义.doc_第5页
第5页 / 共44页
点击查看更多>>
资源描述

1、 人工智能实验指导书江南大学信息工程学院二 00 九年五月2目 录一、实验目标 1二、实验要求 1三、实验项目一览表 1四、实验内容 23一、实验目标:通过本实验,使得学生能够对人工智能的开发工具、人工智能中的搜索策略、推理机制、专家系统和神经网络的工作原理有所了解。二、实验要求:1利用 Windows 平台进行程序设计。2利用一种编程语言(C/C+/Matlab/VB)进行编程实现。三、实验项目一览表实验要求 实验类型序号 实验项目名称实验学时实验内容及目的 必修选修其它验证性设计性综合性备注1 了解熟悉开发环境和工具 2 了解 WINDOWS 平台及 PROLOG语言。 2 了解搜索策略

2、3 通过算法实现搜索策略 3 了解推理机工作原理 3 通过算法实现正、反向推理 4 BP 网学习算法 2 通过算法实现 BP 网机器学习 5 模糊推理 任选6 模糊神经网络 任选4四、实验内容1实验一:利用 Windows 平台进行程序设计Turbo-prolog 操作规程(1).进入 Turbo-prolog 环境:在 DOS 的根目录下,用 CD PROLOG 命令进入 PROLOG 子目录,再调用prolog.exe程序即可。具体命令为:Ccd prologCprolog (2).prolog 全屏幕操作环境:Edit Window Dialogue WindowMessage Wind

3、ow Trace WindowEdit Window:显示、输入或修改程序。Dialog Window:显示程序运行结果。Message Window:显示命令执行情况等信息。Trace Window:显示一些程序的跟踪调试结果。prolog 的运行菜单如下:Run Compile Edit Options File Setup QuitMemory load colorsobj file save window-size (dialogue,edit,exe file directory message,trace)project print directories(pro director

4、yall modules copy obj,exe,turbo dire)rename miscellaneous settingsfilename IBMCGAAdaptor on/off modulelist AutoLoad message on/offzap file in editor erase Stack size 600-4000operation system load configurationsave configuration(3) 输入和修改、运行程序的过程:A 进行 prolog 环境B 用 File 下的 LOAD 命令调出程序(从磁盘至内存) ,调出的程序显示于

5、 EDIT窗口中。C 将光标移至 EDIT 菜单项下按回车键后,光标即进入 EDIT 窗口,此时就可移动光标至需要输入或修改的地方,输入或修改程序。D 修改好或输入完程序后,按 ESC 键,再将光标移动 RUN 菜单项下按回车键,5就可开始编译 EDIT 窗口中的程序,如发现无误则马上运行程序,如有误则回到 C步,重新修改程序,直到程序无误,输出运行结果为止。E 运行无误后,可选用 File 菜单项下的 Save 命令将程序保存到磁盘上,此时只要告诉机器所存盘文件的文件名及路经即可。F 一个程序运行完后,若要开始调试另一个程序,则需要选用 File 菜单项下的Erase Editor 命令将

6、Edit 窗口中的程序从内存中清除掉后,再用 Load 命令调入程序或用Edit 命令输入新的程序。(4). 将源程序编译成目标程序的过程:先选 Options 下的.obj 项,再用 compile 命令即可对 Edit 窗口中的源程序进行编译,编译无误就可生成一个目标文件(.obj 类型)存放在磁盘上。_(5) 将源程序编译成可执行文件(.exe)的过程:先选 Options 下的 Auto link to .exe 项,再用 compile 命令即可对 Edit 窗口中的源程序进行编译,编译无误就可生成一个目标文件(.obj 类型)存放在磁盘上,并马上将此目标文件链接成可执行文件(.ex

7、e 类型的) ,该可执行文件可在 DOS 提示符下直接被执行。利润留成:源程序 aa.pro 经编译后生成目标文件 aa.obj,再链接成可执行文件 aa.exe,然后再在 DOS提示符下(C或 D下)键入 aa即被执行。(6) 退出 Turbo-prolog 环境回到 DOS 环境:a. 真正推出 prolog 环境:选用 Quit 菜单项就可真正退出到 DOS 环境,再次进行prolog 环b. 非真正退出 prolog 环境:选用 File 菜单项下的 Operating system 命令就可真正退出到 DOS 提示符下,但 prolog 环境还保留在内存中,再次进行 prolog 环

8、镜就只要再打 exit命令。3. 一个完整的 Turbo-prolog 程序的运行过程:(1) 带有 goal 区域的 prolog 程序的运行过程:程序被执行时就马上转到 goal 区域,依次执行该区域中被安排的谓词,输出结果也有 write 谓词负责输送到显示器。例如:例 4 中的程序执行时转到目标区,先调 car(X,Y,_,_,_),得 X,Y 值,再判 YProlog 程序例子例 1: domainsperson,activity=symbolpredicateslikes(person,activity)likk(person,person,activity)6clauseslik

9、es(ellen,reading).likes(john,computer).likes(john,badminton).likes(leonard,badminton).likes(eric,swimming).likes(eric,reading).Likk(X1,X2,Y):-likes(X1,Y),likes(X2,Y),X1X,retract(leftbank(Y),sail(Y,right),assert(rightbank(Y),!.move(X):-retract(leftbank(X),sail(X,right),assert(rightbank(X)./*see if mo

10、ve is a legal combination */legal:-leftbank(fox),leftbank(grain).legal:-rightbank(grain),rightbank(fox).9river:- /* draw a river */line(5000,12000,25000,12000,2),line(5000,18000,25000,18000,2)./* setup for the crossings */sail(fox,left):-transportleft(fox,9,25,5).sail(chicken,left):-transportleft(ch

11、icken,12,25,5).sail(grain,left):-transportleft(grain,15,25,3).sail(fox,right):-transportright(fox,9,5,25).sail(chicken,right):-transportright(chicken,12,5,25).sail(grain,right):-transportright(grain,15,5,25)./* animate the crossing going left */transportleft(T,X1,Y1,Y2):-Y1=Y2,cursor(X1,Y1),write(“

12、“),cursor(X1,Y1),write(T),cursor(6,Y1),write(“ “),cursor(6,Y1),write(“farmer“),assert(fposition(left),!.transportleft(T,X1,Y1,Y2):-cursor(X1,Y1),write(“ “),cursor(X1,Y1),write(T),cursor(6,Y1),write(“ “),cursor(6,Y1),write(“farmer“),Z=Y1-1,river,transportleft(T,X1,Z,Y2)./* animate the crossing going

13、right */transportright(T,X1,Y1,Y2):-Y1=Y2,Temp=Y1-1,cursor(X1,Temp),write(“ “),cursor(X1,Y1),write(T),cursor(6,Y1),write(“farmer“),retract(fposition(left),!.transportright(T,X1,Y1,Y2):-Temp=Y1-1,cursor(X1,Temp),write(“ “),cursor(X1,Y1),write(T),cursor(6,Temp),write(“ “),cursor(6,Temp),write(“farmer“

14、),Z=Y1+1,river,transportright(T,X1,Z,Y2)./* initial state */setup:-graphics(1,1,0),river,cursor(6,25),write(“farmer“),cursor(9,25),write(“fox“),cursor(12,25),write(“chicken“),cursor(15,25),write(“grain“),cursor(0,4),write(“Farmer,Fox,Chicken,and Grain“)./* does the farmer need to be moved? */checkfa

15、rmer:-not(fposition(left).checkfarmer:-movefarmer(5).movefarmer(Y):-Y=25,cursor(6,24),write(“ “),cursor(6,25),write(“farmer“),retract(fposition(left),river,!.movefarmer(Y):-Temp=Y-1,cursor(6,Temp),write(“ “),cursor(6,Y),write(“farmer“),Z=Y+1,river,movefafrmer(Z).(2)危险路经问题:entry hell mermaidfountain

16、robbersfood10domainsroom=symbolroomlist=room*predicatesgallery(room,room)neighborroom(room,room)avoid(roomlist)go(room,room)route(room,room,roomlist)member(room,roomlist)clausesgallery(entry,monsters). gallery(entry,fountain).gallery(fountain,hell). gallery(fountain,food).gallery(exit,gold_treasure)

17、. gallery(fountain,mermaid).gallery(robbers,gold_treasure). gallery(fountain,robbers).gallery(monsters,gold_treasure).neighborroom(X,Y):-gallery(X,Y).neighborroom(X,Y):-gallery(Y,X).avoid(monstres,robbers).go(Here,There):-route(Here,There,Here).go(_,_).route(Room,Room,Visitedrooms):-member(gold_trea

18、sure,Visitedrooms),write(Vistedrooms),nl.route(Room,Way_out,Visitedrooms):-neighborroom(Room,Nextroom),avoid(DangerousRoom),not(member(Nextroom,DangerousRoom),not(member(Nextroom,Visitedrooms),route(Nextroom,Way_out,Nextroom|Visitedrooms).member(X,X|_).member(X,_|Y):-member(X,Y).(3)N 皇后问题:在 N 皇后问题中,

19、其目标是在棋盘上放置 N 个皇后,而他们彼此不被攻击。所以,任何两皇后都不能放在同一行、同一列或同一对角线上。两种类型的对角线:Type1:Diagonal=N+column-RowType2:Diagonal=Row+Column-1程序为:domainsi=integerqueen =q(i,i)queens =queen*freelist=i*monsters Gold treasure exit11board=board(queens,freelist,freelist,freelist,freelist)predicatesplacen(i,board,board)place_a_q

20、ueen(i,board,board)nqueens(i)makelist(i,freelist,freelist)findandremove(I,freelist,freelist)clausesnqueens(N):-makelist(N,L),Diagonal=N*2-1,makelist(Diagonal,LL),placen(N,board(,L,L,LL,LL),Final),write(Final).placen(_,board(D,.D1,D2),board(D,D1,D2):-!.placen(N,Board1,Result):-place_a_queen(N,Board1,

21、Board2),placen(N,Board2,Result).place_a_queen(N,board(Queens,Rows,Columns,Digal1,Diagal2),board(q(R,C)|Queens,NewR,NewC,NewD1,NewD2):-Rows=R|NewR,findandremove(C,Columns,NewC),D1=N+C-R,findandremove(D1,Digal1,NewD1),D2=R+C-1,findandremove(D2,Digal2,NewD2).findandremove(X,X|Rest,Rest).findandremove(X

22、,Y|Rest,Y|Tail):-findandremove(X,Rest,Tail).makelist(1,1).makelist(N,N|Rest):-N1=N-1,makelist(N1,Rest).123实验三:BP 网学习算法实验内容:通过程序了解正、反向推理的工作原理。实验说明:(1)规则演绎系统:基于规则“if 前提 then 结论”的问题求解系统叫做规则演绎系统。(2)正向推理(FORWARD CHAINING):从事实或状况向目标或动作操作的推理。既先将某个事实作为规则中的前提,推理出一个结论,再将这个结论作为下一个新规则的前提,再利用这个新规则推理出第二个结论来,再将第二个

23、结论作为第三个规则的前提推理出第三个结论来, 。 。 。 。 。 。 ,以此类推,直到最后推出最终结论。(3)反向推理(BACKWARD CHAINING):从目标或动作向事实或状况进行操作的推理。即先假设某个结论成立,再逆向推理出这个结论成立时应该满足的前提,再测试实际的事实是否满足这些前提,如满足则假设成立,否则假设不成立。(4)双向推理 (DOUBLE-SIDES CHAINING):正向和反向推理同时进行,在某个地方拟合(相遇) 。双向推理仅当使用正、反向推理求不出解或求出的解的精确度不高时采用。实验程序:例 1:正向推理程序示例。/*/* 汽车故障诊断专家系统 AUTO-FWFDES

24、 */* 文件名 FWFDES.PRO */* 采用正向推理方法 */* 本程序具有诊断和解释功能,用 TURBO-PROLOG 编写 */*/domainsn=integerdiag_list=n*ss,fault=stringdatabasexpositive(ss,ss)xnegative(ss,ss)predicatesdiagnose_is(n,fault)explain(n)startshow_menupositive(ss,ss,n)negative(ss,ss)ask(ss,ss,n)remember(ss,ss,n)process(n)clear_facts13explain

25、_list(diag_list)append_list(diag_list,diag_list,diag_list)diag_list(n,ss)goalstart.clausesstart:-makewindow(1,30,-4,“汽车故障诊断专家系统“,0,0,25,80),nl,nl,nl,nl,write(“ 欢迎进入本专家系统,本系统能“),nl,write(“ 采用正向推理方法进行故障诊断“),nl,write(“ 在进行诊断询问时,请用 1 表示肯“),nl,write(“ 定的回答,用 0 表示否定的回答“),nl,write(“ 用 2 表示询问为什么要输入“),nl,wri

26、te(“ *按任意键开始:“),nl,readchar(_),show_menu.show_menu:-clearwindow,nl,nl,nl,write(“ *“),nl,write(“ 请选择系统功能 “),nl,write(“ - “),nl,write(“ 1 故障诊断 “),nl,write(“ 2 退出系统 “),nl,write(“ *“),nl,nl,write(“ 请选择 1,2. “),readint(Choice),Choice0,Choice2,!,remember(X,Y,Reply).ask(X,Y,N):-diag_list(N,Fault),write(“你的

27、车可能有故障-“,Fault),nl,write(“而是否存在征兆-“,Y),write(“直接关系到是否具有故障-“,Fault),nl,write(“因而必须回答,是否有此征兆 1/0?响应:“),readint(Reply),remember(X,Y,Reply).append_list(,L,L).append_list(N1|L2,L3,N1|L4):-APPEND_LIST(L2,L3,L4)./* 正向推理机 */positive(X,Y,_):-xpositive(X,Y),!.positive(X,Y,M):-not(negative(X,Y),!,ask(X,Y,M).ne

28、gative(X,Y):-xnegative(X,Y),!.remember(X,Y,1):-asserta(xpositive(X,Y).remember(X,Y,0):-asserta(xnegative(X,Y),fail.14clear_facts:-retract(xpositive(_,_),fail.clear_facts:-retract(xnegative(_,_),fail./* 简易正向推理汽车故障诊断专家系统知识库及解释内容 */diagnose_is(1,“电池没电“):-diagnose_is(9,“电气系统故障“),not(positive(has,“发动机转动“

29、,1),positive(has,“电池接线正常“,1),append_list(9,1,L),explain_list(L).diagnose_is(2,“电池接线故障“):-diagnose_is(9,“电气系统故障“),not(positive(has,“电池接线正常“,2),append_list(9,2,L),explain_list(L).diagnose_is(3,“油箱没油“):-diagnose_is(10,“供油系统故障“),not(positive(has,“油箱中油量正常“,3),append_list(10,3,L),explain_list(L).diagnose_

30、is(4,“汽油油路故障“):-diagnose_is(10,“供油系统故障“),not(positive(has,“汽油泵入口处有汽油“,4),positive(has,“油箱中油量正常“,4),append_list(10,4,L),explain_list(L).diagnose_is(5,“汽化器故障“):-diagnose_is(10,“供油系统故障“),not(positive(has,“汽油泵入口处有汽油“,6),positive(has,“ 速运转时熄灭“,6),append_list(10,6,L),explain_list(L).diagnose_is(7,“点火线路故障“

31、):-diagnose_is(11,“点火系统故障“),positive(has,“火花塞正常“,7),positive(has,“发动机运转不平稳“,7),append_list(11,7,L),explain_list(L).diagnose_is(8,“火花塞故障“):-diagnose_is(11,“点火系统故障“),not(positive(has,“火花塞正常“,8),append_list(11,8,L),explain_list(L).diagnose_is(9,“电气系统故障“):-not(positive(has,“仪表盘亮“,9),not(positive(has,“照明

32、灯亮“,9).diagnose_is(10,“供油系统故障“):-positive(has,“仪表盘亮“,10),positive(has,“发动机转动“,10),positive(has,“点火火花正常“,10),positive(has,“不来油或油路不畅“,10).diagnose_is(11,“点火系统故障“):-positive(has,“仪表盘亮“,11),positive(has,“发动机转动“,11),positive(has,“油箱中油量正常“,11),not(positive(has,“点火火花正常“,11).explain(1):-nl,write(“因为你的车存在电气系

33、统故障,“),nl,write(“且发动机不转动,“),nl,write(“且电池接线正常“),nl,write(“因此,根据规则 1 得出:你的车上的电池没电.“),nl.explain(2):-nl,write(“因为你的车存在电气系统故障,“),nl,write(“且电池接线不正常“),nl,write(“因此,根据规则 2 得出:你的车的电池接线存在问题.“),nl.explain(3):-nl,write(“因为你的车存在供油系统故障,“),nl,write(“且油箱中油量不正常,“),nl,write(“因此,根据规则 3 得出:你的车上的油箱中没油.“),nl.explain(4

34、):-nl,write(“因为你的车存在供油系统故障,“),nl,write(“且汽油泵入口处没有汽油,“),nl,write(“且油箱中油量正常,“),nl,15write(“因此,根据规则 4 得出:你的车上的汽油油路存在问题.“),nl.explain(5):-nl,write(“因为你的车存在供油系统故障,“),nl,write(“且汽油泵入口处有汽油,“),nl,write(“且汽油泵出口处没有汽油,“),nl,write(“因此,根据规则 5 得出:你的车上的汽油泵存在问题.“),nl.explain(6):-nl,write(“因为你的车存在供油系统故障,“),nl,write(

35、“且汽油泵入口处有汽油,“),nl,write(“且怠速运转时熄灭,“),nl,write(“因此,根据规则 6 得出:你的车的毛病是汽化器故障.“),nl.explain(7):-nl,write(“因为你的车存在点火系统故障,“),nl,write(“且火花塞正常,“),nl,write(“且发动机运转不平稳,“),nl,write(“因此,根据规则 7 得出:你的车的点火线路有问题.“),nl.explain(8):-nl,write(“因为你的车存在点火系统故障,“),nl,write(“且火花塞不正常,“),nl,write(“因此,根据规则 8 得出:你的车的火花塞有问题.“),n

36、l.explain(9):-nl,write(“因为你的车仪表盘不亮,“),nl,write(“且照明灯不亮,“),nl,write(“因此,根据规则 9 得出:你的车有电气系统故障.“),nl.explain(10):-nl,write(“因为你的车仪表盘不亮,“),nl,write(“且发动机转动,“),nl,write(“且火花火花正常,“),nl,write(“且不来油或油不畅“),nl,write(“因此,根据规则 10 得出:你的车有供油系统故障.“),nl.explain(11):-nl,write(“因为你的车仪表盘不亮,“),nl,write(“且发动机转动,“),nl,wr

37、ite(“且火花火花不正常,“),nl,write(“且点火火花不正常“),nl,write(“因此,根据规则 11 得出:你的车有点火系统故障.“),nl.diag_list(1,“电池没电“).diag_list(2,“电池接线故障“).diag_list(3,“油箱没油“).diag_list(4,“汽油油路故障“).diag_list(5,“汽油泵故障“).diag_list(6,“汽化器故障“).diag_list(7,“点火电极故障“).diag_list(8,“火花塞故障“).diag_list(9,“电气系统故障“).diag_list(10,“供油系统故障“).diag_li

38、st(11,“点火系统故障“).例 2:反向推理程序示例。/*/* 汽车故障诊断专家系统 AUTO-FWFDES */* 文件名 BWFDES.PRO */* 采用反向推理方法 */16/* 本程序具有诊断和维护知识库功能 */* 用 TURBO-PROLOG 编写 */*/domainsn=integerss=stringstr_list=ss*conditions=n*databaserule(n,ss,ss,conditions)symptom(n,ss)topic(ss)yes(n)no(n)diag_list(n,ss)predicatesrepeatstartshow_menudo

39、_diagnosingshow_menu1show_menu2process(n)process1(n)display1display2display3verify(n)prove(conditions)prove1(n)do_answer(n,n)clear_factsconvers(ss,str_list)convert(str_list,conditions)ask(n,ss)goalstart.clausesrepeat.repeat:-repeat.start:-makewindow(1,30,-4,“汽车故障诊断专家系统“,0,0,25,80),nl,nl,nl,nl,write(

40、“ 欢迎进入本专家系统,本系统能“),nl,write(“ 采用正向推理方法进行故障诊断“),nl,17write(“ 并能进行知识库维护“),nl,write(“ 在进行诊断询问时,请用 1 表示肯“),nl,write(“ 定的回答,用 0 表示否定的回答“),nl,write(“ 用 2 表示询问为什么要输入“),nl,write(“ *按任意键开始:“),nl,readchar(_),show_menu.show_menu:-repeat,clear_facts,clearwindow,nl,nl,nl,write(“ *“),nl,write(“ 请选择系统功能 “),nl,writ

41、e(“ - “),nl,write(“ 1 故障诊断 “),nl,write(“ 2 知识库维护 “),nl,write(“ 3 退出系统 “),nl,write(“ *“),nl,nl,write(“ 请选择 1,2,3. “),readint(Choice),Choice0,Choice实验内容:通过程序实现 BP 网络机器学习算法。BP 算法框图如下:BP 算法参考程序(C 语言版):/ BpNet.cpp : implementation file/人工神经网络 BP 算法/1、动态改变学习速率/2、加入动量项/3、运用了 Matcom4.5 的矩阵运算库(可免费下载,头文件 matl

42、ib.h),开始设置权值和阚初始值给定输入向量和目标输出向量选取比率参数求隐层和输出层各单元输出求期望输出与实际输出误差停止计算权值梯度权值学习修正Yes误差是否满足要求20/ 方便矩阵运算,当然,也可自己写矩阵类/4、可暂停运算/5、可将网络以文件的形式保存、恢复#include “BpNet.h“#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CBpNetIMPLEMENT_SERIAL( CBpNet, CObject, 1 )CBpNet:CBpNet()i

43、nitM(MATCOM_VERSION);/启用矩阵运算库CBpNet:CBpNet()exitM();delete this;/ CBpNet message handlers/创建新网络void CBpNet:Create(Mm mInputData, Mm mTarget, int iInput, int iHidden, int iOutput) int i,j;mSampleInput=zeros(mInput.rows(),mInput.cols();mSampleTarget=zeros(mTarget.rows(),mTarget.cols(); mSampleInput=mI

44、nputData;mSampleTarget=mTarget;this-iInput=iInput;this-iHidden=iHidden;this-iOutput=iOutput;/创建计算用的单个样本矩阵mInput=zeros(1,this-iInput);mHidden=zeros(1,this-iHidden);mOutput=zeros(1,this-iOutput);/创建权重矩阵,并赋初值mWeighti=zeros(this-iInput,this-iHidden);mWeighto=zeros(this-iHidden,this-iOutput); /赋初值21for(i

45、=1;iiInput;i+)for(j=1;jiHidden;j+)mWeighti.r(i,j)=randab(-1.0,1.0);for(i=1;iiHidden;i+)for(j=1;jiOutput;j+)mWeighto.r(i,j)=randab(-1.0,1.0);/创建阙值矩阵,并赋值mThresholdi=zeros(1,this-iHidden);for(i=1;iiHidden;i+)mThresholdi.r(i)=randab(-1.0,1.0);mThresholdo=zeros(1,this-iOutput);for(i=1;iiOutput;i+)mThresholdo.r(i)=randab(-1.0,1.0);/创建权重变化矩阵mChangei=zeros(this-iInput,this-iHidden);mChangeo=zeros(this-iHid

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报