C#模糊逻辑API

原文链接: https://www.codeproject.com/Articles/5092762/Csharp-Fuzzy-Logic-API

目录

1)开始之前:抽象

2)模糊逻辑概念

3)使用API

3.1)核心流程

3.2)设计模式

3.3)依赖性

  • 下载最新的存档库
  • 下载本地副本

API通过CPlainCLR对象上的模糊逻辑概念执行推理,该对象关联本机.NET Framework中定义的Expression对象。

1)开始之前:抽象

如果您想深入研究模糊逻辑理论(如数学定理,假设和摩根定律),强烈建议您寻找其他参考资料以满足您的好奇心和/或您的研究需求。通过这个git帖子,您将只访问一个在现实世界应用程序中执行模糊逻辑的实际例子;然后,本文的重点不是仅仅为了一个实际目的而深入探讨哲学对话。

2)模糊逻辑概念

这个来自tutorialspoint 网站的数字恢复了模糊逻辑的真实概念:没有什么是绝对真或假(对于模糊逻辑)01之间,你有一个来自这些极端的区间,超出了布尔逻辑的限制。

C#模糊逻辑API_第1张图片

3)使用API

3.1)核心流程

核心概念有第一个要求:Defuzzyfication。换句话说,通过基于模糊逻辑引擎的Crisp Input表达式生成模糊逻辑结果(下图,来自Wikepdia参考):

C#模糊逻辑API_第2张图片

模糊逻辑引擎的规则是:拆分任何复杂的布尔表达式(清晰的输入),解决小布尔部分规则中的逻辑布尔问题(关于这个复杂布尔表达式使用的理论,查看像多值逻辑经典的逻辑)。

基于上面的说明性示例,让我们创建一个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
}

3.2)设计模式

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

3.3)依赖性

要将Visual Logic API添加为程序集或类似Visual Studio项目中的内部类,您需要安装System.Linq.Dynamic dll,可以通过nuget引用或在Nuget Package ConsoleInstall-Package System.Linq.Dynamic)上执行命令来安装。

你可能感兴趣的:(CSharp.NET)