当前位置:文档之家› 人工智能 课程实验 专家系统 程序源代码

人工智能 课程实验 专家系统 程序源代码

游戏人物识别专家系统——邢洪伟一试验题目游戏人物识别专家系统二、试验内容游戏人物识别专家系统是流行的专家系统实验模型,主要基于暴风公司出品的经典角色类游戏《暗黑破坏神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)cout<<"\nError";while(L!=NUll){F=Fact;for(;;){}if(L->GetNumber()>0){if((F->GetSucc())==true) {L=L->Next;continue;}if((F->GetSucc())==false) return false;if(abs(L->GetNumber())==F->GetNumber())F=F->Next; //查找与规则前提链中前提号相同的事实} //如果事实的断言为真则判断下一个前提,为假,则表示该规则不适合else}{}if((F->GetSucc())==true) return false;if((F->GetSucc())==false) {L=L->Next;continue;}cout<<endl<<F->GetName()<<"(Y/N)";c=getchar(); //事实断言为不知道的时候,向用户询问flushall();if((c=='Y')||(c=='y')){}{}L=L->Next;if(L->GetNumber()<0)F->PutAct(-1,false);{}F->PutAct(-1,false);Tag=-1;return false;if(L->GetNumber()>0)F->PutAct(1,true); //设置事实的断言和激活标志if(L->GetNumber()<0){}F->PutAct(1,true);Tag=-1;return false;elseelsefor(;;){}if(Conc<24){}{F->PutAct(1,true);return false;if(Conc==F->GetNumber()) break; //查找结论断言对应的事实F=F->Next;if(Tag!=-1)};}F=Fact;for(;;){}if(Conc<24){}F->PutAct(1,true);return false;if(Conc==F->GetNumber()) break;F=F->Next;cout<<"\nThis animal is"<<F->GetName();return true;return false;五试验结论通过这次试验和一些辅助书籍的阅读,加强了自己的阅读程序能力和编程的能力,而且游戏人物识别专家系统,它用产生式规则来表示知识,可以改造他们,也可以加进新的规则,还可以用来识别其他东西的新规则来取代这些规则,运用到其它方面去。

总之,这次试验让我受益匪浅。

完整的源代码#include <string.h>#include <math.h>#include <stdio.h>#include <iostream.h>#define True 1#define False 0#define DontKnow -1Char *str{}={"暴风公司出品","网易游戏出品","单机游戏","网络游戏","角色类游戏","对抗类游戏","版本1","版本2","版本3","男性","女性", "暗黑破坏神","梦幻西游","暗黑破坏神1","暗黑破坏神2","暗黑破坏神3","单身武器","双手武器","使用木棒","是用手杖","使用法杖","使用长剑","使用盾牌","使用斧头","使用爪子","使用鞭子","巫师","德鲁伊","亡灵法师","法师","圣骑士","野蛮人","刺客","亚马逊","飞燕女","魔兽争霸","魔兽世界","\0"}int rulep[][6]={{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 fact{private:int Number;char Name[21];int Active;int Succ;public:fact *Next;fact(int Num,char *L){strcpy(Name,L);Number=Num;Active=False;//-1是已经推理,不符合。

相关主题