人工智能-球星產生式系統實驗報告

實驗目的

  1. 理解生產式系統結構原理與實際應用。
  2. 掌握生產式規則表示及規則庫組件的實現方法。
  3. 熟悉和掌握生產式系統的運行機制,掌握基於規則推理的基本方法。

實驗原理

       產生式系統用來描述若干個不一樣的以一個基本概念爲基礎的系統,這個基本概念就是產生式規則或產生式條件和操做對。在產生式系統中,論域的知識分爲兩部分:用事實表示靜態知識;用產生式規則表示推理過程和行爲。算法

實驗內容

  1. 創建本身的生產式系統(包括規則庫和事實),而後進行推理,便可以本身選擇事實,並基於原有的規則和輸入的事實進行推理。
  2. 建造球星識別系統,根據輸入的球星特徵判斷是哪一位球星或給出相應的回答。
  3. 算法設計

首先創建事實庫

  事實庫是程序開始的時候直接選擇的,根據用戶的須要選擇,即要求用戶選擇球星的特徵進行識別。若是未識別出來,則提示輸入有誤。數組

  球星的特徵以下: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;
                    }
                }

實驗總結

       本系統的規則庫是靜態的,不能很好的進行增刪改操做,這使得在規則的狀況下不能及時改變,可是該系統已經能基本知足,對輸入的事實給出相應的回答,判斷是那個球星。理解了生產式系統結構原理與實際應用。可以掌握生產式規則表示及規則庫組件的實現方法。熟悉和掌握了生產式系統的運行機制,掌握了基於規則推理的基本方法。

相關文章
相關標籤/搜索