模糊系統架構和簡單實現--AForge.NET框架的使用(四)


先說一下,為什么題目是簡單實現,因為我實在沒有弄出好的例子。

我原來用AForge.net做的項目中的模糊系統融入了神經網絡和向量機,沒法抽出來當例子,就用了個最老的自動車輛的例子。

模糊系統(Fuzzy System)架構

前面零零散散說來一下有關模糊系統和模糊理論的東西,這里來個總結。

模煳系統的基本架構如圖8.1所示,其中主要的功能方塊包括:(1)模煳化機構、(2)模煳規則庫、(3)模煳推論引擎、以及(4)去模煳化機構。

fuzzy4-1

模糊化機構是有關模糊集合和隸屬度函數的內容。

模糊規則前文也有提及,去模糊化只涉及了重心法一種,這里簡單說一下模糊推理引擎。

模糊推理引擎是模煳系統的核心,它可以藉由近似推論或模煳推論的進行,來模擬人類的思考決策模式,以達到解決問題的目地。

比如:

前提(premise)一:x is A’

前提(premise)二:if x is A,y is B

結論:y is B’

fuzzy4-2

模糊推理系統的簡單實現

在AForge.Net中的對應類是InferenceSystem。

在程序實現中一個模糊推理系統(Fuzzy Inference System )由數據庫(Database)和規則庫(Rulebase)組成,一般操作如下:

1.獲取數值輸入

2.通過數據庫(Database)將數值輸入轉為語意含義

3.驗證規則庫(Rulebase)中的哪些規則被輸入激活

4.組合被激活的規則,得到模糊輸出(Fuzzy Output)

5.去模糊化(實現IDefuzzifier接口)

下面看看例子,這個例子是關於控制車輛避免正面沖撞的系統。

輸入為距離,論域[0,120],隸屬度函數

fuzzy4-6

輸出為角度,論域[-10,50],隸屬度函數

fuzzy4-7

核心代碼:

// 隸屬度函數(距離) 
FuzzySet fsNear = new FuzzySet("Near",
new TrapezoidalFunction(15, 50, TrapezoidalFunction.EdgeType.Right));
FuzzySet fsMedium = new FuzzySet("Medium",
new TrapezoidalFunction(15, 50, 60, 100));
FuzzySet fsFar = new FuzzySet("Far",
new TrapezoidalFunction(60, 100, TrapezoidalFunction.EdgeType.Left));

//繪制圖像
int length1 =(int) (chart1.RangeX.Max - chart1.RangeX.Min);
double[,] NearValues = new double[length1, 2];
for (int i = (int)chart1.RangeX.Min; i < chart1.RangeX.Max; i++)
{
NearValues[i, 0] = i;
NearValues[i, 1] = fsNear.GetMembership(i);
}
double[,] MediumValues = new double[length1, 2];
for (int i = (int)chart1.RangeX.Min; i < chart1.RangeX.Max; i++)
{
MediumValues[i, 0] = i;
MediumValues[i, 1] = fsMedium.GetMembership(i);
}
double[,] FarValues = new double[length1, 2];
for (int i = (int)chart1.RangeX.Min; i < chart1.RangeX.Max; i++)
{
FarValues[i, 0] = i;
FarValues[i, 1] = fsFar.GetMembership(i);
}
chart1.UpdateDataSeries("Near", NearValues);
chart1.UpdateDataSeries("Medium", MediumValues);
chart1.UpdateDataSeries("Far", FarValues);

// 距離(輸入)
LinguisticVariable lvFront = new LinguisticVariable("FrontalDistance", 0, 120);
lvFront.AddLabel(fsNear);
lvFront.AddLabel(fsMedium);
lvFront.AddLabel(fsFar);


// 隸屬度函數
FuzzySet fsZero = new FuzzySet("Zero",
new TrapezoidalFunction(-10, 5, 5, 10));
FuzzySet fsLP = new FuzzySet("LittlePositive",
new TrapezoidalFunction(5, 10, 20, 25));
FuzzySet fsP = new FuzzySet("Positive",
new TrapezoidalFunction(20, 25, 35, 40));
FuzzySet fsVP = new FuzzySet("VeryPositive",
new TrapezoidalFunction(35, 40, TrapezoidalFunction.EdgeType.Left));

//繪制圖像
int length2 = (int)(chart2.RangeX.Max - chart2.RangeX.Min);
double[,] ZeroValues = new double[length2, 2];
for (int i = (int)chart2.RangeX.Min; i < chart2.RangeX.Max; i++)
{
ZeroValues[i + 10, 0] = i;
ZeroValues[i + 10, 1] = fsZero.GetMembership(i);
}
double[,] LittlePositiveValues = new double[length2, 2];
for (int i = (int)chart2.RangeX.Min; i < chart2.RangeX.Max; i++)
{
LittlePositiveValues[i + 10, 0] = i;
LittlePositiveValues[i + 10, 1] = fsLP.GetMembership(i);
}
double[,] PositiveValues = new double[length2, 2];
for (int i = (int)chart2.RangeX.Min; i < chart2.RangeX.Max; i++)
{
PositiveValues[i + 10, 0] = i;
PositiveValues[i + 10, 1] = fsP.GetMembership(i);
}
double[,] VeryPositiveValues = new double[length2, 2];
for (int i = (int)chart2.RangeX.Min; i < chart2.RangeX.Max; i++)
{
VeryPositiveValues[i + 10, 0] = i;
VeryPositiveValues[i + 10, 1] = fsVP.GetMembership(i);
}
chart2.UpdateDataSeries("Zero", ZeroValues);
chart2.UpdateDataSeries("LittlePositive", LittlePositiveValues);
chart2.UpdateDataSeries("Positive", PositiveValues);
chart2.UpdateDataSeries("VeryPositive", VeryPositiveValues);

//角度
LinguisticVariable lvAngle = new LinguisticVariable("Angle", -10, 50);
lvAngle.AddLabel(fsZero);
lvAngle.AddLabel(fsLP);
lvAngle.AddLabel(fsP);
lvAngle.AddLabel(fsVP);

//設置數據庫
Database fuzzyDB = new Database();
fuzzyDB.AddVariable(lvFront);
fuzzyDB.AddVariable(lvAngle);

// 創建模糊推理系統
InferenceSystem IS = new InferenceSystem(fuzzyDB, new CentroidDefuzzifier(1000));

// 直行規則
IS.NewRule("Rule 1", "IF FrontalDistance IS Far THEN Angle IS Zero");
// 左轉規則
IS.NewRule("Rule 2", "IF FrontalDistance IS Near THEN Angle IS Positive");

//開始推理

// 設定輸入
IS.SetInput("FrontalDistance",float.Parse(inputBox.Text));

//打印輸出
try
{
float newAngle = IS.Evaluate("Angle");
outputBox.Text = newAngle.ToString();
}
catch (Exception ex)
{
MessageBox.Show("error ===> "+ex.Message);
}

效果:

fuzzy4-3

fuzzy4-4

fuzzy4-5

如果要輸出模糊結論可以使用:

FuzzyOutput fuzzyOutput = IS.ExecuteInference("Angle");

foreach (FuzzyOutput.OutputConstraint oc in fuzzyOutput.OutputList)
{
Console.WriteLine(oc.Label + " - " + oc.FiringStrength.ToString());
}

fuzzy4-8

模糊推理系統的擴展和完善

借助AForge.Net我們可以很快構建一個系統,但是AForge.Net也不是十全十美的。

首先它的合成運算子沒有實現完全,有些常用的,比如最大邊界算子就沒有。

其次其去模糊化的實現只有一種,可以考慮實現自己補充一下算法:

1.最大平均法 (modified mean of maxima defuzzifier)

fuzzy4-9

2.修正型最大平均法 (modified mean of maxima defuzzifier)

fuzzy4-10

3.中心平均法 (modified center average defuzzifier)
fuzzy4-11

4.修正型重心法 (modified center average defuzzifier)

fuzzy4-12

5.權重式平均法(weighted average method)結合了啟動強度,使用更為廣泛

fuzzy4-13
不過AForge.Net的接口和設計比較好,擴展也是很方便的。

其實模糊系統的話,matlab也是可以做到的,但是一來matlab不開源,二來擴展確實不方便,所以沒有使用,如果確實沒有替代品,可以考慮混編。

模糊系統的使用本身也有一些不方便,主要是規則庫的建立。

第一種也是最直接的方式就是經由詢問人類專家而得。但是人類專家往往無法完整地提供所有必需的語意式模煳規則,以致於規則庫的不完全。

而模糊系統的效果主要受規則和隸屬度函數影響,所以有時候規則庫的不全對系統的效果是毀滅性傷害。

第二種取得語意式模煳規則的方式,則是經由訓練法則,從數值型資料(numerical data)中取得模煳規則,此種作法往往牽涉如何分割輸入及輸出變數空間。常用的就是神經網絡。

AForge.Net也有神經網絡相關的東西,所以使用起來很方便的。

 

最后附上整個項目的下載地址:http://www.ctdisk.com/file/4512079


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM