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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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,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())

相关文档
最新文档