MATLAB 产生式系统 · 推断原神角色

编程入门 行业动态 更新时间:2024-10-07 12:23:03

MATLAB 产生式系统 · <a href=https://www.elefans.com/category/jswz/34/1757383.html style=推断原神角色"/>

MATLAB 产生式系统 · 推断原神角色

 可怜的五郎被玩弄于鼓掌之间

简述

        进行了更先进的改造,只需要输入已知信息即可,不知道的信息不需要输入。
        太长懒得搞,简单弄了 稻妻璃月的部分角色判断,还在维护升级中,可能会升级为人工智能云端实验库

有参考来自基于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

test.m    输入基础信息,循环推断


%%公理系统%  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 == 1fprintf(s{i}.C);fprintf(',') ;end
end
fprintf('\n');%%推断开始c = 1;
while c == 1c = 0;  % 有变化就会被置位1,如果没变化就置位0然后自动退出% 角色国度推断if pd(s, '雷之国度') [c, s]  = CT(s, '稻妻' );endif pd(s, '港口城市') && pd(s, '神不管事') [c, s]  = CT(s, '璃月' );end% 角色类型推断if pd(s, '稻妻') && pd(s, '将领') [c, s]  = CT(s, '稻妻军事' );endif pd(s, '稻妻') && pd(s, '摸鱼') [c, s]  = CT(s, '快乐生活' );endif pd(s, '璃月') && pd(s, '管理者') [c, s]  = CT(s, '璃月七星' );endif pd(s, '璃月') && pd(s, '干饭人') [c, s]  = CT(s, '人间烟火' );endif pd(s, '璃月') && pd(s, '老婆') [c, s]  = CT(s, '申鹤' );endif pd(s, '稻妻军事') && pd(s, '渊下宫入口') [c, s]  = CT(s, '珊瑚宫' );endif pd(s, '稻妻军事') && pd(s, '天领奉行') [c, s]  = CT(s, '九条' );endif pd(s, '珊瑚宫') && pd(s, '观赏鱼') [c, s]  = CT(s, '心海' );endif pd(s, '珊瑚宫') && pd(s, '宫司大人的玩物') [c, s]  = CT(s, '五郎' );endif pd(s, '快乐生活') && pd(s, '烟花') [c, s]  = CT(s, '宵宫' );endif pd(s, '快乐生活') && pd(s, '睡觉') [c, s]  = CT(s, '早柚' );endif pd(s, '璃月七星') && pd(s, '雷厉风行') [c, s]  = CT(s, '刻晴' );endif pd(s, '璃月七星') && pd(s, '天权') [c, s]  = CT(s, '凝光' );endif pd(s, '人间烟火') && pd(s, '厨子') [c, s]  = CT(s, '香菱' );endif pd(s, '人间烟火') && pd(s, '平板电脑') && pd(s, '往生堂') [c, s]  = CT(s, '胡桃' );endif c == 1fprintf('状态变化为:\n'); for i = 1 : length(s)if s{i}.T == 1fprintf(s{i}.C);fprintf(',');endendfprintf('\n');end
end

pd.m      判断某个状态是否成立,成立返回1

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

CT.m      输入状态名称,把标注对应状态成立

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

更多推荐

MATLAB 产生式系统 · 推断原神角色

本文发布于:2024-02-27 20:09:29,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1765998.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:推断   角色   系统   MATLAB

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!