- 发布者:
- MetaQuotes
- 显示:
- 6509
- 等级:
- 已发布:
- 2015.09.02 17:30
- 已更新:
- 2016.11.22 07:33
-
需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务
真实作者
Dmitry Kalyuzhny. FuzzyNet 项目网站 - http://sourceforge.net/projects/fuzzynet/
将文档解压缩至 终端数据文件夹。
程序库代码位于 <终端数据文件夹>\MQL4\Include\Math\FuzzyNet\
样本测试脚本可在 <终端数据文件夹>\MQL4\Scripts\FuzzyNet\ 里找到
FuzzyNet 是用于创建模糊模型的最流行的数学库之一
用于 Microsoft.Net 的模糊逻辑库 (FuzzyNet) 是一款易于使用的控件, 可用来实现马丹尼和关野 (Sugeno) 型模糊推理系统。
FuzzyNet 包括:
当程序库移植到 MQL4 时, 补充了以下内容:
- 8 个新的隶属函数。
- 4 个马丹尼型系统的去模糊化方法。
使用程序库
- 依据您的任务, 创建一个空的马丹尼或关野型的模糊系统。
- 创建模糊输入和输出变量。
- 为每个模糊变量添加适当的条款。在此之前, 每个条件都会被分配一个名称和隶属函数。
- 将变量添加到系统。
- 创建一套规则。
- 将规则添加至系统。
- 输入数据发送到系统。
- 调用系统的计算函数。
注: 马丹尼型推理系统可以在创建之后且在调用系统计算函数之前的任何阶段进行配置。如果系统设置在其创建之后未予改变, 则系统以省缺设置工作:
移植 FuzzyNet 程序库 (v. 1.2.0) 显示如下。
为操作程序库, 依据您创建的系统包含 MamdaniFuzzySystem.mqh 或 SugenoFuzzySystem.mqh 头文件。
以下是更多有关 FuzzyNet 移植程序库软件包的详情:软件包 |
描述 |
---|---|
Dictionary.mqh |
该软件包含有其它软件包所需的附加类。 |
FuzzyRule.mqh |
创建模糊规则的类:
该软件包还含有实现模糊规则的辅助类。 |
FuzzyTerm.mqh | 创建模糊条款的软件包。 |
FuzzyVariable.mqh | 创建模糊变量的软件包。 |
GenericFuzzySystem.mqh | 该类实现马丹尼和关野系统的通用功能。 |
Helper.mqh | 该软件包含有其它软件包所需的附加类。 |
InferenceMethod.mqh | 该软件包含有其它软件包所需的附加类。 |
MamdaniFuzzySystem.mqh | 该类创建一个马丹尼型模糊系统。 |
MembershipFunction.mqh | 隶属函数类:
|
RuleParser.mqh | 分析模糊规则的类。 |
SugenoFuzzySystem.mqh | 该类用于创建一个关野型模糊系统。 |
SugenoVariable.mqh | 该软件包含有以下类:
关野型模糊变量在开发关野型系统时使用。 |
在 MQL4 上使用 FuzzyNet 程序库
在编写模糊系统之前, 您应该对其元素有清晰视野, 包括:
- 被模糊变量重新分配的输入和输出值的数量。
- 每个模糊变量的条款及其隶属函数的数目。
- 根据您的任务建立的模糊系统的类型。
- 与所选择系统相应的模糊规则的内容和数目。
- 指定系统的参数和功能。
系统的开发和计算:
- 创建一个空系统。
对于马丹尼型系统:
MamdaniFuzzySystem *fuzzy_system=new MamdaniFuzzySystem();
对于关野型系统:
SugenoFuzzySystem *fuzzy_system=new SugenoFuzzySystem();
- 在系统上分别创建所有的模糊输入变量, 并为所有变量分配名称和最大/最小值作为参数:
FuzzyVariable *fuzzy_variable=new FuzzyVariable(const string name,const double min,const double max);
- 创建模糊条款函数, 创建模糊条款自身, 并为它们传递合适的名称和隶属函数。之后, 将条款添加到相应变量。为降低代码量, 此过程可以编写如下:
fuzzy_variable.Terms().Add(new FuzzyTerm(const string name,new IMembershipFunction());
- 将输入变量录入到系统中:
fuzzy_system.Input().Add(FuzzyVariable fuzzy_variable);
- 创建输入变量, 关注您的系统类型。对于马丹尼型系统, 创建过程类似于步骤 2 和 3。对于关野型模型, 创建一个只接收变量名的特别模糊变量作为参数:
SugenoVariable *sugeno_variable=new SugenoVariable(const string name);
解析输入值线形组合的线形函数被添加到关野型模糊变量, 替代模糊条款。使用名称和一个系数数组作为线性函数的参数。线性方程的形成基于该数组,因此,数组中的元素遵从顺序是很重要的。系数数组的长度可等于输入数值或超出它一个。如果长度相等, 方程的绝对条款等于零。如果数组长度超出一个, 绝对条款等于最后一个元素值。数组的其它所有元素自第一个开始, 按照录入系统的顺序分配到模糊输入变量中。sugeno_varriable.Functions().Add(fuzzy_sytem.CreateSugenoFunction(const string name, const double &coeffs[]));
- 类似于步骤 4, 输出变量应被添加到系统中:
对于马丹尼型系统:
fuzzy_system.Output().Add(FuzzyVariable fuzzy_variable);
对于关野型系统:
fuzzy_system.Output().Add(FuzzyVariable fuzzy_variable);
- 根据系统, 分配一套规则。规则可以通用字符串定义, 并基于关键字自动分析。关键字是 "if", "then", "is", "and", "or", "not", "(" , ")", "slightly", "somewhat", "very" 和 "extremely", 以及您的系统中可用的所有变量名, 条款和函数。
对于马丹尼型系统:
MamdaniFuzzyRule *fuzzy_rule = fuzzy_system.ParseRule(const string rule_text);
对于关野型系统:
SugenoFuzzyRule *fuzzy_rule = fuzzy_system.ParseRule(const string rule_text);
- 将所有规则录入系统:
对于马丹尼型系统:
fuzzy_system.Rules().Add(MamdaniFuzzyRule fuzzy_rule);
对于关野型系统:
fuzzy_system.Rules().Add(SugenoFuzzyRule fuzzy_rule);
- 将变量的输入值传递到系统用于计算。为此, 它们应被定义。在输入它们时, 系统接收包含 Dictionary_Obj_Double 类对象的数值列表。该类已在 Dictionary.mqh 头文件里描述。
Dictionary_Obj_Double *p_od_in=new Dictionary_Obj_Double;
该类实现的 SetAll(CObject *key, const double value) 方法接收两个参数 - 一个模糊变量和一个数字型数值。此元素是一个系统的输入变量。p_od_in.SetAll(FuzzyVariable fuzzy_variable,const double value);
其它所有输入值均以同样方式填写。创建列表并为其添加所有数值:CList *in=new CList; in.Add(p_od_in);
- 输出值也应指定:
Dictionary_Obj_Double *p_od_out=new Dictionary_Obj_Double; CList *out=new CList;
- 调用 Calculate(CList *&list) 函数以便我们的系统能返回系统计算的结果列表:
out=fuzzy_system.Calculate(in);
之后, out 列表按照它们被录入系统的顺序存储所有计算输出的结果。我们只需接收它们即可:p_od_out=out.GetNodeAtIndex(int index); double result=p_od_out.Value();
现在, result 变量里保存的是系统根据 index 指定数量的输出值进行计算的结果。
样本脚本
小费样本 (马丹尼)
Tips_Sample_Mamdani.mq4 依据服务和食物品质计算您所需支付的小费百分比。
录入输入参数:
计算结果:
巡航控制样本 (关野)
Cruise_Control_Sample_Sugeno.mq4 样本脚本是一个模糊调速器的例程。它代表一辆汽车的巡航控制系统, 根据当前车速和车辆提速至期望值的变化率偏差, 计算必要的加速度。
录入输入参数:
计算结果:
由MetaQuotes Ltd译自俄语
原代码: https://www.mql5.com/ru/code/13717