我正在用 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 事实触发一次,并且似乎没有应用全局贡献。