• 沒有找到結果。

控制規則類別與控制規則庫類別

第六章 模糊控制器的軟體模式策略

6.4 控制規則類別與控制規則庫類別

決策邏輯是模糊控制器運作的主要部份,主要是根據專家經驗來 制定規則,再做邏輯推論。在本論文裡,同樣的也將這個部份物件化,

首先,來看看決策邏輯中的最小單元-控制規則。

回顧一下,控制規則的表示法如下:

第 i 個規則:if s is Ai1 and v is Ai2 then vout is Bi

命 題 部 推 論 部

i = 1,2,……n

如上所示,命題部的模糊集合有兩個,推論部的模糊集合有一個,根 據這樣的表示法,我們可以訂定 FuzzyRule 類別:

class FuzzyRule {

public:

void SetIf_1(BaseFunc* basefunc); //設定第一個命題部的模糊集合 void SetIf_2(BaseFunc* basefunc); //設定第二個命題部的模糊集合 void SetThen(BaseFunc* basefunc); //設定推論部的模糊集合

Crisp* GetRuleCrisp(double membership); //以此規則的真實度求得明確值 double GetRuleMembership(double value1, double value2);

//求得規則的真實度(歸屬度)

private:

BaseFunc* m_pIf_1; //表示命題部第一個模糊集合 BaseFunc* m_pIf_2; //表示命題部第二個模糊集合 BaseFunc* m_pThen; //表示推論部模糊集合 };

如成員函式所命名的,FuzzyRule 類別主要是描述一個控制規則物件 要“負責”訂定命題部和推論部的模糊集合(也就是歸屬函數);“負 責”自行推算出規則的真實度(歸屬度);最後,“負責”以規則的 真實度,來反推明確值。

之所以一直強調“負責”這個名詞,是因為在物件導向的程式設

計裡,“物件為自己的行為負責”這樣的設計理念是很重要的。物件 應該總是知道它們自己的型別是什麼,在物件中的資料使它們可以知 道自己處在甚麼樣的狀態,而在物件中的程式碼可以使物件運作正常

(也就是它們應該要做的事情)。而除了 FuzzyRule 類別,之前我們 所訂定的類別也是一直以這樣的方式規劃。

有了 FuzzyRule 類別來描述控制規則,我們也訂定了負責收集控 制規則的 FuzzyRuleBase 類別:

#include<vector> //即將使用 vector 資料結構,引入該表頭檔

class FuzzyRuleBase {

public:

void AddRule(BaseFunc* if_1, BaseFunc* if_2, BaseFunc* then);

//收集控制規則物件 vector<FuzzyRule*> GetRuleBase(); //取得控制規則庫(為一 vector)

private:

vector<FuzzyRule*> m_RuleVec; //負責記錄所有控制規則 };

其實 FuzzyRuleBase 物件擁有像 FuzzyValueBuilder 物件的功能,不過 差別在於 FuzzyRuleBase 物件只需收集 FuzzyRule 物件就好,而不是 像 FuzzyValueBuilder 物件除了建立模糊變數,也要負責規劃內部佈 局,最後還得負責把成品交給 Director。

FuzzyRuleBase 物件收集 FuzzyRule 物件的方式是以 vector 這個 循序容器來進行,有別於 map 這個聯合容器,vector 就一般的陣列

(Array)一樣,只不過比陣列更加的有彈性,vector 擁有動態成長的 能力,。除此之外,vector 也有許多的行為(成員函式),例如,每 一個 vector 物件都知道自己內部存有多少筆資料(元素),指定刪除 或增加某筆資料,改變自己的能存的資料最大量等等(約二十個成員 函式)。而且這些行為都可以程式執行時期做到,這是只能在程式編 譯時期才能改變大小的一般陣列所無法達成的。

其實,除了 vector,循序容器還有 list,因為我們希望在做決策 推論時,速度上能儘可能快速,所以 vector 符合我們的要求。

Vector 如何使用呢? 以下是 FuzzyRuleBase 類別中,成員函式 AddRule 的實作部份:

void FuzzyRuleBase::AddRule(BaseFunc* if_1, BaseFunc* if_2, BaseFunc* then) {

FuzzyRule* fuzzyRule = new FuzzyRule;

fuzzyRule->SetIf_1(if_1);

fuzzyRule->SetIf_2(if_2);

fuzzyRule->SetThen(then);

m_RuleVec.push_back(fuzzyRule);

}

AddRule 函式在得到命題部與推論部的歸屬函數後,首先動態生成 FuzzyRule 物件,FuzzyRule 物件把命題部和推論部歸屬函數記錄好 後,FuzzyRuleBase 物件負責收集控制規則的資料成員 m_RuleVec(為

加入 m_RuleVec 這個 vector 中。