基于MATLAB产生式系统(植物识别系统) 您所在的位置:网站首页 谓词逻辑的应用和实验报告 基于MATLAB产生式系统(植物识别系统)

基于MATLAB产生式系统(植物识别系统)

2024-06-18 04:00| 来源: 网络整理| 查看: 265

1. 实验报告应包括:实验目的 熟悉一阶谓词逻辑和产生式表示法,掌握产生式系统的运行机制,以及基于规则推理的基本方法。 2. 实验内容 运用所学知识,设计并编程实现一个小型人工智能系统(如分类、诊断、预测等类型)。 3. 实验原理 (1)一个产生式系统由三个部分组成 1)综合数据库:用来存放与求解问题有关的数据以及推理过程环境的当前状态的描述。 2)产生式规则库:主要存放问题求解中的规则。 3)控制策略:其作用是说明下一步应该选用什么规则,也就是说如何应用规则。 三个部分如图所示: 在这里插入图片描述

(2)产生式系统的实现有三种方法 1)正向推理:从一组表示事实的谓词或命题出发,使用一组产生式规则,用以证明该谓词公式或命题是否成立。 2)逆向推理:从表示目标的谓词或命题出发,使用一组产生式规则证明事实谓词或命题成立,即首先提出一批假设目标,然后逐一验证这些假设。 3)双向推理:双向推理的推理策略是同时从目标向事实推理和从事实向目标推理,并在推理过程中的某个步骤,实现事实与目标的匹配。 4. 实验器材 ····计算机 5. 实验步骤 基于如图1所示的产生式系统实验程序,设计并实现一个小型人工智能系统: 1)系统设置,包括设置系统名称和系统谓词,给出谓词名及其含义。 2)编辑知识库,通过输入规则或修改规则等,完成整个规则库的建立。 3)建立事实库(综合数据库),输入多条事实或结论。 4)运行推理,包括正向推理和反向推理,给出相应的推理过程、事实区和规则区。 6.代码 shengchanshi.m

%生产式系统 %要求部分 % R1:种子有果皮 -> 被子植物 % R2:种子无果皮 -> 裸子植物 % R3:无茎叶 & 无根 -> 藻类植物 % R4:被子植物 & 有托叶 -> 蔷薇科 % R5:被子植物 & 吸引菜粉蝶 -> 十字花科 % R6:被子植物 & 十字形花冠 -> 十字花科 % R7:被子植物 & 缺水环境 -> 仙人掌科 % R8:被子植物 & 蔷薇科 & 有刺 -> 玫瑰 % R9:被子植物 & 水生 & 可食用 & 结果实 -> 荷花 % R10:被子植物 & 仙人掌科 & 喜阳 & 有刺 -> 仙人球 % R11:藻类植物 & 水生 & 药用 -> 水棉 % R12:被子植物 & 蔷薇科 & 木本 & 可食用 & 结果实 -> 苹果树 % R13:被子植物 & 十字花科 & 黄色花 & 可食用 & 结果实 -> 油菜 % R14:藻类植物 & 水生 & 可食用 & 有白色粉末 -> 海带 % R15:裸子植物 & 木本 & 叶片针状 & 结果实 -> 松树 %% 代码部分 % 设定所有的陈述与结论 % set all statements and conclusions disp('请根据特征输入1或0'); q=input('有果皮?'); state{1}.C = '有果皮'; if q==1 state{1}.T = 1; else state{1}.T = 0; end state{2}.C = '被子植物'; state{2}.T = 0; q=input('无果皮?'); state{3}.C = '无果皮'; if q==1 state{3}.T = 1; else state{3}.T = 0; end state{4}.C = '裸子植物'; state{4}.T = 0; q=input('无茎叶?'); state{5}.C = '无茎叶'; if q==1 state{5}.T = 1; else state{5}.T = 0; end q=input('无根?'); state{6}.C = '无根'; if q==1 state{6}.T = 1; else state{6}.T = 0; end state{7}.C = '藻类植物'; state{7}.T = 0; q=input('有托叶?'); state{8}.C = '有托叶'; if q==1 state{8}.T = 1; else state{8}.T = 0; end state{9}.C = '蔷薇科'; state{9}.T = 0; q=input('吸引菜粉蝶?'); state{10}.C = '吸引菜粉蝶'; if q==1 state{10}.T = 1; else state{10}.T = 0; end state{11}.C = '十字花科'; state{11}.T = 0; q=input('十字形花冠?'); state{12}.C = '十字形花冠'; if q==1 state{12}.T = 1; else state{12}.T = 0; end q=input('缺水环境?'); state{13}.C = '缺水环境'; if q==1 state{13}.T = 1; else state{13}.T = 0; end state{14}.C = '仙人掌科'; state{14}.T = 0; q=input('有刺?'); state{15}.C = '有刺'; if q==1 state{15}.T = 1; else state{15}.T = 0; end state{16}.C = '玫瑰'; state{16}.T = 0; q=input('水生?'); state{17}.C = '水生'; if q==1 state{17}.T = 1; else state{17}.T = 0; end q=input('可食用?'); state{18}.C = '可食用'; if q==1 state{18}.T = 1; else state{18}.T = 0; end q=input('结果实?'); state{19}.C = '结果实'; if q==1 state{19}.T = 1; else state{19}.T = 0; end state{20}.C = '荷花'; state{20}.T = 0; q=input('喜阳?'); state{21}.C = '喜阳'; if q==1 state{21}.T = 1; else state{21}.T = 0; end state{22}.C = '仙人球'; state{22}.T = 0; q=input('药用?'); state{23}.C = '药用'; if q==1 state{23}.T = 1; else state{23}.T = 0; end state{24}.C = '水棉'; state{24}.T = 0; q=input('木本?'); state{25}.C = '木本'; if q==1 state{25}.T = 1; else state{25}.T = 0; end state{26}.C = '苹果树'; state{26}.T = 0; q=input('黄色花?'); state{27}.C = '黄色花'; if q==1 state{27}.T = 1; else state{27}.T = 0; end state{28}.C = '油菜'; state{28}.T = 0; q=input('白色粉末?'); state{29}.C = '白色粉末'; if q==1 state{29}.T = 1; else state{29}.T = 0; end state{30}.C = '海带'; state{30}.T = 0; q=input('叶片针状?'); state{31}.C = '叶片针状'; if q==1 state{31}.T = 1; else state{31}.T = 0; end state{32}.C = '松树'; state{32}.T = 0; %% 打印初始的状态 % print initial status fprintf('初始状态为:\n'); for i = 1 : length(state) if state{i}.T == 1 fprintf(state{i}.C); fprintf(','); end end fprintf('\n'); %% 生产式规则 % production rules change = 1; while change == 1 change = 0; if JudgeState(state, '有果皮') && change == 0 [change, state] = TrueState(state, '被子植物' ); end if JudgeState(state, '无果皮') && change == 0 [change, state] = TrueState(state, '裸子植物' ); end if JudgeState(state, '无茎叶') && JudgeState(state, '无根') && change == 0 [change, state] = TrueState(state, '藻类植物' ); end if JudgeState(state, '被子植物') && JudgeState(state, '有托叶') && change == 0 [change, state] = TrueState(state, '蔷薇科' ); end if JudgeState(state, '被子植物') && JudgeState(state, '吸引菜粉蝶') && change == 0 [change, state] = TrueState(state, '十字花科' ); end if JudgeState(state, '被子植物') && JudgeState(state, '十字形花冠') && change == 0 [change, state] = TrueState(state, '十字花科' ); end if JudgeState(state, '被子植物') && JudgeState(state, '缺水环境') && change == 0 [change, state] = TrueState(state, '仙人掌科' ); end if JudgeState(state, '被子植物') && JudgeState(state, '蔷薇科') && JudgeState(state, '有刺') && change == 0 [change, state] = TrueState(state, '玫瑰' ); end if JudgeState(state, '被子植物') && JudgeState(state, '水生') && JudgeState(state, '可食用') && JudgeState(state, '结果实') && change == 0 [change, state] = TrueState(state, '荷花' ); end if JudgeState(state, '被子植物') && JudgeState(state, '仙人掌科') && JudgeState(state, '喜阳') && JudgeState(state, '有刺') && change == 0 [change, state] = TrueState(state, '仙人球' ); end if JudgeState(state, '藻类植物') && JudgeState(state, '水生') && JudgeState(state, '药用') && change == 0 [change, state] = TrueState(state, '水棉' ); end if JudgeState(state, '被子植物') && JudgeState(state, '蔷薇科') && JudgeState(state, '木本') && JudgeState(state, '可食用') && JudgeState(state, '结果实') && change == 0 [change, state] = TrueState(state, '苹果树' ); end if JudgeState(state, '被子植物') && JudgeState(state, '十字花科') && JudgeState(state, '黄色花') && JudgeState(state, '可食用') && JudgeState(state, '结果实')&& change == 0 [change, state] = TrueState(state, '油菜' ); end if JudgeState(state, '藻类植物') && JudgeState(state, '水生') && JudgeState(state, '可食用') && JudgeState(state, '白色粉末') && change == 0 [change, state] = TrueState(state, '海带' ); end if JudgeState(state, '裸子植物') && JudgeState(state, '木本') && JudgeState(state, '叶片针状') && JudgeState(state, '结果实') && change == 0 [change, state] = TrueState(state, '松树' ); end if change == 1 fprintf('状态变化为:\n'); for i = 1 : length(state) if state{i}.T == 1 fprintf(state{i}.C); fprintf(','); end end fprintf('\n'); end end

两个子函数 JudgeState.m

function output = JudgeState(state, in) % 生产式系统实验子函数 % 输入状态列表(state)与当前状态(in) % 输出当前状态是否在状态列表中的判断结果 output = 0; for i = 1: length(state) if strcmp(state{i}.C, in) && state{i}.T == 1 output = 1; break; end end end

TrueState.m

function [change, state] = TrueState(state, in) % 生产式系统实验子函数 % 输入状态列表(state)与当前状态(in) % 将输入状态的在状态列表中置为真 change = 0; for i = 1: length(state) if strcmp(state{i}.C, in) && state{i}.T == 0 change = 1; state{i}.T = 1; break; end end end


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有