目录
1)开始之前:抽象
2)模糊逻辑概念
3)使用API
3.1)核心流程
3.2)设计模式
3.3)依赖性
此API通过C#Plain旧CLR对象上的模糊逻辑概念执行推理,该对象关联本机.NET Framework中定义的Expression对象。
如果您想深入研究模糊逻辑理论(如数学定理,假设和摩根定律),强烈建议您寻找其他参考资料以满足您的好奇心和/或您的研究需求。通过这个git帖子,您将只访问一个在现实世界应用程序中执行模糊逻辑的实际例子;然后,本文的重点不是仅仅为了一个实际目的而深入探讨哲学对话。
这个来自tutorialspoint 网站的数字恢复了模糊逻辑的真实概念:没有什么是绝对真或假(对于模糊逻辑); 在0和1之间,你有一个来自这些极端的区间,超出了布尔逻辑的限制。
核心概念有第一个要求:Defuzzyfication。换句话说,通过基于模糊逻辑引擎的Crisp Input表达式生成模糊逻辑结果(下图,来自Wikepdia参考):
模糊逻辑引擎的规则是:拆分任何复杂的布尔表达式(清晰的输入),解决小布尔部分规则中的逻辑布尔问题(关于这个复杂布尔表达式使用的理论,查看像多值逻辑或/ 经典的逻辑)。
基于上面的说明性示例,让我们创建一个Model 类,它代表所有人的诚实品格,如诚实、真理和正义感百分比评估,以及一个布尔表达式对象,该对象标识诚实概况,考虑到最小百分比是一个诚实的个人:
[Serializable, XmlRoot]
public class HonestAssesment
{
[XmlElement]
public int IntegrityPercentage { get; set; }
[XmlElement]
public int TruthPercentage { get; set; }
[XmlElement]
public int JusticeSensePercentage { get; set; }
[XmlElement]
public int MistakesPercentage
{
get
{
return ((100-IntegrityPercentage) + (100-TruthPercentage) +
(100-JusticeSensePercentage))/3;
}
}
}
//Crisp Logic expression that represents Honesty Profiles:
static Expression> _honestyProfile = (h) =>
(h.IntegrityPercentage > 75 && h.JusticeSensePercentage > 75 &&
h.TruthPercentage > 75) || //First group
(h.IntegrityPercentage > 90 && h.JusticeSensePercentage > 60 &&
h.TruthPercentage > 50) || //Second group
(h.IntegrityPercentage > 70 && h.JusticeSensePercentage > 90 &&
h.TruthPercentage > 80) || //Third group
(h.IntegrityPercentage > 65 && h.JusticeSensePercentage > 100 &&
h.TruthPercentage > 95); //Last group
断开的布尔表达式是从System.Linq.Expressions.Expression类派生的一个容量,将任何代码块转换为代表性的string; 将辅助此作业的派生类是BinaryExpression:布尔表达式将在较小布尔表达式的二叉树中切片,其规则将优先考虑包含OR条件表达式的切片,然后用'AND'条件表达式切片。
//First group of assessment:
h.IntegrityPercentage > 75;
h.JusticeSensePercentage > 75;
h.TruthPercentage > 75;
//Second group of assessment:
h.IntegrityPercentage > 90;
h.JusticeSensePercentage > 60;
h.TruthPercentage > 50;
//Third group of assessment:
h.IntegrityPercentage > 70;
h.JusticeSensePercentage > 90;
h.TruthPercentage > 80;
//Last group of assessment:
h.IntegrityPercentage > 65;
h.JusticeSensePercentage > 100;
h.TruthPercentage > 95;
.NET Framework中包含的此功能是一张王牌,用于降低评估的配置文件已经征服的评估值,或者它们与4个定义的评估组中的任何一个达到的接近程度,例如:
HonestAssesment profile1 = new HonestAssesment()
{
IntegrityPercentage = 90,
JusticeSensePercentage = 80,
TruthPercentage = 70
};
string inference_p1 = FuzzyLogic.GetInferenceResult
(_expression, ResponseType.Json, profile1);
看看“HitsPercentage”属性。对Profile 1的推断,有66%的人是诚实的。
{
"ID": 0,
"HitsPercentage": "66%",
"Data": {
"IntegrityPercentage": 90,
"TruthPercentage": 70,
"JusticeSensePercentage": 80,
"MistakesPercentage": 20
},
"PropertiesNeedToChange": [
"IntegrityPercentage"
],
"RatingsReport": [
false,
true,
true
],
"ErrorsQuantity": 1
}
HonestAssesment profile2 = new HonestAssesment()
{
IntegrityPercentage = 50,
JusticeSensePercentage = 63,
TruthPercentage = 30
};
string inference_p2 = FuzzyLogic.GetInferenceResult
(_expression, ResponseType.Json, profile2);
对Profile 2的推断,有33%的人是诚实的,即“有时是诚实的”, 像个家庭教师。
{
"ID": 0,
"HitsPercentage": "33%",
"Data": {
"IntegrityPercentage": 50,
"TruthPercentage": 30,
"JusticeSensePercentage": 63,
"MistakesPercentage": 52
},
"PropertiesNeedToChange": [
"IntegrityPercentage",
"TruthPercentage"
],
"RatingsReport": [
false,
true,
false
],
"ErrorsQuantity": 2
}
HonestAssesment profile3 = new HonestAssesment()
{
IntegrityPercentage = 46,
JusticeSensePercentage = 48,
TruthPercentage = 30
};
string inference_p3 = FuzzyLogic.GetInferenceResult
(_expression, ResponseType.Json, profile3);
对Profile 3的推断,0%的人是诚实的,即“极不诚实的”,如上图所示:
{
"ID": 0,
"HitsPercentage": "0%",
"Data": {
"IntegrityPercentage": 46,
"TruthPercentage": 30,
"JusticeSensePercentage": 48,
"MistakesPercentage": 58
},
"PropertiesNeedToChange": [
"IntegrityPercentage",
"JusticeSensePercentage",
"TruthPercentage"
],
"RatingsReport": [
false,
false,
false
],
"ErrorsQuantity": 3
}
HonestAssesment profile4 = new HonestAssesment()
{
IntegrityPercentage = 91,
JusticeSensePercentage = 83,
TruthPercentage = 81
};
string inference_p4 = FuzzyLogic.GetInferenceResult
(_expression, ResponseType.Json, profile4);
对Profile 4的推断,100%的人是诚实的,即“非常诚实”,就像数字评估一样。
{
"ID": 0,
"HitsPercentage": "100%",
"Data": {
"IntegrityPercentage": 91,
"TruthPercentage": 81,
"JusticeSensePercentage": 83,
"MistakesPercentage": 15
},
"PropertiesNeedToChange": [],
"RatingsReport": [
true,
true,
true
],
"ErrorsQuantity": 0
}
使用Singleton Design Pattern开发的'Fuzzy Logic API' ,由一个private构造函数构成,它有两个参数参数:一个Expression对象和一个POCO对象(在泛型参数中定义); 但开发人员将通过一行代码得到推理结果:
//Like a inference object...
Inference inferObj = FuzzyLogic.GetInferenceResult
(_expressionArg, modelObj);
//... get as XML string...
string inferXml = FuzzyLogic.GetInferenceResult
(_expressionArg, ResponseType.Xml, modelObj);
//...or json string.
string inferJson = FuzzyLogic.GetInferenceResult
(_expressionArg, ResponseType.Json, modelObj);
要将Visual Logic API添加为程序集或类似Visual Studio项目中的内部类,您需要安装System.Linq.Dynamic dll,可以通过nuget引用或在Nuget Package Console(Install-Package System.Linq.Dynamic)上执行命令来安装。