Java中的模糊逻辑:在实现去模糊化过程时遇到麻烦(使用质心方法)
Posted
技术标签:
【中文标题】Java中的模糊逻辑:在实现去模糊化过程时遇到麻烦(使用质心方法)【英文标题】:Fuzzy Logic in Java: Having troubles implementing the defuzzification process (using the centroid method) 【发布时间】:2014-06-09 22:50:04 【问题描述】:我已经用 Java 实现了一个完整的模糊逻辑系统,但是我在去模糊化过程中遇到了严重的问题。
在我的代码中,我将输入定义为时间和距离,而输出只是简单的输出。我拥有构建输入和输出集的每个线性函数,因此我可以访问它的任何值。
模糊规则如下:
FuzzySet []outputs = new FuzzySet[9]; //these are the rules
outputs[0] = new FuzzySet(INSUFFICIENT, min(timeMap.get(BAD).getDegreeOfMembership(), distanceMap.get(BAD).getDegreeOfMembership()));
outputs[1] = new FuzzySet(AVERAGE_SUFICIENT, min(timeMap.get(AVERAGE).getDegreeOfMembership(), distanceMap.get(AVERAGE).getDegreeOfMembership()));
outputs[2] = new FuzzySet(SUFFICIENT, min(timeMap.get(GOOD).getDegreeOfMembership(), distanceMap.get(GOOD).getDegreeOfMembership()));
outputs[3] = new FuzzySet(AVERAGE_SUFICIENT, min(timeMap.get(GOOD).getDegreeOfMembership(), distanceMap.get(BAD).getDegreeOfMembership()));
outputs[4] = new FuzzySet(SUFFICIENT, min(timeMap.get(GOOD).getDegreeOfMembership(), distanceMap.get(AVERAGE).getDegreeOfMembership()));
outputs[5] = new FuzzySet(SUFFICIENT, min(timeMap.get(AVERAGE).getDegreeOfMembership(), distanceMap.get(GOOD).getDegreeOfMembership()));
outputs[6] = new FuzzySet(INSUFFICIENT, min(timeMap.get(AVERAGE).getDegreeOfMembership(), distanceMap.get(BAD).getDegreeOfMembership()));
outputs[7] = new FuzzySet(AVERAGE_SUFICIENT, min(timeMap.get(BAD).getDegreeOfMembership(), distanceMap.get(GOOD).getDegreeOfMembership()));
outputs[8] = new FuzzySet(INSUFFICIENT, min(timeMap.get(BAD).getDegreeOfMembership(), distanceMap.get(AVERAGE).getDegreeOfMembership()));
在每个规则中,我首先定义这两个输入的输出所属的集合(可以是INSUFFICIENT
、AVERAGE_SUFFICIENT
或SUFFICIENT
)。完成后,我需要继续进行去模糊化过程,这就是我的理解有点模糊的地方。
通过规则后,我为每组输出设置了三个(基本上我有三个值归类为SUFFICIENT
,三个在SUFFICIENT_AVERAGE
上,三个在INSUFFICIENT
)。那么现在怎么办?所有这 9 个输出都将成为质心计算的一部分吗?我是否选择所有三组中的最大值,然后将它们放入质心公式? (这是我所做的,但与 matlab 相比,结果不起作用)
【问题讨论】:
【参考方案1】:我不是 MATLAB 专家(因此我不能完全确定您的系统结构),但假设结论中的 INSUFFICIENT、AVERAGE_SUFFICIENT 和 SUFFICIENT 是模糊集,那么您只需要担心一个规则即可每个结论集:给出最高成员值的那个。这是因为引用相同结论集的规则通常可以被认为是 OR-ed 在一起(析取),即“IF rule1 OR rule2 OR...”。这为您留下了三个(修改后的)membershp 函数,一个用于 INSUFFICIENT、AVERAGE_SUFFICIENT 和 SUFFICIENT。将它们加在一起(叠加它们?)并计算所得复合曲线下方区域的质心。
但是,根据我的经验,这可能会有点耗时。因此,我经常使用“捷径”:我计算 MF 最大值的加权平均值(类似于 Sugeno 的方法)。据我了解,您已经这样做了,但是对于所有 9 条规则,对吗?当隶属函数很简单(三角形或梯形)且无偏斜(对称)时,该捷径特别有效。
希望这会有所帮助。 (我注意到这是一个相当老的问题,但由于它仍然没有答案......)
【讨论】:
以上是关于Java中的模糊逻辑:在实现去模糊化过程时遇到麻烦(使用质心方法)的主要内容,如果未能解决你的问题,请参考以下文章