我正在用FuzzyJess做一个示例项目。首先,我必须能够驾驶机器人避开障碍物。我有一堆这样的规则:
(defrule avoid-obstacle-left
(ProximitySensors
(left ?left & :(fuzzy-match ?left "near"))
(right ?right & :(fuzzy-match ?right "far" ))
(front ?front & :(fuzzy-match ?front "far" ))
)
=>
(assert
(Steer (orientation "right"))
)
)
(defrule avoid-obstacle-front
(ProximitySensors
(left ?left & :(fuzzy-match ?left "far" ))
(right ?right & :(fuzzy-match ?right "far" ))
(front ?front & :(fuzzy-match ?front "near"))
)
=>
(assert
(Steer (orientation "left"))
)
)
在FuzzyJess文档中写道: “其次,如果有许多规则影响同一个输出变量(这在许多应用程序中很常见),那么将所有这些规则的输出变量合并为一个变量通常很有用。这就是全局贡献。一个常见的策略是使用模糊联合来执行所有规则的所有结果的并集。然后在所有规则被触发后,我们将每个规则的贡献的全局效果归结为答案。结果通常是然后消除模糊以提供一个清晰的值来反馈给被控制的系统。模糊淋浴问题就是这个完整过程的一个例子。请注意,在FuzzyJess扩展中,这个全局贡献是作为用户的一部分自动完成的。规则的执行。“
我希望有以下规则:
(defrule use-steer
?ref <- (Steer ?steerValue)
=>
(retract ?ref)
(?*robot* steer ?steerValue)
)
只发射一次,其中?steerValue是由规则前因产生的模糊切割的模糊联合。相反,它会针对每个Steer事实触发一次,并且似乎没有应用全局贡献。