• 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. % 1雷之国度-->2稻妻
    3. % 3港口城市 + 4神不管事-->5璃月
    4. % 稻妻+ 6将领 -->7稻妻军事(心海、五郎、九条)
    5. % 稻妻+ 8摸鱼 -->9快乐生活(早柚、宵宫)
    6. % 璃月+10管理者-->11璃月七星(刻晴、凝光)
    7. % 璃月+12干饭人-->13人间烟火(胡桃、香菱)
    8. % 璃月+14老婆-->(36申鹤)
    9. % 稻妻军事 + 15渊下宫入口 = 16珊瑚宫
    10. % 稻妻军事 + 17天领奉行 = 27九条
    11. % 珊瑚宫 + 18观赏鱼 =28心海
    12. % 珊瑚宫 + 19宫司大人的玩物 = 29五郎
    13. % 快乐生活+20烟花 =30宵宫
    14. % 快乐生活+21睡觉 =31早柚
    15. % 璃月七星+22雷厉风行=32刻晴
    16. % 璃月七星+23天权=33凝光
    17. % 人间烟火+24平板电脑+25往生堂=34胡桃
    18. % 人间烟火+26厨子=35香菱
    19. %% 数据结构定义
    20. s{1}.C = '雷之国度';%单数值推断
    21. s{3}.C = '港口城市';%单数值推断
    22. s{4}.C = '神不管事';%单数值推断
    23. s{6}.C = '将领';%单数值推断
    24. s{8}.C = '摸鱼';%单数值推断
    25. s{10}.C = '管理者';%单数值推断
    26. s{12}.C = '干饭人';%单数值推断
    27. s{14}.C = '老婆';%单数值推断
    28. s{15}.C = '渊下宫入口';%单数值推断
    29. s{17}.C = '天领奉行';%单数值推断
    30. s{18}.C = '观赏鱼';%单数值推断
    31. s{19}.C = '宫司大人的玩物';%单数值推断
    32. s{20}.C = '烟花';%单数值推断
    33. s{21}.C = '睡觉';%单数值推断
    34. s{22}.C = '雷厉风行';%单数值推断
    35. s{23}.C = '天权';%单数值推断
    36. s{24}.C = '平板电脑';%单数值推断
    37. s{25}.C = '往生堂';%单数值推断
    38. s{26}.C = '厨子';%单数值推断
    39. % 中间结论模块,只能有前方已知模块推出 7个中间结论
    40. s{2}.C = '稻妻';
    41. s{5}.C = '璃月';
    42. s{7}.C = '稻妻军事';
    43. s{9}.C = '快乐生活';
    44. s{11}.C = '璃月七星';
    45. s{13}.C = '人间烟火';
    46. s{16}.C = '珊瑚宫';
    47. % 最终结论有10个角色
    48. s{28}.C = '心海';
    49. s{29}.C = '五郎';
    50. s{27}.C = '九条';
    51. s{31}.C = '早柚';
    52. s{30}.C = '宵宫';
    53. s{32}.C = '刻晴';
    54. s{33}.C = '凝光';
    55. s{34}.C = '胡桃';
    56. s{35}.C = '香菱';
    57. s{36}.C = '申鹤';
    58. %一共36条信息,将结构体中T模块为int型全部定义为0
    59. k=1,n=36;
    60. while(k<=n)
    61. s{k}.T=0;
    62. k=k+1;
    63. end
    64. %%更好的公理系统读入方式
    65. disp('【产生式系统 · 原神角色识别】 基本已知条件如下\n');
    66. disp('1-雷之国度 3-港口城市 4-神不管事 6-将领\n');
    67. disp('8-摸鱼 10-管理者 12-干饭人 14-老婆(申鹤)\n');
    68. disp('15-渊下宫入口 17-天领奉行 18-观赏鱼 19-八重宫司大人的玩物\n');
    69. disp('20-长野原烟花 21-睡觉 22-雷厉风行 23-璃月七星·天权\n');
    70. disp('24-平胸 25-往生堂 26-厨师\n');
    71. disp('\n');
    72. disp('\n');
    73. t1=input('输入已知条件的编号,以0结束\n请输入:');
    74. while(t1~=0)
    75. s{t1}.T=1;
    76. t1=input('请输入:');
    77. end
    78. %% 打印初始的状态
    79. % print initial status
    80. fprintf('初始状态为:\n');
    81. for i = 1 : length(s)
    82. if s{i}.T == 1
    83. fprintf(s{i}.C);
    84. fprintf(',') ;
    85. end
    86. end
    87. fprintf('\n');
    88. %%推断开始
    89. c = 1;
    90. while c == 1
    91. c = 0; % 有变化就会被置位1,如果没变化就置位0然后自动退出
    92. % 角色国度推断
    93. if pd(s, '雷之国度')
    94. [c, s] = CT(s, '稻妻' );
    95. end
    96. if pd(s, '港口城市') && pd(s, '神不管事')
    97. [c, s] = CT(s, '璃月' );
    98. end
    99. % 角色类型推断
    100. if pd(s, '稻妻') && pd(s, '将领')
    101. [c, s] = CT(s, '稻妻军事' );
    102. end
    103. if pd(s, '稻妻') && pd(s, '摸鱼')
    104. [c, s] = CT(s, '快乐生活' );
    105. end
    106. if pd(s, '璃月') && pd(s, '管理者')
    107. [c, s] = CT(s, '璃月七星' );
    108. end
    109. if pd(s, '璃月') && pd(s, '干饭人')
    110. [c, s] = CT(s, '人间烟火' );
    111. end
    112. if pd(s, '璃月') && pd(s, '老婆')
    113. [c, s] = CT(s, '申鹤' );
    114. end
    115. if pd(s, '稻妻军事') && pd(s, '渊下宫入口')
    116. [c, s] = CT(s, '珊瑚宫' );
    117. end
    118. if pd(s, '稻妻军事') && pd(s, '天领奉行')
    119. [c, s] = CT(s, '九条' );
    120. end
    121. if pd(s, '珊瑚宫') && pd(s, '观赏鱼')
    122. [c, s] = CT(s, '心海' );
    123. end
    124. if pd(s, '珊瑚宫') && pd(s, '宫司大人的玩物')
    125. [c, s] = CT(s, '五郎' );
    126. end
    127. if pd(s, '快乐生活') && pd(s, '烟花')
    128. [c, s] = CT(s, '宵宫' );
    129. end
    130. if pd(s, '快乐生活') && pd(s, '睡觉')
    131. [c, s] = CT(s, '早柚' );
    132. end
    133. if pd(s, '璃月七星') && pd(s, '雷厉风行')
    134. [c, s] = CT(s, '刻晴' );
    135. end
    136. if pd(s, '璃月七星') && pd(s, '天权')
    137. [c, s] = CT(s, '凝光' );
    138. end
    139. if pd(s, '人间烟火') && pd(s, '厨子')
    140. [c, s] = CT(s, '香菱' );
    141. end
    142. if pd(s, '人间烟火') && pd(s, '平板电脑') && pd(s, '往生堂')
    143. [c, s] = CT(s, '胡桃' );
    144. end
    145. if c == 1
    146. fprintf('状态变化为:\n');
    147. for i = 1 : length(s)
    148. if s{i}.T == 1
    149. fprintf(s{i}.C);
    150. fprintf(',');
    151. end
    152. end
    153. fprintf('\n');
    154. end
    155. end

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

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

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

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

  • 相关阅读:
    【小程序】统计字符
    postgresSQL多种字符串分割及查询汇总
    React路由组件传参的三种方式——params、search、state
    iTOP-RK3399开发板驱动模块传数组
    mybatis-plus 标准分页功能
    人工智能-线性神经网络
    TiDB 集群监控部署
    【21-业务开发-基础业务-商品模块-分类管理-商品系统三级分类的新增类别前后端代码实现-商品系统三级分类的更新类别前后端代码实现-之前错误的Bug修正】
    PIE-engine 教程 ——新疆石河子市棉花种植面积提取(阈值法)案例分析
    游戏后端服务器架构中的Redis应用:限流应用
  • 原文地址:https://blog.csdn.net/qq_21893163/article/details/127560601