人工智能 课程实验 专家系统 程序源代码.docx_第1页
人工智能 课程实验 专家系统 程序源代码.docx_第2页
人工智能 课程实验 专家系统 程序源代码.docx_第3页
人工智能 课程实验 专家系统 程序源代码.docx_第4页
人工智能 课程实验 专家系统 程序源代码.docx_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

游戏人物识别专家系统 邢洪伟一 试验题目游戏人物识别专家系统二、试验内容游戏人物识别专家系统是流行的专家系统实验模型,主要基于暴风公司出品的经典角色类游戏暗黑破坏神2。它用产生式规则来表示知识,共15条规则、可以识别八种游戏人物,这些规则既少又简单,可以改造他们,也可以加进新的规则,还可以用来识别其他东西的新规则来取代这些规则。游戏人物识别15条规则的中文表示是:规则1:如果:暴风公司出品的单机角色类游戏则 :该游戏是暗黑破坏神规则2: 如果:暴风公司出品的单机对抗类游戏 则 :该游戏是魔兽争霸规则3: 如果:暴风公司出品的网络游戏 则 :该游戏是魔兽世界规则4: 如果:网易游戏出品的网络游戏 则 :该游戏是梦幻西游规则5: 如果:暗黑破坏神版本1 则 :该游戏是暗黑破坏神1规则6: 如果:是暗黑破坏神2 则 :该游戏是暗黑破坏神2规则7: 如果:是暗黑破坏神3 则 :该游戏是暗黑破坏神3规则8: 如果:暗黑破坏神版本2单手武器使用木棒的男性人物 则 :该人物是德鲁伊规则9: 如果:暗黑破坏神2单手武器使用手杖的男性人物 则 :该人物是亡灵法师规则10: 如果:暗黑破坏神版本2单手武器使用法杖的女性人物 则 :该人物是巫师规则11: 如果:暗黑破坏神版本2双手武器使用长剑和盾牌的男性人物 则 :该人物是圣骑士规则12: 如果:暗黑破坏神版本2单手武器使用斧头的男性人物 则 :该人物是野蛮人规则13: 如果:暗黑破坏神版本2单手武器使用爪子的男性人物 则 :该人物是刺客规则14: 如果:暗黑破坏神2单手武器使用长剑的女性人物 则 :该人物是亚马逊规则15: 如果:梦幻西游单手使用鞭子的女性人物 则 :该人物是飞燕女 游戏人物识别专家系统由15条规则组成,可以识别八种动物,在15条规则中,共出现 37个概念(也称作事实),共37个事实,每个事实给一个编号,从编号从1到37,在规则对象中我们不存储事实概念,只有该事实的编号,同样规则的结论也是事实概念的编号,事实与规则的数据以常量表示,其结构如下:Char *str=暴风公司出品 ,网易游戏出品,单机游戏,网络游戏,角色类游戏,对抗类游戏,版本1,版本2,版本3,男性,女性, 暗黑破坏神,梦幻西游,暗黑破坏神1,暗黑破坏神2,暗黑破坏神3,单身武器,双手武器,使用木棒,是用手杖,使用法杖,使用长剑,使用盾牌,使用斧头,使用爪子,使用鞭子,巫师,德鲁伊,亡灵法师,法师,圣骑士,野蛮人,刺客,亚马逊,飞燕女,魔兽争霸,魔兽世界,0程序用编号序列的方式表达了产生式规则,如资料中规则15,如果动物是鸟,且善飞,则该动物是信天翁。相应的规则数组第八条是26,17,13,11,0,0,第26个是“使用鞭子”,如果事实成立,询问使用者下一个事实,第17个“单手武器”,如果也成立,询问使用者下一个事实,第13个是“梦幻西游”则,如果事实成立,询问使用者下一个事实,第11个是“女性”,如果事实成立,查找结论断言编号数组28,29,30,31,32,33,34,35,14,15,16,13,12,36,37中第八个“35”,这里35对应事实数组中的“飞燕女”。上述就是程序的推理过程,也是程序中的重点,该部分是由规则类(类rule)中的Query方法实现。三、流程图及分析 主程序的流程主要是:1、实例化各个类2、初始化事实集3、初始化规则集4、使用规则对事实进行推导规则类:规则名只是用来表示规则的一个名称,前提链由前提类生成的单链表,结论则是存放结论断言编号,表示由该规则的到的结论在事实数组中的编号。事件类:事实号和规则数据和结论断言数据的数字相对应。激活标志表示这个时候有没有被处理过。断言这保存推理后的结论,在重复查询这个事实条件时不用反复询问用户。四、关键代码int rule:Query()int i;char c;int Tag=0;list *L;fact *F;F=Fact;L=Pre;if(L=NULL)coutGetNumber()=F-GetNumber()break;F=F-Next; /查找与规则前提链中前提号相同的事实if(L-GetNumber()0)if(F-GetSucc()=true) L=L-Next;continue;if(F-GetSucc()=false) return false; /如果事实的断言为真则判断下一个前提,为假,则表示该规则不适合elseif(F-GetSucc()=true) return false;if(F-GetSucc()=false) L=L-Next;continue;coutendlGetName()GetNumber()0)F-PutAct(1,true); /设置事实的断言和激活标志if(L-GetNumber()PutAct(1,true);Tag=-1;return false;elseif(L-GetNumber()PutAct(-1,false);elseF-PutAct(-1,false);Tag=-1;return false;L=L-Next;F=Fact;for(;)if(Conc=F-GetNumber() break; /查找结论断言对应的事实F=F-Next;if(ConcPutAct(1,true);return false;if(Tag!=-1)F=Fact;for(;)if(Conc=F-GetNumber() break;F=F-Next;if(ConcPutAct(1,true);return false;coutnThis animal isGetName();return true;return false;五 试验结论通过这次试验和一些辅助书籍的阅读,加强了自己的阅读程序能力和编程的能力,而且游戏人物识别专家系统,它用产生式规则来表示知识,可以改造他们,也可以加进新的规则,还可以用来识别其他东西的新规则来取代这些规则,运用到其它方面去。总之,这次试验让我受益匪浅。附件:完整的源代码#include #include #include #include #define True 1#define False 0#define DontKnow -1Char *str=暴风公司出品 ,网易游戏出品,单机游戏,网络游戏,角色类游戏,对抗类游戏,版本1,版本2,版本3,男性,女性, 暗黑破坏神,梦幻西游,暗黑破坏神1,暗黑破坏神2,暗黑破坏神3,单身武器,双手武器,使用木棒,是用手杖,使用法杖,使用长剑,使用盾牌,使用斧头,使用爪子,使用鞭子,巫师,德鲁伊,亡灵法师,法师,圣骑士,野蛮人,刺客,亚马逊,飞燕女,魔兽争霸,魔兽世界,0int rulep6=19,17,15,10,0,0,20,17,15,10,0,0,21,17,15,11,0,0,23,22,18,15,10,0,24,17,15,11,0,0,25,17,15,11,0,0,22,17,15,11,0,0,26,17,13,11,0,0,12,7,1,0,0,0,12,8,1,0,0,0,12,9,1,0,0,0,4,2,0,0,0,0,5,3,1,0,0,0,6,3,1,0,0,0,4,1,0,0,0,0;int rulec=28,29,30,31,32,33,34,35,14,15,16,13,12,36,37;class factprivate: int Number; char Name21; int Active; int Succ;public: fact *Next; fact(int Num,char *L) strcpy(Name,L); Number=Num; Active=False; /-1是已经推理,不符合。1是已经推理,符合。 Succ=DontKnow; /0是无,-1是不知道,1是有。 Next=NULL; char *GetName() char *L; L=new char21; strcpy(L,Name); return L; int GetNumber() return Number; int GetAct() return Active; int GetSucc() return Succ; void PutAct(const int Act0,int Suc0) Active=Act0; Succ=Suc0; ;fact *Fact;class listprivate: int Number;public: list *Next; list(int Num) Number=Num; Next=NULL; int GetNumber() return Number; ;class rulechar *Name;list *Pre;int Conc;public: rule *Next; rule(char *N,int P,int C); rule(); int Query(); void GetName() coutNext; delete Pre; Pre=L;delete Name;rule:rule(char *N,int P,int C)int i;list *L;Pre=NULL;Next=NULL;Name=new charstrlen(N)+1;strcpy(Name,N);i=0;while(Pi!=0) L=new list(Pi+); L-Next=Pre; Pre=L;Conc=C;int rule:Query()char c;int Tag=0;list *L;fact *F;F=Fact;L=Pre;if(L=NULL) coutGetNumber()=F-GetNumber() break; F=F-Next; if(L-GetNumber()0) if(F-GetSucc()=True) L=L-Next; continue; if(F-GetSucc()=False) return False; else if(F-GetSucc()=True) return False; if(F-GetSucc()=False) L=L-Next; continue; coutGetName()(Y/N)GetNumber()0) F-PutAct(1,True); if(L-GetNumber()PutAct(1,True); Tag=-1; return False; else if(L-GetNumber()PutAct(-1,False); else F-PutAct(-1,False); Tag=-1; /已经推理,不符合。 return False; L=L-Next; F=Fact;for(;) if(Conc=F-GetNumber() break; F=F-Next;if(ConcPutAct(1,True); return False;if(Tag!=-1) F=Fact; for(;) if(Conc=F-GetNumber() break; F=F-Next; if(ConcPutAct(1,True); return False; coutnThis aniamal is GetName()Next=Fact; Fact=F; i+;F=Fact;Fact=NULL;while(F) /把倒序排列正过来。 T=F; F=F-Next; T-Next=Fact;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论