• 沒有找到結果。

第八章 結論與未來展望

8.2 未來展望

本論文主要是在於強調以物件導向程式設計以及運用設計模式 來設計與發展軟體。所以在設計與發展的過程中,並沒有提及以下三 個部份:

1. 異常處理(Exception Handling)[18][19]

所謂的異常(Exception),是指程式在執行時期發生的不正常情 況,例如考慮以下的程式碼:

………//以上省略

MyControl->DoCreateFuzzyValue( ); //建立模糊變數 MyControl->DoCreateRule( ); //建立控制規則庫 MyControl->CreateDefuzzifier( ); //建立解模糊化物件

MyControl->ChooseAlgo(new CenterAvg); //選擇中心平均法

………//以下省略

如果在執行 DoCreateFuzzyValue 之前,先執行了 DoCreateRule

(也就是順序顛倒了),就會發生程式死當的情況。原因是未建 模糊變數之前,是無法建立控制規則庫的。然而,本論文中並沒 有針對諸如此類的異常狀況加以防範。

2. 使用者介面規劃

本論文中,不論是模糊變數的建立,或是控制規則的訂定,都是 在程式的編譯時期才可做設定的工作。而無法在執行時期時動態 的變更模糊變數的內容和增減控制規則。不過,如果要加上使用 者介面的話,為了避免使用者的操作失當,異常處理也就必須要 在考量之中了。

3. 輸入和輸出模糊變數的數量

本論文中,輸入變數為兩個,輸出變數則為一個,而控制規則的 基本格式也為命題部兩個歸屬函數而推論部為一個歸屬函數。如 果今天所要處理的案例,輸入變數為三個,就無法利用類別庫建 立出能處理此案例的模糊控制器物件了。

以上三點是本論文中並未考量的地方,其實這樣的問題是可以解 決的,而在許許多多的設計模式中,也有著解決上述情境的模式存在 著。而將來的發展方向,就是令此類別庫能夠應付更多的外來變化,

而使它能進化到 Application Framework 的程度。

註:凝聚性強、組織化強的類別庫就可稱為 Application Framework。而比較 著名的,如徵軟的 MFC 以及 Borland 的 VCL。

參考文獻

[1] Grady Booch. “Object-Oriented Analysis and Design with Applications”. Benjamin/Cummings, Redwood City, CA, 1994.

Second Edition.

[2] Christopher Alexander, Sara Ishikawa, Murray Silverstein, Max

Jacobson, Ingrid Fiksdahl-King, Shlomo Angel. “A Pattern Language”.

Oxford University Press, New York, 1977.

[3] Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides. “Design Patterns: Elements of Reusable Object-Oriented Software”.

Addison-Wesley, 1995. P163-173.

[4] Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides. “Design Patterns: Elements of Reusable Object-Oriented Software”.

Addison-Wesley, 1995. P315-323.

[5] Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides. “Design Patterns: Elements of Reusable Object-Oriented Software”.

Addison-Wesley, 1995. P305-313.

[6] Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides. “Design Patterns: Elements of Reusable Object-Oriented Software”.

Addison-Wesley, 1995. P185-193.

[7] Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides. “Design Patterns: Elements of Reusable Object-Oriented Software”.

Addison-Wesley, 1995. P195-206.

[8] Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides. “Design Patterns: Elements of Reusable Object-Oriented Software”.

Addison-Wesley, 1995. P87-95.

[9] Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides. “Design Patterns: Elements of Reusable Object-Oriented Software”.

Addison-Wesley, 1995. P97-106.

[10] Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides.

“Design Patterns: Elements of Reusable Object-Oriented Software”.

Addison-Wesley, 1995. P331-344.

[11] Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides.

“Design Patterns: Elements of Reusable Object-Oriented Software”.

Addison-Wesley, 1995. P233-242.

[12] Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides.

“Design Patterns: Elements of Reusable Object-Oriented Software”.

Addison-Wesley, 1995. P175-184.

[13] Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides.

“Design Patterns: Elements of Reusable Object-Oriented Software”.

Addison-Wesley, 1995. P207-217.

[14] L. A. Zadeh. “Fuzzy Sets”. Information and Control, Vol.8, 1965.

[15] L. A. Zadeh. “Similarity Relations and Fuzzy Orderings”.

Information Sciences,3, 1971.

[16] “A Practical Handbook of Software Construction”. Redmond : Microsoft Press, 1993. P81.

[17] “A Practical Handbook of Software Construction”. Redmond : Microsoft Press, 1993. P87.

[18] Stanley B. Lappman, Josee Lajoie. “C++ Primer”. Addison Wesley, 1998. Third Edition 中譯本:侯捷 譯. 碁峰資訊. P547-570 [19] Herb Sutter. “Exceptional C++”. Addison Wesley, 1999

附錄 1 各類別的宣告(function.h)

#include<string> //引入 string 字串型式標頭檔

using namespace std; //使用標準名稱空間

struct Crisp //表示明確值的結構宣告(內含最大和最小明確值,可能兩者相同)

{

double m_min;

double m_max;

};

double Min(double value1, double value2); //比較兩個數字,並取小值的函式宣告 double Max(double value1, double value2); //比較兩個數字,並取大值的函式宣告

//--- /* BaseFunc 類別,定義歸屬函數的基本特性 */

//--- class BaseFunc

{ private:

string m_FuncName; //記錄此歸屬函數的名稱 double m_Min; //記錄函數最小值

double m_Max; //記錄函數最大值 public:

void SetFuncName(string); //設定歸屬函數名稱 string GetFuncName( ); //取得歸屬函數名稱

void SetMinValue(double Min); //設定歸屬函數範圍最小值 double GetMinValue( ); //取得歸屬函數範圍最小值

void SetMaxValue(double Max); //設定歸屬函數範圍最大值 double GetMaxValue( ); //取得歸屬函數範圍最大值

virtual void DoSetLZeroValue(double Value){}

virtual double DoGetLZeroValue( ){return 0;}

virtual void DoSetLOneValue(double Value){}

virtual double DoGetLOneValue( ){return 0;}

virtual void DoSetRZeroValue(double Value){}

virtual double DoGetRZeroValue( ){return 0;}

virtual void DoSetROneValue(double Value){}

virtual double DoGetROneValue( ){return 0;}

virtual void DoSetMOneValue(double Value){}

virtual double DoGetMOneValue( ){return 0;}

virtual Crisp* DoGetCrisp(double membership){return 0;}

virtual double DoGetResult(double Value){return 0;}

};

//---

//--- /* ZType 類別,定義 Z-Type 歸屬函數 */

//--- class ZType : public BaseFunc

{ private:

double m_MembershipZero;

double m_MembershipOne;

public:

virtual void DoSetRZeroValue(double Value);

virtual double DoGetRZeroValue( );

virtual void DoSetROneValue(double Value);

virtual double DoGetROneValue( );

virtual Crisp* DoGetCrisp(double membership);

virtual double DoGetResult(double Value);

};

//---

//--- /* SType 類別,定義 S-Type 歸屬函數 */

//--- class SType : public BaseFunc

{ private:

double m_MembershipZero;

double m_MembershipOne;

public:

virtual void DoSetLZeroValue(double Value);

virtual double DoGetLZeroValue( );

virtual void DoSetLOneValue(double Value);

virtual double DoGetLOneValue( );

virtual Crisp* DoGetCrisp(double membership);

virtual double DoGetResult(double Value);

};

//---

//--- /* PiType 類別,定義 Pi-Type 歸屬函數 */

//--- class PiType : public BaseFunc

{ private:

double m_LMembershipZero;

double m_LMembershipOne;

double m_RMembershipZero;

double m_RMembershipOne;

public:

virtual void DoSetLZeroValue(double Value);

virtual double DoGetLZeroValue( );

virtual void DoSetLOneValue(double Value);

virtual double DoGetLOneValue( );

virtual void DoSetRZeroValue(double Value);

virtual double DoGetRZeroValue( );

virtual void DoSetROneValue(double Value);

virtual double DoGetROneValue( );

virtual Crisp* DoGetCrisp(double membership);

virtual double DoGetResult(double Value);

};

//---

//--- /* LambdaType 類別,定義 Lambda-Type 歸屬函數 */

//--- class LambdaType : public BaseFunc

{ private:

double m_LMembershipZero;

double m_RMembershipZero;

double m_MMembershipOne;

public:

virtual void DoSetLZeroValue(double Value);

virtual double DoGetLZeroValue( );

virtual void DoSetRZeroValue(double Value);

virtual double DoGetRZeroValue( );

virtual void DoSetMOneValue(double Value);

virtual double DoGetMOneValue( );

virtual Crisp* DoGetCrisp(double membership);

virtual double DoGetResult(double Value);

};

//---

//--- /* FuzzyValue 類別,定義模糊變數的特性*/

//---

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

typedef int TypeID; //自定資料型別

#define ZTYPE 1 //將常數“ZTYPE”定義為 1

#define STYPE 2 //將常數“STYPE”定義為 2

#define PITYPE 3 //將常數“PITYPE”定義為 3

#define LAMBDATYPE 4 //將常數“LAMBDATYPE”定義為 4

class FuzzyValue {

public:

void SetFuzzyValueName(string FuzzyValueName); //設定模糊變數名稱 string GetFuzzyValueName( ); //取得模糊變數名稱

void SetFuzzyValueMin(double min); //設定模糊變數數值範圍最小值 void SetFuzzyValueMax(double max); //設定模糊變數數值範圍最大值 double GetFuzzyValueMin( ); //取得模糊變數數值範圍最小值 double GetFuzzyValueMax( ); //取得模糊變數數值範圍最大值

BaseFunc* CreateFunc(TypeID FuncID, string FuncName, double min, double max);

//新增歸屬函數 void AddFunc(BaseFunc* Func); //加入歸屬函數至 MAP

BaseFunc* GetFunc(string FuncName); //取得歸屬函數

void SetZTypeFunc(string FuncName, double zero, double one); //修正 ZType 歸屬函數 void SetSTypeFunc(string FuncName, double zero, double one); //修正 SType 歸屬函數 void SetPiTypeFunc(string FuncName, double lzero, double lone, double rone, double rzero);

//修正 PiType 歸屬函數 void SetLambdaTypeFunc(string FuncName, double lzero, double mone, double rzero);

//修正 LambdaType 歸屬函數 private:

map<string, BaseFunc*> m_FuncMap;

string m_FuzzyValueName;

double m_min;

double m_max;

};

//---

//--- /* FuzzyValueBuilder 類別,負責模糊變數的生成程序 */

//--- class FuzzyValueBuilder

{ public:

void BuildFuzzyValue(string ValueName, double min, double max); //生成模糊變數 void BuildZTypeFunc(string FuncName, double one, double zero);

//生成 ZType 歸屬函數,並加入模糊變數中 void BuildSTypeFunc(string FuncName, double zero, double one);

//生成 SType 歸屬函數,並加入模糊變數中 void BuildPiTypeFunc(string FuncName, double lzero, double lone, double rone, double rzero); //生成 PiType 歸屬函數,並加入模糊變數中

void BuildLambdaTypeFunc(string FuncName, double lzero, double mone, double rzero);

//生成 LambdaType 歸屬函數,並加入模糊變數 FuzzyValue* GetFuzzyValue( ); //傳回已“組裝”好的模糊變數

private:

FuzzyValue* m_pCurrentFuzzyValue;

};

//---

//--- /* FuzzyRule 類別,描述控制規則的特性(限定命題部為雙變數)*/

//--- class FuzzyRule

{ public:

double GetRuleMembership(double value1, double value2); //求得規則的真實度(歸屬度)

Crisp* GetRuleCrisp(double membership); //以此規則的歸屬性求得明確值(兩個)

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

BaseFunc* m_pIf_1;

BaseFunc* m_pIf_2;

BaseFunc* m_pThen;

};

//---

//--- /* 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;

};

//---

//--- /* Algorithm 類別,解模糊化演算法的抽象介面 */

//--- class Algorithm

{ public:

virtual double GetResult(FuzzyRuleBase* RuleBase, double value1, double value2) = 0;

//純虛擬函式 };

//---

//--- /* CenterAvg 類別,中心平均法(Center Average Defuzzifier)*/

//--- class CenterAvg : public Algorithm

{ public:

virtual double GetResult(FuzzyRuleBase* RuleBase, double value1, double value2);

};

//---

//---

//ModMeanMax 類別,修正型最大平均法(Modified Mean of Maxima Defuzzifier)

//--- class ModMeanMax : public Algorithm

{ public:

virtual double GetResult(FuzzyRuleBase* RuleBase, double value1, double value2);

};

//---

//--- /* Defuzzifier 類別,負責解模糊化 */

//--- class Defuzzifier

{ public:

void LoadFuzzyRuleBase(FuzzyRuleBase* RuleBase); //讀取控制規則庫

void UseAlgorithm(Algorithm* Algorithm); //選擇解模糊化方法

double GetResult(double value1, double value2); //取得最終輸出的明確值 private:

Algorithm* m_pAlgorithm;

FuzzyRuleBase* m_pRuleBase;

};

//---

//--- /* FuzzyControl 類別,代表模糊控制器本體*/

//--- class FuzzyControl

{

protected:

FuzzyRuleBase* m_pFuzzyRuleBase;

Defuzzifier* m_pDefuzzifier;

FuzzyValue* m_pFirstValue;

FuzzyValue* m_pSecondValue;

FuzzyValue* m_pOutputValue;

public:

virtual void DoCreateFuzzyValue(){} //產生模糊變數(由子類別定義)

virtual void DoCreateRule(){} //產生控制規則(由子類別定義)

void CreateDefuzzifier(); //產生解模糊化物件

void ChooseAlgo(Algorithm* algorithm); //選擇解模糊化演算化物件

double CycleStart(double value1, double value2); //讀入輸入明確值,計算並產生輸出明確值 };

//---

附錄 2-1 BaseFunc 類別定義(BaseFunc.cpp)

#include "function.h"

void BaseFunc::SetFuncName(string FuncName) {

m_FuncName = FuncName;

}

string BaseFunc::GetFuncName( ) {

return m_FuncName;

}

void BaseFunc::SetMinValue(double Min) {

m_Min = Min;

}

double BaseFunc::GetMinValue( ) {

return m_Min;

}

void BaseFunc::SetMaxValue(double Max) {

m_Max = Max;

}

double BaseFunc::GetMaxValue ( ) {

return m_Max;

}

附錄 2-2 ZType 類別定義(ZType.cpp)

#include "function.h"

void ZType::DoSetRZeroValue(double Value) {

m_MembershipZero = Value;

}

double ZType::DoGetRZeroValue( ) {

return m_MembershipZero;

}

void ZType::DoSetROneValue(double Value) {

m_MembershipOne = Value;

}

double ZType::DoGetROneValue( ) {

return m_MembershipOne;

}

double ZType::DoGetResult(double Value) {

double Min = GetMinValue( );

double Max = GetMaxValue( );

double One = m_MembershipOne;

double Zero = m_MembershipZero;

if( Value>=Min && Value<=One ) {

return 1;

}

if(Value>=One && Value<=Zero ) {

return (Zero-Value)/(Zero-One);

}

if(Value>=Zero && Value<=Max) {

return 0;

}

return 0;

}

Crisp* ZType::DoGetCrisp(double membership) {

Crisp* tempCrisp = new Crisp;

tempCrisp->m_min = GetMinValue( );

tempCrisp->m_max = m_MembershipZero – (m_MembershipZero –m_MembershipOne) * membership;

return tempCrisp;

}

附錄 2-3 SType 類別定義(SType.cpp)

#include "function.h"

void SType::DoSetLZeroValue(double Value) {

m_MembershipZero = Value;

}

double SType::DoGetLZeroValue( ) {

return m_MembershipZero;

}

void SType::DoSetLOneValue(double Value) {

m_MembershipOne = Value;

}

double SType::DoGetLOneValue( ) {

return m_MembershipOne;

}

double SType::DoGetResult(double Value) {

double Min = GetMinValue( );

double Max = GetMaxValue( );

double One = m_MembershipOne;

double Zero = m_MembershipZero;

if( Value>=Min && Value<=Zero ) {

return 0;

}

if(Value>=Zero && Value<=One ) {

return (Value-Zero)/(One-Zero);

}

if(Value>=One && Value<=Max) {

return 1;

}

return 0;

}

Crisp* SType::DoGetCrisp(double membership) {

Crisp* tempCrisp = new Crisp;

tempCrisp->m_min = (m_MembershipOne – m_MembershipZero) * membership + m_MembershipZero;

tempCrisp->m_max = GetMaxValue( );

return tempCrisp;

}

附錄 2-4 PiType 類別定義(PiType.cpp)

#include "function.h"

void PiType::DoSetLZeroValue(double Value) {

m_LMembershipZero = Value;

}

double PiType::DoGetLZeroValue() {

return m_LMembershipZero;

}

void PiType::DoSetLOneValue(double Value) {

m_LMembershipOne = Value;

}

double PiType::DoGetLOneValue( ) {

return m_LMembershipOne;

}

void PiType::DoSetRZeroValue(double Value) {

m_RMembershipZero = Value;

}

double PiType::DoGetRZeroValue( ) {

return m_RMembershipZero;

}

void PiType::DoSetROneValue(double Value) {

m_RMembershipOne = Value;

}

double PiType::DoGetROneValue( ) {

return m_RMembershipOne;

}

double PiType::DoGetResult(double Value) {

double Min = GetMinValue( );

double Max = GetMaxValue( );

double LOne = m_LMembershipOne;

double LZero = m_LMembershipZero;

double ROne = m_RMembershipOne;

double RZero = m_RMembershipZero;

if( Value>=Min && Value<=LZero ) {

return 0;

}

if( Value>=LZero && Value<=LOne ) {

return (Value-LZero)/(LOne-LZero);

}

if( Value>=LOne && Value<=ROne ) {

return 1;

}

if(Value>=ROne && Value<=RZero ) {

return (RZero-Value)/(RZero-ROne);

}

if(Value>=RZero && Value<=Max) {

return 0;

} return 0;

}

Crisp* PiType::DoGetCrisp(double membership) {

Crisp* tempCrisp = new Crisp;

tempCrisp->m_min = (m_LMembershipOne – m_LMembershipZero) * membership + m_LMembershipZero;

tempCrisp->m_max = m_RMembershipZero – (m_RMembershipZero – m_RMembershipOne) * membership;

return tempCrisp;

}

附錄 2-5 LambdaType 類別定義(LambdaType.cpp)

#include "function.h"

void LambdaType::DoSetLZeroValue(double Value) {

m_LMembershipZero = Value;

}

double LambdaType::DoGetLZeroValue( ) {

return m_LMembershipZero;

}

void LambdaType::DoSetRZeroValue(double Value) {

m_RMembershipZero = Value;

}

double LambdaType::DoGetRZeroValue( ) {

return m_RMembershipZero;

}

void LambdaType::DoSetMOneValue(double Value) {

m_MMembershipOne = Value;

}

double LambdaType::DoGetMOneValue( ) {

return m_MMembershipOne;

}

double Lamb daType::DoGetResult(double Value) {

double Min = GetMinValue( );

double Max = GetMaxValue( );

double LZero = m_LMembershipZero;

double RZero = m_RMembershipZero;

double MOne = m_MMembershipOne;

if( Value>=Min && Value<=LZero ) {

return 0;

}

if( Value>=LZero && Value<=MOne ) {

return (Value-LZero)/(MOne-LZero);

}

if(Value>=MOne && Value<=RZero ) {

return (RZero-Value)/(RZero-MOne);

}

if(Value>=RZero && Value<=Max) {

return 0;

} return 0;

}

Crisp* LambdaType::DoGetCrisp(double membership) {

Crisp* tempCrisp = new Crisp;

tempCrisp->m_min = (m_MMembershipOne – m_LMembershipZero) * membership + m_LMembershipZero;

tempCrisp->m_max = m_RMembershipZero – (m_RMembershipZero - m_MMembershipOne) * membership;

return tempCrisp;

}

附錄 2-6 FuzzyValue 類別定義(FuzzyValue.cpp)

#include"function.h"

void FuzzyValue::SetFuzzyValueName(string FuzzyValueName) {

m_FuzzyValueName = FuzzyValueName;

}

string FuzzyValue::GetFuzzyValueName( ) {

return m_FuzzyValueName;

}

BaseFunc* FuzzyValue::CreateFunc(TypeID FuncID, string FuncName, double min, double max) {

BaseFunc *TempFunc;

switch(FuncID) {

case ZTYPE:

TempFunc = new ZType;

TempFunc->SetFuncName(FuncName);

TempFunc->SetMinValue(min);

TempFunc->SetMaxValue(max);

return TempFunc;

case STYPE:

TempFunc = new SType;

TempFunc->SetFuncName(FuncName);

TempFunc->SetMinValue(min);

TempFunc->SetMaxValue(max);

return TempFunc;

case PITYPE:

TempFunc = new PiType;

TempFunc->SetFuncName(FuncName);

TempFunc->SetMinValue(min);

TempFunc->SetMaxValue(max);

return TempFunc;

case LAMBDATYPE:

TempFunc = new LambdaType;

TempFunc->SetFuncName(FuncName);

TempFunc->SetMinValue(min);

TempFunc->SetMaxValue(max);

return TempFunc;

} }

void FuzzyValue::AddFunc(BaseFunc* Func) {

m_FuncMap[Func->GetFuncName( )] = Func;

}

BaseFunc* FuzzyValue::GetFunc(string FuncName) {

return m_FuncMap[FuncName];

}

void FuzzyValue::SetZTypeFunc(string FuncName, double zero, double one) {

BaseFunc* FuncTemp = m_FuncMap[FuncName];

FuncTemp ->DoSetROneValue(zero);

FuncTemp ->DoSetRZeroValue(one);

}

void FuzzyValue::SetSTypeFunc(string FuncName, double zero, double one) {

BaseFunc* FuncTemp = m_FuncMap[FuncName];

FuncTemp ->DoSetLZeroValue(zero);

FuncTemp ->DoSetLOneValue(one);

}

void FuzzyValue::SetPiTypeFunc(string FuncName, double lzero, double lone, double rone, double rzero) {

BaseFunc* FuncTemp = m_FuncMap[FuncName];

FuncTemp ->DoSetLZeroValue(lzero);

FuncTemp ->DoSetLOneValue(lone);

FuncTemp ->DoSetROneValue(rone);

FuncTemp ->DoSetRZeroValue(rzero);

}

void FuzzyValue::SetLambdaTypeFunc(string FuncName, double lzero, double mone, double rzero) {

BaseFunc* FuncTemp = m_FuncMap[FuncName];

FuncTemp ->DoSetLZeroValue(lzero);

FuncTemp ->DoSetMOneValue(mone);

FuncTemp ->DoSetRZeroValue(rzero);

}

void FuzzyValue::SetFuzzyValueMin(double min) {

m_min = min;

}

void FuzzyValue::SetFuzzyValueMax(double max) {

m_max = max;

}

double FuzzyValue::GetFuzzyValueMin( ) {

return m_min;

}

double FuzzyValue::GetFuzzyValueMax( ) {

return m_max;

}

附錄 2-7 FuzzyValueBuilder 類別定義(FuzzyValueBuilder.cpp)

#include"function.h"

void FuzzyValueBuilder::BuildFuzzyValue(string ValueName, double min, double max) {

m_pCurrentFuzzyValue = new FuzzyValue;

m_pCurrentFuzzyValue->SetFuzzyValueName(ValueName);

m_pCurrentFuzzyValue->SetFuzzyValueMin(min);

m_pCurrentFuzzyValue->SetFuzzyValueMax(max);

}

void FuzzyValueBuilder::BuildZTypeFunc(string FuncName, double one, double zero) {

double min = m_pCurrentFuzzyValue->GetFuzzyValueMin( );

double max = m_pCurrentFuzzyValue->GetFuzzyValueMax( );

m_pCurrentFuzzyValue->AddFunc(m_pCurrentFuzzyValue->CreateFunc(ZTYPE, FuncName, min, max));

m_pCurrentFuzzyValue->SetZTypeFunc(FuncName, one, zero);

}

void FuzzyValueBuilder::BuildSTypeFunc(string FuncName, double zero, double one) {

double min = m_pCurrentFuzzyValue->GetFuzzyValueMin( );

double max = m_pCurrentFuzzyValue->GetFuzzyValueMax( );

m_pCurrentFuzzyValue->AddFunc(m_pCurrentFuzzyValue->CreateFunc(STYPE, FuncName, min, max));

m_pCurrentFuzzyValue->SetSTypeFunc(FuncName, zero, one);

}

void FuzzyValueBuilder::BuildPiTypeFunc(string FuncName, double lzero, double lone, double rone, double rzero) {

double fmin = m_pCurrentFuzzyValue->GetFuzzyValueMin();

double fmax = m_pCurrentFuzzyValue->GetFuzzyValueMax();

m_pCurrentFuzzyValue->AddFunc(m_pCurrentFuzzyValue->CreateFunc(PITYPE, FuncName, fmin, fmax));

m_pCurrentFuzzyValue->SetPiTypeFunc(FuncName, lzero, lone, rone, rzero);

}

void FuzzyValueBuilder::BuildLambdaTypeFunc(string FuncName, double lzero, double mone, double rzero) {

double fmin = m_pCurrentFuzzyValue->GetFuzzyValueMin();

double fmax = m_pCurrentFuzzyValue->GetFuzzyValueMax();

m_pCurrentFuzzyValue->AddFunc(m_pCurrentFuzzyValue->CreateFunc(LAMBDATYPE, FuncName, fmin, fmax));

m_pCurrentFuzzyValue->SetLambdaTypeFunc(FuncName, lzero, mone, rzero);

}

FuzzyValue* FuzzyValueBuilder::GetFuzzyValue() {

return m_pCurrentFuzzyValue;

}

附錄 2-8 FuzzyRule 類別定義(FuzzyRule.cpp)

#include"function.h"

void FuzzyRule::SetIf_1(BaseFunc* basefunc) {

m_pIf_1 = basefunc;

}

void FuzzyRule::SetIf_2(BaseFunc* basefunc) {

m_pIf_2 = basefunc;

}

void FuzzyRule::SetThen(BaseFunc* basefunc) {

m_pThen = basefunc;

}

double FuzzyRule::GetRuleMembership(double value1, double value2) {

return Min(m_pIf_1->DoGetResult(value1), m_pIf_2->DoGetResult(value2));

}

Crisp* FuzzyRule::GetRuleCrisp(double membership) {

return m_pThen->DoGetCrisp(membership);

}

附錄 2-9 FuzzyRuleBase 類別定義(FuzzyRuleBase.cpp)

#include"function.h"

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);

}

vector<FuzzyRule*> FuzzyRuleBase::GetRuleBase() {

return m_RuleVec;

}

附錄 2-10 CenterAvg 類別定義(CenterAvg.cpp)

#include"function.h"

double CenterAvg::GetResult(FuzzyRuleBase* RuleBase, double value1, double value2) {

double result1 = 0;

double result2 = 0;

double membership;

Crisp crisp;

for(int index = 0 ; index < (RuleBase->GetRuleBase()).size() ; index++) {

membership = (RuleBase->GetRuleBase( ))[index]->GetRuleMembership(value1, value2);

crisp.m_min = ((RuleBase->GetRuleBase( ))[index]->GetRuleCrisp(membership))->m_min;

crisp.m_max = ((RuleBase->GetRuleBase( ))[index]->GetRuleCrisp(membership))->m_max;

result1 = result1 + membership * ((crisp.m_min + crisp.m_max)/2);

result2 = result2 + membership;

}

return result1/result2;

}

附錄 2-11 ModMeanMax 類別定義(ModMeanMax.cpp)

#include"function.h"

double ModMeanMax::GetResult(FuzzyRuleBase* RuleBase, double value1, double value2) {

double membership = 0;

double membershiptemp = 0;

Crisp crisp;

crisp.m_max = 0;

crisp.m_min = 0;

for(int index = 0 ; index < (RuleBase->GetRuleBase()).size() ; index++) {

membershiptemp = (RuleBase->GetRuleBase())[index]->GetRuleMembership(value1, value2);

if(membershiptemp > membership) {

crisp.m_min = ((RuleBase->GetRuleBase())[index]->GetRuleCrisp(membershiptemp))->m_min;

crisp.m_max = ((RuleBase->GetRuleBase())[index]->GetRuleCrisp(membershiptemp))->m_max;

}

membership = membershiptemp;

}

return (crisp.m_max + crisp.m_min) /2;

}

附錄 2-12 Defuzzifier 類別定義(Defuzzifier.cpp)

#include"function.h"

void Defuzzifier::LoadFuzzyRuleBase(FuzzyRuleBase* RuleBase) {

m_pRuleBase = RuleBase;

}

void Defuzzifier::UseAlgorithm(Algorithm* algorithm) {

m_pAlgorithm = algorithm;

}

double Defuzzifier::GetResult(double value1, double value2) {

return m_pAlgorithm->GetResult(m_pRuleBase, value1, value2);

}

附錄 2-13 FuzzyControl 類別定義(FuzzyControl.cpp)

#include"function.h"

double FuzzyControl::CycleStart(double value1, double value2) {

m_pDefuzzifier->LoadFuzzyRuleBase(m_pFuzzyRuleBase);

return m_pDefuzzifier->GetResult(value1,value2);

}

void FuzzyControl::ChooseAlgo(Algorithm* algorithm) {

m_pDefuzzifier->UseAlgorithm(algorithm);

}

void FuzzyControl::CreateDefuzzifier( ) {

m_pDefuzzifier = new Defuzzifier;

}

附錄 2-14 其它函式定義(Other.cpp)

#include"function.h"

double Min(double value1, double value2) {

if(value1<=value2) return value1;

else

return value2;

}

double Max(double value1, double value2) {

if(value1<=value2) return value2;

else

return value1;

}

附錄 3 類別庫使用實例(Main.cpp)

#include<iostream>

#include "function.h"

using namespace std;

class MyFuzzyControl : public FuzzyControl {

public:

virtual void DoCreateFuzzyValue() {

FuzzyValueBuilder FVBuilder;

FVBuilder.BuildFuzzyValue("Distance",0,1200);

FVBuilder.BuildZTypeFunc("VC",200,400);

FVBuilder.BuildLambdaTypeFunc("C",200,400,600);

FVBuilder.BuildLambdaTypeFunc("SF",400,600,800);

FVBuilder.BuildLambdaTypeFunc("F",600,800,1000);

FVBuilder.BuildSTypeFunc("VF",800,1000);

m_pFirstValue = FVBuilder.GetFuzzyValue();

FVBuilder.BuildFuzzyValue("Speed",0,600);

FVBuilder.BuildZTypeFunc("VLS",100,200);

FVBuilder.BuildLambdaTypeFunc("LS",100,200,300);

FVBuilder.BuildLambdaTypeFunc("MS",200,300,400);

FVBuilder.BuildLambdaTypeFunc("HS",300,400,500);

FVBuilder.BuildSTypeFunc("VHS",400,500);

m_pSecondValue = FVBuilder.GetFuzzyValue();

FVBuilder.BuildFuzzyValue("Output",0,600);

FVBuilder.BuildZTypeFunc("VLS",100,200);

FVBuilder.BuildLambdaTypeFunc("LS",100,200,300);

FVBuilder.BuildLambdaTypeFunc("MS",200,300,400);

FVBuilder.BuildLambdaTypeFunc("HS",300,400,500);

FVBuilder.BuildSTypeFunc("VHS",400,500);

m_pOutputValue = FVBuilder.GetFuzzyValue();

}

virtual void DoCreateRule() {

m_pFuzzyRuleBase = new FuzzyRuleBase;

m_pFuzzyRuleBase->AddRule(m_pFirstValue->GetFunc("VC"),

m_pSecondValue->GetFunc("VLS"), m_pOutputValue->GetFunc("VHS"));

m_pFuzzyRuleBase->AddRule(m_pFirstValue->GetFunc("C"),

m_pSecondValue->GetFunc("VLS"), m_pOutputValue->GetFunc("VHS"));

m_pFuzzyRuleBase->AddRule(m_pFirstValue->GetFunc("SF"),

m_pSecondValue->GetFunc("VLS"), m_pOutputValue->GetFunc("HS"));

m_pFuzzyRuleBase->AddRule(m_pFirstValue->GetFunc("F"),

m_pSecondValue->GetFunc("VLS"), m_pOutputValue->GetFunc("MS"));

m_pFuzzyRuleBase->AddRule(m_pFirstValue->GetFunc("VF"),

m_pSecondValue->GetFunc("VLS"), m_pOutputValue->GetFunc("VLS"));

m_pFuzzyRuleBase->AddRule(m_pFirstValue->GetFunc("VC"),

m_pSecondValue->GetFunc("LS"), m_pOutputValue->GetFunc("VHS"));

m_pFuzzyRuleBase->AddRule(m_pFirstValue->GetFunc("C"),

m_pSecondValue->GetFunc("LS"), m_pOutputValue->GetFunc("HS"));

m_pFuzzyRuleBase->AddRule(m_pFirstValue->GetFunc("SF"),

m_pSecondValue->GetFunc("LS"), m_pOutputValue->GetFunc("HS"));

m_pFuzzyRuleBase->AddRule(m_pFirstValue->GetFunc("F"),

m_pSecondValue->GetFunc("LS"), m_pOutputValue->GetFunc("MS"));

m_pFuzzyRuleBase->AddRule(m_pFirstValue->GetFunc("VF"),

m_pSecondValue->GetFunc("LS"), m_pOutputValue->GetFunc("VLS"));

m_pFuzzyRuleBase->AddRule(m_pFirstValue->GetFunc("VC"),

m_pSecondValue->GetFunc("MS"), m_pOutputValue->GetFunc("VHS"));

m_pFuzzyRuleBase->AddRule(m_pFirstValue->GetFunc("C"),

m_pSecondValue->GetFunc("MS"), m_pOutputValue->GetFunc("HS"));

m_pFuzzyRuleBase->AddRule(m_pFirstValue->GetFunc("SF"),

m_pSecondValue->GetFunc("MS"), m_pOutputValue->GetFunc("MS"));

m_pFuzzyRuleBase->AddRule(m_pFirstValue->GetFunc("F"),

m_pSecondValue->GetFunc("MS"), m_pOutputValue->GetFunc("LS"));

m_pFuzzyRuleBase->AddRule(m_pFirstValue->GetFunc("VF"),

m_pSecondValue->GetFunc("MS"), m_pOutputValue->GetFunc("VLS"));

m_pFuzzyRuleBase->AddRule(m_pFirstValue->GetFunc("VC"),

m_pSecondValue->GetFunc("HS"), m_pOutputValue->GetFunc("VHS"));

m_pFuzzyRuleBase->AddRule(m_pFirstValue->GetFunc("C"),

m_pSecondValue->GetFunc("HS"), m_pOutputValue->GetFunc("MS"));

m_pFuzzyRuleBase->AddRule(m_pFirstValue->GetFunc("SF"),