首页 > 编程知识 正文

动物识别系统java代码,编程实现简单动物识别系统

时间:2023-05-04 13:43:29 阅读:212599 作者:915

动物识别专家系统 产生式系统问题定义系统实现规则、事实和产生式的表示类的设计匹配顺序推理机 结果演示源代码

产生式系统

规则库
规则库是用于描述相应领域内知识的产生式集合。它是产生式系统求解问题的基础,其中对领域知识表达的完整性、准确性、有效性,将直接影响到系统的性能和效率。因此必须要合理设计和组织规则库中的知识,检测并排除冗余或矛盾的知识。事实库。
事实库用于存放问题的初始事实、当前已知的信息、推理过程中形成的中间结论以及最终结论。显然,事实库的内容是动态的,是不断变化的。推理机。
推理机由一组程序组成。它控制并协调着整个生产式系统的运行,从而实现对问题的推理求解。通常分 3 步完成:匹配、冲突解决和操作。 问题定义

动物识别专家系统是流行的专家系统实验模型,它用产生式规则来表示知识,共15条规则、可以识别七种动物,这些规则既少又简单,可以改造他们,也可以加进新的规则,还可以用来识别其他东西的新规则来取代这些规则。

系统实现 规则、事实和产生式的表示

识别七种动物共需要30个特征和事实,用0~29给它们编号。

String[] features = {"有毛", "产奶", "有羽毛", "会飞", "会下蛋", "吃肉", "有犬齿", "有爪", "眼睛盯前方", "有蹄", "反刍", "黄褐色", "有斑点", "有黑色条纹", "长脖", "长腿", "不会飞", "会游泳", "黑白两色", "善飞", "哺乳类", "鸟类", "肉食类", "蹄类", "企鹅", "海燕", "鸵鸟", "斑马", "长颈鹿", "虎", "金钱豹"};

产生式规则就用三维数组表示:

int[][][] expr = new int[][][]{ {{0}, {20}}, {{1}, {20}}, {{2}, {21}}, {{3, 4}, {21}}, {{20, 5}, {22}}, {{6, 7, 8}, {22}}, {{20, 8}, {23}}, {{20, 9}, {23}}, {{22, 11, 12}, {30}}, {{22, 11, 13}, {29}}, {{23, 14, 15, 12}, {28}}, // 如果动物是蹄类(23),且有黑色条纹(13),则该动物对应事实数组的第27个“斑马” {{23, 13}, {27}}, {{21, 14, 15, 16}, {26}}, {{21, 19}, {25}}, {{21, 17, 18, 16}, {24}}}; 类的设计 Rule类:存放一条规则的前提和结论;能根据给定条件判断该条规则是否满足(即是否能得到该条规则的结论);RuleRepository类:存放事实库、规则库并实现推理机。AnimalIdentificationExpertSystem类:继承自JFrame,界面类。 // 规则库,存放已知的所有规则(产生式规则)List<Rule> rules = new ArrayList<>();// 事实库,动态变化的List<Integer> conditions = new ArrayList<>();

使用可变的列表,容易添加和删除已有条件、事实。

匹配顺序

在30个事实中:

String[] features = {"有毛", "产奶", "有羽毛", "会飞", "会下蛋", "吃肉", "有犬齿", "有爪", "眼睛盯前方", "有蹄", "反刍", "黄褐色", "有斑点", "有黑色条纹", "长脖", "长腿", "不会飞", "会游泳", "黑白两色", "善飞", "哺乳类", "鸟类", "肉食类", "蹄类", "企鹅", "海燕", "鸵鸟", "斑马", "长颈鹿", "虎", "金钱豹"};

前20个是用户输入的特征,而下面的四个(“哺乳类”, “鸟类”, “肉食类”, “蹄类”)属于推理的中间结果,最后的七个(“企鹅”, “海燕”, “鸵鸟”, “斑马”, “长颈鹿”, “虎”, “金钱豹”)是最终的识别结果。

在用户输入条件到事实库后(这些条件就是事实),事实库并不是不变的

比如用户输入了0(“有毛”)、5(“吃肉”),那么其实真正的事实库是(0、5、20),因为在匹配第一条规则:{{0}, {20}}的时候,有条件0,所以可以得到规则1的结论(20),并且该结论也应当加入事实库,因为这是已经知道的了,然后匹配到规则5:{{20, 5}, {22}}时,就可以得到结论22(“肉食类”)。

所以在从上到下匹配这15条产生式规则的过程中,如果匹配了某一条产生式规则,就该把这条规则的结论加入事实库;而且也发现了匹配规则是要注意顺序的,上面的例子中如果先匹配了规则5,那么此时事实库中只有(0和5),就得不到中间结论22。

这说明规则的摆放是要有顺序的,产生某编号的规则(即结论为某编号规则)应该排在使用该编号的规则(即条件为某编号规则)之前。这15条结论是正好符合这样的顺序的。

推理机

有了上面的顺序意识之后,推理机的实现就很容易了:就是从上到下,从第一条产生式规则开始判断当前的事实库能否匹配每条规则,匹配成功,就把该条规则的结论编号加入事实库,匹配完规则库中所有产生式规则后就可以输出结论了(我的处理):

中间结论(“哺乳类”, “鸟类”, “肉食类”, “蹄类”)输出到推理框中展示正向推理过程;最终结论(七种动物)框出对应的图片; 结果演示

什么结论都推不出(一条结论都没匹配上):

推出中间结果:

推出最终结果,识别到了动物:

源代码

源代码已上传至github(Java实现,IDE为IDEA)

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。