主要内容

模糊逻辑与非模糊逻辑

基本小费问题

为了说明模糊逻辑的价值,检验以下问题的线性和模糊方法:

给服务员多少小费才合适?

首先,通过传统的(非模糊)方法来解决这个问题,编写MATLAB®命令来拼写出线性和分段线性关系。然后,看看使用模糊逻辑的相同系统。

基本小费问题。给出一个从0到10的数字,表示一家餐厅的服务质量(10就很好了),应该给多少小费?

这个问题是基于小费,因为这是美国的典型做法。在美国,一顿饭的平均小费是15%,但实际的小费多少取决于所提供的服务质量。

Nonfuzzy方法

从最简单的关系开始。假设小费总是等于总账单的15%。

服务= 0:.5:10;提示= 0.15 * 1(大小(服务));情节(服务,小费)包含(“服务”) ylabel (“小费”) ylim ([0.05 - 0.25])

图中包含一个轴对象。axis对象包含一个类型为line的对象。

这种关系不考虑服务质量,因此必须在等式中添加一个术语。由于服务是按0到10的等级划分的,所以如果服务差,小费就线性增加5%,如果服务好,小费就线性增加25%。现在关系看起来像下面的情节:

提示=(.20/10)*服务+ 0.05;情节(服务,小费)包含(“服务”) ylabel (“小费”) ylim ([0.05 - 0.25])

图中包含一个轴对象。axis对象包含一个类型为line的对象。

这个公式就是你想要的,而且很简单。然而,你可能也希望小费能反映出食物的质量。这个问题的扩展定义如下。

扩展问题。给定从0到10的两组数字(其中10是最好的),分别代表一家餐厅的服务质量和食物质量,小费应该是多少?

现在您已经添加了另一个变量,看看这个公式是如何受到影响的。

食物= 0:.5:10;[F、S] = meshgrid(食品、服务);提示=(0.20/20)。* (S + F) + 0.05;冲浪(年代,F,小费)包含(“服务”) ylabel (“食物”) zlabel (“小费”

图中包含一个轴对象。axis对象包含一个类型为surface的对象。

在这种情况下,结果看起来令人满意,但当你仔细观察时,它们似乎不正确。假设你希望服务比食物质量更重要。明确服务占小费总额的80%,食物占剩下的20%。

servRatio = 0.8;tip = servRatio*(0.20/10*S+0.05) +...(1-servRatio) * (0.20/10 * F + 0.05);冲浪(年代,F,小费)包含(“服务”) ylabel (“食物”) zlabel (“小费”

图中包含一个轴对象。axis对象包含一个类型为surface的对象。

响应仍然是一致线性的。假设你想要更多的中间的平直回应,也就是说,你想给15%的小费,但如果服务特别好或特别差,也想要具体的变化。这个因子又意味着先前的线性映射不再适用。你仍然可以使用分段线性结构的线性计算。现在,回到考虑服务的一维问题。您可以使用逻辑索引创建一个简单的条件技巧分配。

提示= 0(大小(服务));提示(服务< 3)=(0.10 / 3)*服务(服务< 3)+ 0.05;提示(服务>=3 &服务<7)= 0.15;提示(服务>=7 &服务<=10)=...(0.10 / 3) *(服务(服务> = 7 & < = 10)7)+ 0.15;情节(服务,小费)包含(“服务”) ylabel (“小费”) ylim ([0.05 - 0.25])

图中包含一个轴对象。axis对象包含一个类型为line的对象。

假设您将此方法扩展到两个维度,其中您将再次考虑食品质量。

servRatio = 0.8;提示= 0(大小(S));提示(S<3) = ((0.10/3)*S(S<3)+0.05)*servRatio +...(1-servRatio) * (0.20/10 * F (S < 3) + 0.05);提示(S>=3 & S<7) = (0.15)*servRatio +...(1-servRatio) * (0.20/10 * F(> = 3 &年代< 7)+ 0.05);提示(> = 7 &年代< = 10)= ((0.10 / 3)* (S(> = 7 &年代< = 10)7)+ 0.15)* servRatio +...(1-servRatio) * (0.20/10 * F(> = 7 &年代< = 10)+ 0.05);冲浪(年代,F,小费)包含(“服务”) ylabel (“食物”) zlabel (“小费”

图中包含一个轴对象。axis对象包含一个类型为surface的对象。

情节看起来不错,但功能却出奇的复杂。对于那些没有看到原始设计过程的人来说,甚至不清楚算法是如何工作的。

模糊逻辑方法

通常,您希望捕获这个问题的要点,而不考虑可能是任意的因素。如果您列出了这个问题中真正重要的内容,那么您可能会得到以下规则描述。

小费问题规则-服务因素

  • 如果服务差,小费就便宜

  • 如果服务好,小费是平均的

  • 如果服务很好,小费就会很多

这里列出的规则的顺序是任意的。哪条规则先出现并不重要。为了包括食物质量对小费的影响,添加以下两条规则。

小费问题规则-食物因素

  • 如果食物变质了,小费就便宜了

  • 如果食物很美味,小费就会很多

您可以像这样将两个不同的规则列表合并为一个包含三个规则的列表。

小费问题规则-服务和食物因素

  • 如果服务差或食物腐臭,小费就便宜

  • 如果服务好,小费是平均的

  • 如果服务很好或者食物很美味,小费就会很多

这三个规则是解决方案的核心,它们对应于模糊逻辑系统的规则。当你给语言变量赋予数学意义时(例如,什么是平均技巧),你就拥有了一个完整的模糊推理系统。模糊逻辑的方法论还必须考虑:

  • 所有的规则是如何组合的?

  • 如何从数学上定义平均小费是多少?

问题解决方案

下图代表了解决倾倒问题的模糊逻辑系统。

gensurf (readfis (“蒂珀”))

图中包含一个轴对象。axis对象包含一个类型为surface的对象。

这个图是由考虑服务和食物因素的三条规则生成的。

观察考虑到目前为止对这个例子的一些观察。你找到了一个解决问题的分段线性关系。它是有效的,但它的推导是有问题的,当你把它写成代码时,它就不容易解释了。相反,模糊逻辑系统是基于一些常识陈述。此外,您还可以向列表中添加另外两个规则,它们将影响整个输出的形状,而不需要撤消已经完成的操作。

此外,通过使用模糊逻辑规则,算法结构的维护沿着相当干净的线解耦。每个城市、每个国家的小费标准都在变化。但是,基本逻辑是一样的:如果服务很好,小费应该是平均的。

调整的方法您可以通过简单地移动定义平均值的模糊集来快速地重新校准方法,而不需要重写模糊逻辑规则。

您可以移动分段线性函数的列表,但更有可能出现困难的重新校准。

在下面的例子中,分段线性倾斜问题被重写,使其更通用。它执行与以前相同的功能,只是现在可以很容易地更改常量。

lowTip = 0.05;averTip = 0.15;highTip = 0.25;tipRange = highTip-lowTip;badService = 0;okayService = 3;优= 7;greatService = 10;serviceRange = greatService-badService;badFood = 0; greatFood = 10; foodRange = greatFood-badFood;如果服务差或食物腐臭,小费就不贵如果service...* * servRatio +服务+ lowTip)...(1-servRatio) * (tipRange / foodRange *食品+ lowTip);如果服务很好,小费是一般的elseifservice...(tipRange / foodRange *食物+ lowTip);如果服务很好或食物很美味,小费就会很多其他的= (((highTip-averTip) /...(greatService-goodService)) *...(service-goodService) + averTip) * servRatio +...(1-servRatio) * (tipRange / foodRange *食品+ lowTip);结束

与所有代码一样,引入的通用性越强,算法就越不精确。您可以通过添加更多注释来提高清晰度,或者以稍微更明显的方式重写算法。但是分段线性方法并不是解决这一问题的最佳方法。

如果你从算法中删除了除了三条注释之外的所有内容,剩下的就是你之前写下的模糊逻辑规则。

  • 如果服务差或食物腐臭,小费就便宜

  • 如果服务好,小费是一般的

  • 如果服务很好或者食物很美味,小费就会很多

模糊逻辑使用的语言对你来说是清晰的,对计算机也有意义,这就是为什么它是一种成功的弥合人与机器之间差距的技术。

通过使方程尽可能简单(线性),你使机器的事情更简单,但对你来说更复杂。然而,限制不再是计算机——它是你的思维模型的计算机正在做什么。模糊逻辑让机器按照你的喜好工作,而不是反过来。

相关的话题