模糊逻辑 - 避障 - WPF
一个用于移动物体避障的模糊逻辑控制系统。
引言
太好了,这是我为 Code Project 写的第二篇文章。和我的第一篇文章一样,这篇也是我在大学人工智能课程的作业,我想用 C# 和 WPF 来尝试一下。
模糊逻辑 - 类似字典的描述
“模糊逻辑是一种解决问题的数学方法。它擅长从不精确的数据中产生精确的结果,并且在计算机和电子应用中特别有用。
模糊逻辑与经典逻辑的不同之处在于,命题不再是黑白分明、真或假、开或关。在传统逻辑中,一个对象的值要么是零,要么是一;在模糊逻辑中,一个命题可以取 0 和 1 之间的任何实数值,表示该元素属于某个集合的程度。
人脑可以处理不确定性、模糊性和判断。计算机只能处理精确的估值。模糊逻辑试图结合这两种技术。” - Paul Wang,电气工程教授
这很好地概括了。所以模糊逻辑就是一种接受不精确输入并输出精确输出的逻辑——一种精确的问题解决方法。所以,让我们来创建一个用于避障系统的模糊逻辑系统。
模糊逻辑系统
模糊系统的输入可以是房间的温度,或者是屏幕上某个像素的颜色。模糊逻辑系统通过将特定规则应用于输入值来工作,以确定特定输入与由规则定义的一组值的匹配程度。
http://blog.peltarion.com/2006/10/25/fuzzy-math-part-1-the-theory/
从上面的输入模糊集来看,一个人身高 165 厘米,根据布尔表示,这个人是矮的。但模糊逻辑会输出这个人部分矮,部分中等。输入值 165 同时属于矮和中等这两个域。所以模糊逻辑识别的不仅仅是清晰的、非黑即白的选项,还有它们之间无限的渐变。因此,用模糊术语来说,这个人的身高将被归类在一个范围 [0, 1] 内,身高矮的程度是 0.4,身高中等的程度是 0.6。
设计模糊推理系统
所以,让我们来为我的作业中的汽车设计一个模糊避障系统。
模糊推理系统
首先,我们需要定义模糊系统的输入和输出变量。
输入- 障碍物相对于我车行驶方向的角度
- 障碍物与我车之间的距离
- 调整车辆航向的角度以避免与障碍物发生碰撞
现在,通过 3 个简单步骤来设定模糊系统的实际参数
- 指定与每个变量关联的模糊集
- 确定模糊规则是什么(可以用语言描述)
- 指定隶属函数的形状
1. 模糊集
对于我们的输入变量,角度可以描述为:{小、中、大},距离可以描述为:{近、远、非常远}。参考下图,应该会更清楚。
2. 规则评估
规则可以用语言这样写:
如果 (障碍物角度小) 且 (障碍物距离近) 则 (急转弯)。
我们可以用模糊联想记忆矩阵来表示输入变量的所有可能组合。预设值(由您确定)
x1 = 5, x2 = 4, x3 = 3, x4 = 4, x5 = 3, x6 = 2, x7 = 3, x8 = 2, x9 = 1
这里有一个模式,您应该已经通过查看阴影并注意到它们形成对角线模式。通常 x2 和 x4 会有相同的值,所以您可以将它们组合成一个变量,例如 MF,因为当角度是中等且距离是小时,或者当距离是远且角度是小时,您通常会想要将输出值设为相同。这些表格在接下来的小节中会更有意义。之前我描述过输入变量是属于我们模糊集的成员,具有不同的隶属度。现在,如果您将此矩阵表示的所有可能组合的隶属值(介于 0 和 1 之间)相加,然后乘以 X1 到 X9 的某个预设常数,您应该会得到一个输出。
3. 去模糊化
所以,假设我们的障碍物距离非常近,角度很小,那么只有我们两个输入变量在角度 {小} 和距离 {远} 上具有 1 的隶属度。所有其他可能的集合都将产生 0 的隶属值。所以,为了使其非常简单,您基本上是将所有隶属值相乘,然后将它们全部相加,然后除以您 FAMM 的所有预设值之和。所以对于我们的例子,您将得到 X1*(1 x 1) + X2(0 x 0)... / X1 + ... + X9。女士们先生们,这就输出一个调整角度的精确值。就这么简单。
我如何使用 WPF 实现这个解决方案
好吧,了解这一点最好的方法就是深入研究代码。但如果您看过我以前的文章 ( 8 Puzzle ),它使用了相同的动画技术,并利用动画完成事件处理器在每次迭代之间计算调整角度。也许一个很好的扩展是让模糊逻辑在单独的线程上运行,而不是增量地执行。
至于说明,您只需单击即可将目标放置在某个位置,然后汽车就会在避开小怪物的同时寻找目标。如果您在汽车停止移动之前设置新目标,会有一个小故障。
我稍后会修改这篇文章,提供更详细的代码演练,但代码本身注释得非常好,先查看代码,然后再阅读我的解释,可能是理解它的更好方式(或者不,我只是猜测)。
距离完成这篇论文已经有一段时间了,所以在我有时间仔细校对并确保解释清楚之后,会做一些小的修正。
致谢
我的讲师 Napoleon Reyes。我在写这篇文章时参考了他的讲座,所以感谢 Napoleon。
历史
目前还没有...