原文:模糊系统架构和简单实现--AForge.NET框架的使用(四)

先说一下,为什么题目是简单实现,因为我实在没有弄出好的例子。

我原来用AForge.net做的项目中的模糊系统融入了神经网络和向量机,没法抽出来当例子,就用了个最老的自动车辆的例子。

模糊系统(Fuzzy System)架构

前面零零散散说来一下有关模糊系统和模糊理论的东西,这里来个总结。

模煳系统的基本架构如图8.1所示,其中主要的功能方块包括:(1)模煳化机构、(2)模煳规则库、(3)模煳推论引擎、以及(4)去模煳化机构。

模糊化机构是有关模糊集合和隶属度函数的内容。

模糊规则前文也有提及,去模糊化只涉及了重心法一种,这里简单说一下模糊推理引擎。

模糊推理引擎是模煳系统的核心,它可以藉由近似推论或模煳推论的进行,来模拟人类的思考决策模式,以达到解决问题的目地。

比如:

前提(premise)一:x is A’

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

结论:y is B’

模糊推理系统的简单实现

在AForge.Net中的对应类是InferenceSystem。

在程序实现中一个模糊推理系统(Fuzzy Inference System )由数据库(Database)和规则库(Rulebase)组成,一般操作如下:

1.获取数值输入

2.通过数据库(Database)将数值输入转为语意含义

3.验证规则库(Rulebase)中的哪些规则被输入激活

4.组合被激活的规则,得到模糊输出(Fuzzy Output)

5.去模糊化(实现IDefuzzifier接口)

下面看看例子,这个例子是关于控制车辆避免正面冲撞的系统。

输入为距离,论域[0,120],隶属度函数

输出为角度,论域[-10,50],隶属度函数

核心代码:

// 隶属度函数(距离) 
FuzzySet fsNear = new FuzzySet("Near",
new TrapezoidalFunction(, , TrapezoidalFunction.EdgeType.Right));
FuzzySet fsMedium = new FuzzySet("Medium",
new TrapezoidalFunction(, , , ));
FuzzySet fsFar = new FuzzySet("Far",
new TrapezoidalFunction(, , TrapezoidalFunction.EdgeType.Left)); //绘制图像
int length1 =(int) (chart1.RangeX.Max - chart1.RangeX.Min);
double[,] NearValues = new double[length1, ];
for (int i = (int)chart1.RangeX.Min; i < chart1.RangeX.Max; i++)
{
NearValues[i, ] = i;
NearValues[i, ] = fsNear.GetMembership(i);
}
double[,] MediumValues = new double[length1, ];
for (int i = (int)chart1.RangeX.Min; i < chart1.RangeX.Max; i++)
{
MediumValues[i, ] = i;
MediumValues[i, ] = fsMedium.GetMembership(i);
}
double[,] FarValues = new double[length1, ];
for (int i = (int)chart1.RangeX.Min; i < chart1.RangeX.Max; i++)
{
FarValues[i, ] = i;
FarValues[i, ] = fsFar.GetMembership(i);
}
chart1.UpdateDataSeries("Near", NearValues);
chart1.UpdateDataSeries("Medium", MediumValues);
chart1.UpdateDataSeries("Far", FarValues); // 距离(输入)
LinguisticVariable lvFront = new LinguisticVariable("FrontalDistance", , );
lvFront.AddLabel(fsNear);
lvFront.AddLabel(fsMedium);
lvFront.AddLabel(fsFar); // 隶属度函数
FuzzySet fsZero = new FuzzySet("Zero",
new TrapezoidalFunction(-, , , ));
FuzzySet fsLP = new FuzzySet("LittlePositive",
new TrapezoidalFunction(, , , ));
FuzzySet fsP = new FuzzySet("Positive",
new TrapezoidalFunction(, , , ));
FuzzySet fsVP = new FuzzySet("VeryPositive",
new TrapezoidalFunction(, , TrapezoidalFunction.EdgeType.Left)); //绘制图像
int length2 = (int)(chart2.RangeX.Max - chart2.RangeX.Min);
double[,] ZeroValues = new double[length2, ];
for (int i = (int)chart2.RangeX.Min; i < chart2.RangeX.Max; i++)
{
ZeroValues[i + , ] = i;
ZeroValues[i + , ] = fsZero.GetMembership(i);
}
double[,] LittlePositiveValues = new double[length2, ];
for (int i = (int)chart2.RangeX.Min; i < chart2.RangeX.Max; i++)
{
LittlePositiveValues[i + , ] = i;
LittlePositiveValues[i + , ] = fsLP.GetMembership(i);
}
double[,] PositiveValues = new double[length2, ];
for (int i = (int)chart2.RangeX.Min; i < chart2.RangeX.Max; i++)
{
PositiveValues[i + , ] = i;
PositiveValues[i + , ] = fsP.GetMembership(i);
}
double[,] VeryPositiveValues = new double[length2, ];
for (int i = (int)chart2.RangeX.Min; i < chart2.RangeX.Max; i++)
{
VeryPositiveValues[i + , ] = i;
VeryPositiveValues[i + , ] = fsVP.GetMembership(i);
}
chart2.UpdateDataSeries("Zero", ZeroValues);
chart2.UpdateDataSeries("LittlePositive", LittlePositiveValues);
chart2.UpdateDataSeries("Positive", PositiveValues);
chart2.UpdateDataSeries("VeryPositive", VeryPositiveValues); //角度
LinguisticVariable lvAngle = new LinguisticVariable("Angle", -, );
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()); // 直行规则
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);
}

效果:

如果要输出模糊结论可以使用:

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

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

模糊推理系统的扩展和完善

借助AForge.Net我们可以很快构建一个系统,但是AForge.Net也不是十全十美的。

首先它的合成运算子没有实现完全,有些常用的,比如最大边界算子就没有。

其次其去模糊化的实现只有一种,可以考虑实现自己补充一下算法:

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

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

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

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

5.权重式平均法(weighted average method)结合了启动强度,使用更为广泛


不过AForge.Net的接口和设计比较好,扩展也是很方便的。

其实模糊系统的话,matlab也是可以做到的,但是一来matlab不开源,二来扩展确实不方便,所以没有使用,如果确实没有替代品,可以考虑混编。

模糊系统的使用本身也有一些不方便,主要是规则库的建立。

第一种也是最直接的方式就是经由询问人类专家而得。但是人类专家往往无法完整地提供所有必需的语意式模煳规则,以致于规则库的不完全。

而模糊系统的效果主要受规则和隶属度函数影响,所以有时候规则库的不全对系统的效果是毁灭性伤害。

第二种取得语意式模煳规则的方式,则是经由训练法则,从数值型资料(numerical data)中取得模煳规则,此种作法往往牵涉如何分割输入及输出变数空间。常用的就是神经网络。

AForge.Net也有神经网络相关的东西,所以使用起来很方便的。

最后附上整个项目的下载地址:http://www.ctdisk.com/file/4512079

模糊系统架构和简单实现--AForge.NET框架的使用(四)的更多相关文章

  1. 源码学习之Spring (系统架构简单解析)

    Spring Framework 系统架构总览图 Spring Framework的模块依赖关系图 Spring Framework各个模块功能说明 Spring核心模块 模块名称 主要功能 Spri ...

  2. 模糊语意变数、规则和模糊运算--AForge.NET框架的使用(二)

    原文:模糊语意变数.规则和模糊运算--AForge.NET框架的使用(二) 语意变数(Linguistic Variable) 语意变数存储了数个语意量(标签),每个语意量包含一个识别名和模糊集合.在 ...

  3. vivo商城促销系统架构设计与实践-概览篇

    一.前言 随着商城业务渠道不断扩展,促销玩法不断增多,原商城v2.0架构已经无法满足不断增加的活动玩法,需要进行促销系统的独立建设,与商城解耦,提供纯粹的商城营销活动玩法支撑能力. 我们将分系列来介绍 ...

  4. (系统架构)标准Web系统的架构分层

    标准Web系统的架构分层 1.架构体系分层图 在上图中我们描述了Web系统架构中的组成部分.并且给出了每一层常用的技术组件/服务实现.需要注意以下几点: 系统架构是灵活的,根据需求的不同,不一定每一层 ...

  5. 千万pv大型web系统架构,学习从点滴开始

     架构,刚开始的解释是我从知乎上看到的.什么是架构?有人讲, 说架构并不是一 个很 悬 乎的 东西 , 实际 上就是一个架子 , 放一些 业务 和算法,跟我们的生活中的晾衣架很像.更抽象一点,说架构其 ...

  6. [网站性能1]对.net系统架构改造的一点经验和教训

    文章来源:http://www.admin10000.com/document/2111.html 在互联网行业,基于Unix/Linux的网站系统架构毫无疑问是当今主流的架构解决方案,这不仅仅是因为 ...

  7. 异构(兼容dubbo)SOA系统架构(.net)优化升级

    前面一片文章已经提到我司的异构(兼容dubbo)SOA系统架构,解决了不少技术痛点,也还算比较完善,也顺利推广开来. 但作为项目的开发者,自己产品的问题心里是清楚的,离自己满意还是有不小的距离. 在推 ...

  8. 浅谈大型web系统架构

    动态应用,是相对于网站静态内容而言,是指以c/c++.php.Java.perl..net等服务器端语言开发的网络应用软件,比如论坛.网络相册.交友.BLOG等常见应用.动态应用系统通常与数据库系统. ...

  9. 性能测试知多少---系统架构分析 转自https://yq.aliyun.com/articles/35147?spm=5176.100239.blogcont24251.8.lS96At

    摘要: 有些事儿一旦放一放就难再拾起来,突然发现<性能测试知多少>这个系列两月没更新,关键时我都不知道啥时候放下的,总容易被各种技术所吸引走,如饥似渴的想学更多的东西,这几天一直有朋友问我 ...

随机推荐

  1. 自然语言.例如:求n!。

    (1).定义3个变量i.n及mul,并为i和mul均赋初值为1. (2).从键盘中输入一个数赋给n. (3).将mul乘以i的结果赋给mul. (4)i的值加1,判断i的值是否大于n.如果大于n,则执 ...

  2. Jquery的hover方法让鼠标经过li时背景变色

    来源地址:http://itfish.net/article/29790.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Trans ...

  3. Android布局属性详解剖析

    View的布局显示方式有下面几种: 线性布局(LinearLayout) 相对布局(RelativeLayout) 表格布局(TableLayout) 网格视图(GridView) 标签布局(TabL ...

  4. VS2010 使用TeeChart画图控件 - 之二 - 绘制图形(折线图,柱状图)

    1.前期准备 详细可见VS2010 使用TeeChart画图控件 - 之中的一个 控件和类的导入 1. 1 加入TeeChart控件,给控件加入变量m_TeeChart 加入TeeChart控件,右击 ...

  5. Spring MVC中使用Mongodb总结

    近期项目做了次架构调整,原来是使用MySQL+GeoHash来存储LBS数据(地理位置信息),现在使用NOSQL数据库MongoDB来存储LBS数据(地理位置信息).由于项目是基于spring MVC ...

  6. JAVA try-catch-finally-return

      正常执行流程: try执行,遇到异常就跳到catch执行(以使得程序不会崩溃): 不管有没有异常catch,最后都执行finally   含return语句执行流程分析: 若try块中return ...

  7. MyEclipse修改servlet模版

    找到myeclipse安装目录中的 然后把这个jar包复制到桌面 以压缩包的方式打开 之后保存, 然后把修改的这个jar包放到刚开的路径,替换已经存在的! 完成!

  8. gradle命令

    gradle tasks 可以显示gradle可以做的任务. gradle build 就会生成jar包. build和clean install的作用是否一致?

  9. 关于char与varchar,varchar2的区别

    http://zhidao.baidu.com/question/220360696.html?qbl=relate_question_0&word=char%BA%CDvarchar2%B5 ...

  10. JUnit报initializationError的解决方法

    在新搭建的环境上测试时,一个模块发现错误: java.lang.NoClassDefFoundError:org/hamcrest/SelfDescribing 一看就是缺少Class.多方查找,发现 ...