实验一 产生式系统——动物识别系统
一、实习目的和意义
1、掌握人工智能的知识表示技术,能用产生式表示法表示知识; 2、掌握基于规则推理的基本方法; 3、掌握产生式系统的运行机制。
二、实习内容
参考教材规则库包含15条规则,开发一个专家系统可以识别老虎,金钱豹,斑马,长颈鹿,企鹅,鸵鸟等6种动物。
三、实习要求
1、本次实验语言MATLAB;
2、系统能通过正向推理得到正确的动物识别结果。
四、实习过程 1. 实验原理
正向推理(事实驱动推理)
1) 从初始已知事实出发,在知识库KB中找出当前可适用的知识,构成可适
用知识集KS;
2) 按某种冲突消解策略,从KS中选出一条知识进行推理,并将推出的新事
实加入到数据库DB中,作为下一步推理的已知事实,再在KB中选取可适用知识构成KS;
3) 重复步骤二,直到求得问题的解,或KB中再无可适用的知识。
2. 问题背景
根据课本P33的15调动物识别的专家知识,建立规则库。
3. 算法设计
主要利用数组下标和元素的0,1值表示知识,规则,及相关标记。
4. Matlab实现
a. 算法 函数名 learn checkRule
函数说明
function learn(arr_category, arr_feature)主函数
function [arr_category,arr_feature,arr_rule,ifMore,mark]= checkRule(arr_category,arr_feature,arr_rule,ifMore,mark ) 规则符合检测
showCategory
function showCategory( ) 类别选项打印函数
showFeature
function showFeature() 特征选项打印函数
showResult
function showResult(mark) 结果显示
b. 测试 测试数据一 arr_category[5] arr_feature[20]
1 0 0 0 1
0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
测试数据二
arr_category[5] arr_feature[20]
0 0 0 0 0
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
五、实习总结 1.实习总结
本次实验主要复习了产生式规则,利用正向推理和15条规则,建立简单的动物识别专家系统,并具有一定的容错性。
2.附录:代码
MATLAB代码:
function learn(arr_category, arr_feature) %产生式规则-正向推理-主函数
% 标记函数初始化,规则函数调用 arr_rule=zeros(1,15); mark=-1; ifMore=0;
disp(arr_category); disp(arr_feature); %showCategory();
%arr_category=input('输入信息:'); %showFeature();
%arr_feature=input('输入信息');
[arr_category,arr_feature,arr_rule,ifMore,mark]=
checkRule(arr_category,arr_feature,arr_rule,ifMore,mark);
busy=1;
while busy==1
if mark>-1
showResult(mark); break; end
if ifMore==0
disp('无法判断具体是哪种动物!'); break end
ifMore=0;
[arr_category,arr_feature,arr_rule,ifMore,mark]=
checkRule(arr_category,arr_feature,arr_rule,ifMore,mark); end
end
function [arr_category,arr_feature,arr_rule,ifMore,mark]= checkRule(arr_category,arr_feature,arr_rule,ifMore,mark ) %正向推理函数
% 逐条检查规则是否满足,若满足,则增加新信息 ifMore=0;
for i = 1:1:15 if arr_rule(i)==0 switch i case 1
if arr_feature(1)>0
arr_category(1)=1; arr_rule(i)=1; ifMore=1;
disp(['根据规则',num2str(i)]); disp('新增信息:该动物是哺乳动物'); end
%break; case 2
if arr_feature(2)>0
arr_category(1)=1; arr_rule(i)=1; ifMore=1;
disp(['根据规则',num2str(i)]); disp('新增信息:该动物是哺乳动物'); end
%break; case 3
if arr_feature(3)>0
arr_category(2)=1; arr_rule(i)=1; ifMore=1;
disp(['根据规则',num2str(i)]); disp('新增信息:该动物是鸟'); end
%break; case 4
if arr_feature(4)*arr_feature(5)>0
arr_category(2)=1; arr_rule(i)=1; ifMore=1;
disp(['根据规则',num2str(i)]); disp('新增信息:该动物是鸟'); end
%break; case 5
if arr_feature(6)>0
arr_category(3)=1; arr_rule(i)=1; ifMore=1;
disp(['根据规则',num2str(i)]); disp('新增信息:该动物是食肉动物'); end
%break; case 6
if arr_feature(7)*arr_feature(8)*arr_feature(9)>0
arr_category(3)=1; arr_rule(i)=1; ifMore=1;
disp(['根据规则',num2str(i)]); disp('新增信息:该动物是食肉动物'); end
%break; case 7
if arr_category(1)*arr_feature(10)>0 arr_category(4)=1; arr_rule(i)=1; ifMore=1;
disp(['根据规则',num2str(i)]);
disp('新增信息:该动物是有蹄类动物');