
可怜的五郎被玩弄于鼓掌之间
进行了更先进的改造,只需要输入已知信息即可,不知道的信息不需要输入。
太长懒得搞,简单弄了 稻妻璃月的部分角色判断,还在维护升级中,可能会升级为人工智能云端实验库
有参考来自基于MATLAB产生式系统(植物识别系统)_Nice25的博客-CSDN博客_产生式系统实验matlab
% 1雷之国度-->2稻妻
% 3港口城市 + 4神不管事-->5璃月
% 稻妻+ 6将领 -->7稻妻军事(心海、五郎、九条)
% 稻妻+ 8摸鱼 -->9快乐生活(早柚、宵宫)
% 璃月+10管理者-->11璃月七星(刻晴、凝光)
% 璃月+12干饭人-->13人间烟火(胡桃、香菱)
% 璃月+14老婆-->(36申鹤)
% 稻妻军事 + 15渊下宫入口 = 16珊瑚宫
% 稻妻军事 + 17天领奉行 = 27九条
% 珊瑚宫 + 18观赏鱼 =28心海
% 珊瑚宫 + 19宫司大人的玩物 = 29五郎
% 快乐生活+20烟花 =30宵宫
% 快乐生活+21睡觉 =31早柚
% 璃月七星+22雷厉风行=32刻晴
% 璃月七星+23天权=33凝光
% 人间烟火+24平板电脑+25往生堂=34胡桃
% 人间烟火+26厨子=35香菱
【解析1:状态读入】
状态23编号是 初始状态-天权,以Q读入看看是否成立,如果成立,给T置位1
q=input('天权');
s{23}.C = '天权';%单数值推断
if q==1
s{23}.T = 1;
else
s{23}.T = 0;
End
【解析2:中间状态初始化】
中间状态默认都是false状态,16号是中间状态来自珊瑚宫的角色,默认置位为0
s{16}.C = '珊瑚宫';
s{16}.T = 0;
【解析3:状态打印】
采用常规扫描全状态表,看成立的状态,给他的C状态名称输出出来
这里i不是自适应读取的变量,而是int型,所以是作为idx下标使用
而不是直接printf i.s或i.t
for i = 1 : length(s)
if s{i}.T == 1
fprintf(s{i}.C);
fprintf(',');
end
end
fprintf('\n');
【解析4:已知条件判断与中间条件的推出】
Pd是辅助函数,来判断这个状态名称的状态是否在状态库中存在且成立
如果两个状态成立,那么就将s中对应名称为【刻晴】的状态结论置位true(1)
C=0
if pd(s, '璃月七星') && pd(s, '雷厉风行')
[c, s] = CT(s, '刻晴' );
end
-
- %%公理系统
-
- % 1雷之国度-->2稻妻
- % 3港口城市 + 4神不管事-->5璃月
-
- % 稻妻+ 6将领 -->7稻妻军事(心海、五郎、九条)
- % 稻妻+ 8摸鱼 -->9快乐生活(早柚、宵宫)
-
- % 璃月+10管理者-->11璃月七星(刻晴、凝光)
- % 璃月+12干饭人-->13人间烟火(胡桃、香菱)
- % 璃月+14老婆-->(36申鹤)
-
- % 稻妻军事 + 15渊下宫入口 = 16珊瑚宫
- % 稻妻军事 + 17天领奉行 = 27九条
- % 珊瑚宫 + 18观赏鱼 =28心海
- % 珊瑚宫 + 19宫司大人的玩物 = 29五郎
- % 快乐生活+20烟花 =30宵宫
- % 快乐生活+21睡觉 =31早柚
-
- % 璃月七星+22雷厉风行=32刻晴
- % 璃月七星+23天权=33凝光
- % 人间烟火+24平板电脑+25往生堂=34胡桃
- % 人间烟火+26厨子=35香菱
-
-
- %% 数据结构定义
- s{1}.C = '雷之国度';%单数值推断
- s{3}.C = '港口城市';%单数值推断
- s{4}.C = '神不管事';%单数值推断
- s{6}.C = '将领';%单数值推断
- s{8}.C = '摸鱼';%单数值推断
- s{10}.C = '管理者';%单数值推断
- s{12}.C = '干饭人';%单数值推断
- s{14}.C = '老婆';%单数值推断
- s{15}.C = '渊下宫入口';%单数值推断
- s{17}.C = '天领奉行';%单数值推断
- s{18}.C = '观赏鱼';%单数值推断
- s{19}.C = '宫司大人的玩物';%单数值推断
- s{20}.C = '烟花';%单数值推断
- s{21}.C = '睡觉';%单数值推断
- s{22}.C = '雷厉风行';%单数值推断
- s{23}.C = '天权';%单数值推断
- s{24}.C = '平板电脑';%单数值推断
- s{25}.C = '往生堂';%单数值推断
- s{26}.C = '厨子';%单数值推断
- % 中间结论模块,只能有前方已知模块推出 7个中间结论
- s{2}.C = '稻妻';
- s{5}.C = '璃月';
- s{7}.C = '稻妻军事';
- s{9}.C = '快乐生活';
- s{11}.C = '璃月七星';
- s{13}.C = '人间烟火';
- s{16}.C = '珊瑚宫';
- % 最终结论有10个角色
- s{28}.C = '心海';
- s{29}.C = '五郎';
- s{27}.C = '九条';
- s{31}.C = '早柚';
- s{30}.C = '宵宫';
- s{32}.C = '刻晴';
- s{33}.C = '凝光';
- s{34}.C = '胡桃';
- s{35}.C = '香菱';
- s{36}.C = '申鹤';
- %一共36条信息,将结构体中T模块为int型全部定义为0
- k=1,n=36;
- while(k<=n)
- s{k}.T=0;
- k=k+1;
- end
-
-
-
-
-
-
- %%更好的公理系统读入方式
- disp('【产生式系统 · 原神角色识别】 基本已知条件如下\n');
- disp('1-雷之国度 3-港口城市 4-神不管事 6-将领\n');
- disp('8-摸鱼 10-管理者 12-干饭人 14-老婆(申鹤)\n');
- disp('15-渊下宫入口 17-天领奉行 18-观赏鱼 19-八重宫司大人的玩物\n');
- disp('20-长野原烟花 21-睡觉 22-雷厉风行 23-璃月七星·天权\n');
- disp('24-平胸 25-往生堂 26-厨师\n');
- disp('\n');
- disp('\n');
- t1=input('输入已知条件的编号,以0结束\n请输入:');
- while(t1~=0)
- s{t1}.T=1;
- t1=input('请输入:');
- end
-
-
- %% 打印初始的状态
- % print initial status
- fprintf('初始状态为:\n');
- for i = 1 : length(s)
- if s{i}.T == 1
- fprintf(s{i}.C);
- fprintf(',') ;
- end
- end
- fprintf('\n');
-
-
-
-
-
-
-
-
- %%推断开始
-
- c = 1;
- while c == 1
- c = 0; % 有变化就会被置位1,如果没变化就置位0然后自动退出
-
-
- % 角色国度推断
- if pd(s, '雷之国度')
- [c, s] = CT(s, '稻妻' );
- end
-
- if pd(s, '港口城市') && pd(s, '神不管事')
- [c, s] = CT(s, '璃月' );
- end
-
-
-
- % 角色类型推断
-
- if pd(s, '稻妻') && pd(s, '将领')
- [c, s] = CT(s, '稻妻军事' );
- end
-
- if pd(s, '稻妻') && pd(s, '摸鱼')
- [c, s] = CT(s, '快乐生活' );
- end
-
- if pd(s, '璃月') && pd(s, '管理者')
- [c, s] = CT(s, '璃月七星' );
- end
-
- if pd(s, '璃月') && pd(s, '干饭人')
- [c, s] = CT(s, '人间烟火' );
- end
-
- if pd(s, '璃月') && pd(s, '老婆')
- [c, s] = CT(s, '申鹤' );
- end
-
- if pd(s, '稻妻军事') && pd(s, '渊下宫入口')
- [c, s] = CT(s, '珊瑚宫' );
- end
-
- if pd(s, '稻妻军事') && pd(s, '天领奉行')
- [c, s] = CT(s, '九条' );
- end
-
- if pd(s, '珊瑚宫') && pd(s, '观赏鱼')
- [c, s] = CT(s, '心海' );
- end
-
- if pd(s, '珊瑚宫') && pd(s, '宫司大人的玩物')
- [c, s] = CT(s, '五郎' );
- end
-
- if pd(s, '快乐生活') && pd(s, '烟花')
- [c, s] = CT(s, '宵宫' );
- end
-
- if pd(s, '快乐生活') && pd(s, '睡觉')
- [c, s] = CT(s, '早柚' );
- end
-
- if pd(s, '璃月七星') && pd(s, '雷厉风行')
- [c, s] = CT(s, '刻晴' );
- end
-
- if pd(s, '璃月七星') && pd(s, '天权')
- [c, s] = CT(s, '凝光' );
- end
-
- if pd(s, '人间烟火') && pd(s, '厨子')
- [c, s] = CT(s, '香菱' );
- end
-
- if pd(s, '人间烟火') && pd(s, '平板电脑') && pd(s, '往生堂')
- [c, s] = CT(s, '胡桃' );
- end
-
-
- if c == 1
- fprintf('状态变化为:\n');
-
- for i = 1 : length(s)
- if s{i}.T == 1
- fprintf(s{i}.C);
- fprintf(',');
- end
- end
- fprintf('\n');
- end
- end
-
-
-
-
-
-
-
- function output = pd(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
-
- function [change, state] = CT(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