产生式系统用来描述若干个不一样的以一个基本概念为基础的系统,这个基本概念就是产生式规则或产生式条件和操做对。在产生式系统中,论域的知识分为两部分:用事实表示静态知识;用产生式规则表示推理过程和行为。算法
事实库是程序开始的时候直接选择的,根据用户的须要选择,即要求用户选择球星的特征进行识别。若是未识别出来,则提示输入有误。数组
球星的特征以下:ide
西部第八 | 西部第三 | 东部第四 | 东部第一 | 西部第一 | |
火箭队 | 雷霆队 | 骑士队 | 热火队 | 勇士队 | |
35号 | 13号 | 12号 | 30号 | 3号 | 23号 |
前锋 | 后卫 | 中锋 | |||
杜兰特 | 哈登 | 霍华德 | 库里 | 韦德 | 詹姆斯 |
即创建产生式规则,采用产生中间试试的方法,便于创建和使用规则。spa
为了方便设计,咱们把要是别的球星限制在6个,这样所需的产生式规则就比较少,本算法一共有11种规则:设计
R1:若是是西部第八,则球星为火箭队。code
R2:若是是西部第三,则球星是雷霆队。blog
R3:若是是东部第一,则球星是骑士队。事件
R4:若是是东部第四,则球星是热火队。it
R5:若是是西部第一,则球星是勇士队。io
R6:若是是雷霆队,且为35号且为前锋,则球星为杜兰特。
R7:若是是火箭队,且为13号且为后卫,则球星为哈登。
R8:若是是火箭队,且为12号且为中锋,则球星为霍华德。
R9:若是是勇士队,且为30号且为后卫,则球星为库里。
R10:若是是热火队,且为3号且为后卫,则球星为韦德。
R11:若是是骑士队,且为23号且为前锋,则球星为詹姆斯。
从已知事实出发,经过规则库求得结论,或者成为数据驱动方式,推理过程为:
规则集中的规则前件与事实库中的事件进行匹配,获得符合要求的规则集,将规则集的后件替换到新的事实集做为一条新的事实集,重复这个过程,知道达到最终目标。
好比:西部第八 12号 中锋。则系统推理过程以下:
事实集为 西部第八 12号 中锋。
先从规则库中匹配R1,事实集变为 火箭队 12号 中锋。
再次匹配规则集R8,得到球星霍华德。
/** * 初始化规则库 * 每条规则为一个数组 * 数组最后一个元素为结果,其他元素为条件 **/ ArrayList mRule1 = new ArrayList() { "西部第八", "火箭队" }; ArrayList mRule2 = new ArrayList() { "西部第三", "雷霆队" }; ArrayList mRule3 = new ArrayList() { "东部第一", "骑士队" }; ArrayList mRule4 = new ArrayList() { "东部第四", "热火队" }; ArrayList mRule5 = new ArrayList() { "西部第一", "勇士队" }; ArrayList mRule6 = new ArrayList() { "雷霆队", "35号", "前锋", "杜兰特" }; ArrayList mRule7 = new ArrayList() { "火箭队", "13号", "后卫", "哈登" }; ArrayList mRule8 = new ArrayList() { "火箭队", "12号", "中锋", "霍华德" }; ArrayList mRule9 = new ArrayList() { "勇士队", "30号", "后卫", "库里" }; ArrayList mRule10 = new ArrayList() { "热火队", "3号", "后卫", "韦德" }; ArrayList mRule11 = new ArrayList() { "骑士队", "23号", "前锋", "詹姆斯" };
for (int i = 0; i <= mR.Count - 2; i++) { bool t = ((IList)userChoose).Contains(mR[i]); if (t) { zhong.Add(mR[i]); ruleStr = ruleStr + "evidence('" + mR[i].ToString() + "')"; } if (t && i == mR.Count - 2) { for (int j = 0; j < zhong.Count; j++) { userChoose.Remove(zhong[j]); } userChoose.Add(mR[mR.Count - 1]); if (mR[mR.Count - 1].ToString() == "火箭队" || mR[mR.Count - 1].ToString() == "雷霆队" || mR[mR.Count - 1].ToString() == "骑士队" || mR[mR.Count - 1].ToString() == "热火队" || mR[mR.Count - 1].ToString() == "勇士队") { ruleStr = "itIs('" + mR[mR.Count - 1].ToString() + "'):-" + ruleStr; } else { ruleStr = "starIs(" + mR[mR.Count - 1].ToString() + "):-" + ruleStr; } zhong.Clear(); ruleStrs = ruleStrs +"\n"+ ruleStr ; } if (!t) { zhong.Clear(); ruleStr = ""; break; } }
本系统的规则库是静态的,不能很好的进行增删改操做,这使得在规则的状况下不能及时改变,可是该系统已经能基本知足,对输入的事实给出相应的回答,判断是那个球星。理解了生产式系统结构原理与实际应用。可以掌握生产式规则表示及规则库组件的实现方法。熟悉和掌握了生产式系统的运行机制,掌握了基于规则推理的基本方法。