基于C#的机器学习--模糊逻辑-穿越障碍

模糊逻辑-穿越障碍模糊逻辑。另一个我们经常听到的术语。但它的真正含义是什么?它是否意味着不止一件事?我们马上就会知道答案。我们将使用模糊逻辑来帮助引导一辆自动驾驶汽车绕过障碍,如果我们做得正确,我们将避开沿途的障碍。我们的自动导航车辆(AGV)将在障碍物周围导航,感知其路径上的障碍物。它将使用一个推理系统来帮助引导它前进。你或者用户将能够创造障碍或通过的方式,AGV必须避开或通过。你可以观察跟踪光...

基于C#的机器学习--模糊逻辑-穿越障碍

模糊逻辑-穿越障碍

模糊逻辑。另一个我们经常听到的术语。但它的真正含义是什么?它是否意味着不止一件事?我们马上就会知道答案。

我们将使用模糊逻辑来帮助引导一辆自动驾驶汽车绕过障碍,如果我们做得正确,我们将避开沿途的障碍。我们的自动导航车辆(AGV)将在障碍物周围导航,感知其路径上的障碍物。它将使用一个推理系统来帮助引导它前进。你或者用户将能够创造障碍或通过的方式,AGV必须避开或通过。你可以观察跟踪光束的工作,以及跟踪AGV的路径沿其路线。AGV所采取的每一步都将在用户界面上进行更新,这样您就可以看到发生了什么。

在布尔逻辑中,事物或真或假,或黑或白。许多人不知道的是,还有一种被称为多值逻辑的东西,它的真实值介于10之间。模糊逻辑是处理部分真理的多值逻辑的概念实现。例如很多人也不知道的著名的sigmoid函数,它是一种模糊化的方法。

维基百科(建议大家多使用这个百科,百度百科真的只能用呵呵来形容)对此有很好的描述,如下:

维基百科:

"In this image, the meanings of the expressions cold, warm, and hot are represented by functions mapping a temperature scale. A point on that scale has three "truth values"-one for each of the three functions. The vertical line in the image represents a particular temperature that the three arrows (truth values) gauge. Since the red arrow points to zero,this temperature may be interpreted as "not hot". The orange arrow (pointing at 0.2) may describe it as "slightly warm" and the blue arrow (pointing at 0.8) "fairly cold"."

在这幅图中,cold(冷)、warm(暖)和hot(热)表达式的含义由映射一个温标的函数表示。这个尺度上的一个点有三个“真值”,三个函数各有一个。图像中的垂直线表示三个箭头(真值)测量的特定温度。由于红色箭头指向零,这个温度可以解释为不热 橙色的箭头(指向0.2)可以描述为轻微温暖,蓝色的箭头(指向0.8)可以描述为轻微温暖很冷

我们为什么要展示这个?因为,这个图表和描述非常准确地描述了什么是模糊逻辑。我们将使用AForge.NET开源机器学习框架。这是一个很好的框架,它展示了使用推理引擎完成任务是多么容易。

在这一章中,我们将讨论:

  1. 模糊逻辑

  2. 避障与识别

  3. AGV

模糊逻辑

我们的应用程序将有两个简单的按钮,一个用于运行模糊集测试,另一个用于运行语言变量测试。下面是示例应用程序的快速快照:

创建此示例的代码相对较小且简单。这是当我们点击Run Fuzzy Set Test按钮时的样子。我们将创建两个模糊集(一个用于凉爽,一个用于温暖),并为每个模糊集添加一些成员数据值,然后绘制它们:

    #region 创建两个模糊集来表示凉和暖的温度#regionTrapezoidalFunction function1 = new TrapezoidalFunction(13, 18, 23, 28);FuzzySet fsCool = new FuzzySet("", function1);double[,] coolValues = new double[20, 2];for (int i = 10; i < 30; i  ){ coolValues[i - 10, 0] = i; coolValues[i - 10, 1] = fsCool.GetMembership(i);}chart?.UpdateDataSeries("", coolValues);#endregion#regionTrapezoidalFunction function2 = new TrapezoidalFunction(23, 28, 33, 38);FuzzySet fsWarm = new FuzzySet("", function2);double[,] warmValues = new double[20, 2];for (int i = 20; i < 40; i  ){ warmValues[i - 20, 0] = i; warmValues[i - 20, 1] = fsWarm.GetMembership(i);}chart?.UpdateDataSeries("", warmValues);#endregion 暖     #endregion 创建两个模糊集来表示凉和暖的温度

运行语言变量测试的代码如下。同样,我们创建模糊集,但这次我们创建4个而不是2个。与我们的第一个测试一样,我们首先添加成员数据,然后绘图:

       LinguisticVariable lvTemperature = new LinguisticVariable("温度", 0, 80);TrapezoidalFunction function1 = new TrapezoidalFunction(10, 15, TrapezoidalFunction.EdgeType.Right);FuzzySet fsCold = new FuzzySet("", function1);lvTemperature.AddLabel(fsCold);TrapezoidalFunction function2 = new TrapezoidalFunction(10, 15, 20, 25);FuzzySet fsCool = new FuzzySet("", function2);lvTemperature.AddLabel(fsCool);TrapezoidalFunction function3 = new TrapezoidalFunction(20, 25, 30, 35);FuzzySet fsWarm = new FuzzySet("", function3);lvTemperature.AddLabel(fsWarm);TrapezoidalFunction function4 = new TrapezoidalFunction(30, 35, TrapezoidalFunction.EdgeType.Left);FuzzySet fsHot = new FuzzySet("", function4);lvTemperature.AddLabel(fsHot);double[][,] chartValues = new double[4][,];for (int i = 0; i < 4; i  ) chartValues[i] = new double[160, 2];

最后我们画出这些值:

  #region 语言变量的形状——它的标签从开始到结束的形状int j = 0;for (float x = 0; x < 80; x  = 0.5f, j  ){ double y1 = lvTemperature.GetLabelMembership("", x); double y2 = lvTemperature.GetLabelMembe
源文地址:https://www.guoxiongfei.cn/cntech/8011.html