產生式系統用來描述若干個不一樣的以一個基本概念爲基礎的系統,這個基本概念就是產生式規則或產生式條件和操做對。在產生式系統中,論域的知識分爲兩部分:用事實表示靜態知識;用產生式規則表示推理過程和行爲。算法
事實庫是程序開始的時候直接選擇的,根據用戶的須要選擇,即要求用戶選擇球星的特徵進行識別。若是未識別出來,則提示輸入有誤。數組
球星的特徵以下: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; } }
本系統的規則庫是靜態的,不能很好的進行增刪改操做,這使得在規則的狀況下不能及時改變,可是該系統已經能基本知足,對輸入的事實給出相應的回答,判斷是那個球星。理解了生產式系統結構原理與實際應用。可以掌握生產式規則表示及規則庫組件的實現方法。熟悉和掌握了生產式系統的運行機制,掌握了基於規則推理的基本方法。