人工智能 课程实验 专家系统 程序源代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
游戏人物识别专家系统
——邢洪伟一试验题目
游戏人物识别专家系统
二、试验内容
游戏人物识别专家系统是流行的专家系统实验模型,主要基于暴风公司出品的经典角色类游戏《暗黑破坏神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,1 3,12,36,37}中第八个“35”,这里35对应事实数组中的“飞燕女”。
上述就是程序的推理过程,也是程序中的重点,该部分是由规则类(类rul e)中的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(abs(L->GetNumber())==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;} }
cout<
c=getchar(); //事实断言为不知道的时候,向用户询问
flushall();
if((c=='Y')||(c=='y'))
{
if(L->GetNumber()>0)
F->PutAct(1,true); //设置事实的断言和激活标志if(L->GetNumber()<0)
{
F->PutAct(1,true);
Tag=-1;
return false;
}
}
else
{
if(L->GetNumber()<0)
F->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(Conc<24)
{
F->PutAct(1,true);
return false;
}
if(Tag!=-1)
{