2

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

4

0 回答 0