我正在尝试使用 scikit-fuzzy 包创建模糊的 ctrl.ControlSystemSimulation。为此,我基于我的数据库创建了 Antecedents(Antecedents:Luminosité_intérieure 和 Antecedent:Luminosité_intérieure)、Consequent(Consequent:Ouverture)和成员函数。 问题是使用循环动态创建 ctrl.Rule() 。 这是我作为 python 字典的规则:
{'Ouverture:Fermé': [{'Chaud': Antecedent: Température_intérieure,
'Fort': Antecedent: Luminosité_intérieure},
{'Doux': Antecedent: Température_intérieure,
'Fort': Antecedent: Luminosité_intérieure}],
'Ouverture:Mi-Hauteur': [{'Chaud': Antecedent: Température_intérieure,
'Moyen': Antecedent: Luminosité_intérieure},
{'Fort': Antecedent: Luminosité_intérieure,
'Frais': Antecedent: Température_intérieure},
{'Doux': Antecedent: Température_intérieure,
'Moyen': Antecedent: Luminosité_intérieure}],
'Ouverture:Ouvert': [{'Froid': Antecedent: Température_intérieure,
'Sombre': Antecedent: Luminosité_intérieure},
{'Chaud': Antecedent: Température_intérieure,
'Sombre': Antecedent: Luminosité_intérieure},
{'Froid': Antecedent: Température_intérieure,
'Moyen': Antecedent: Luminosité_intérieure},
{'Fort': Antecedent: Luminosité_intérieure,
'Froid': Antecedent: Température_intérieure},
{'Frais': Antecedent: Température_intérieure,
'Sombre': Antecedent: Luminosité_intérieure},
{'Frais': Antecedent: Température_intérieure,
'Moyen': Antecedent: Luminosité_intérieure},
{'Doux': Antecedent: Température_intérieure,
'Sombre': Antecedent: Luminosité_intérieure}]}
地点:
{'Ouverture:Fermé': [{'Chaud': Antecedent: Température_intérieure,
'Fort': Antecedent: Luminosité_intérieure},
{'Doux': Antecedent: Température_intérieure,
'Fort': Antecedent: Luminosité_intérieure}], ...}
意义
Ferme = ctrl.Rule(antecedent=((Température_intérieure['Chaud'] & Luminosité_intérieure['Fort']) |
(Température_intérieure['Doux'] & Luminosité_intérieure['Fort'])),
consequent=Ouverture['Ferme']
我想知道如何使用 python 代码循环生成这种规则。 非常感谢。
编辑:
好的,所以也许我必须添加更多细节。 我需要将我的字典格式化为 skfuzzy.control.Term / TermAggregate,我真的不明白这个类对象。 但是,昨天我尝试了一些东西,我可以说这个:
使用此功能:
functools.reduce(lambda x, y: x & y, [antecedent[qualificatif] for k2,v2 in elt_list.items()])
我现在可以产生这个很好的输出:
{'Fermé': [Température_intérieure[Chaud] AND Luminosité_intérieure[Fort],
Température_intérieure[Doux] AND Luminosité_intérieure[Fort]],
'Mi-Hauteur': [Luminosité_intérieure[Moyen] AND Température_intérieure[Chaud],
Luminosité_intérieure[Fort] AND Température_intérieure[Frais],
Température_intérieure[Doux] AND Luminosité_intérieure[Moyen]],
'Ouvert': [Température_intérieure[Froid] AND Luminosité_intérieure[Sombre],
Température_intérieure[Chaud] AND Luminosité_intérieure[Sombre],
Luminosité_intérieure[Moyen] AND Température_intérieure[Froid],
Luminosité_intérieure[Fort] AND Température_intérieure[Froid],
Température_intérieure[Frais] AND Luminosité_intérieure[Sombre],
Luminosité_intérieure[Moyen] AND Température_intérieure[Frais],
Température_intérieure[Doux] AND Luminosité_intérieure[Sombre]]}
最后一步是在元素列表之间生成“或”连接,如下所示:
{'Fermé': [Température_intérieure[Chaud] AND Luminosité_intérieure[Fort] OR
Température_intérieure[Doux] AND Luminosité_intérieure[Fort]]
对于长度为 2 的列表,它适用于此功能:
functools.reduce(lambda x, y: x | y, list_of_rules_by_key)
但是这个产生了这个输出:
{'Fermé': (Température_intérieure[Chaud] AND Luminosité_intérieure[Fort]) OR (Température_intérieure[Doux] AND Luminosité_intérieure[Fort]),
'Mi-Hauteur': ((Luminosité_intérieure[Moyen] AND Température_intérieure[Chaud]) OR (Luminosité_intérieure[Fort] AND Température_intérieure[Frais])) OR (Température_intérieure[Doux] AND Luminosité_intérieure[Moyen]),
'Ouvert': ((((((Température_intérieure[Froid] AND Luminosité_intérieure[Sombre]) OR (Température_intérieure[Chaud] AND Luminosité_intérieure[Sombre])) OR (Luminosité_intérieure[Moyen] AND Température_intérieure[Froid])) OR (Luminosité_intérieure[Fort] AND Température_intérieure[Froid])) OR (Température_intérieure[Frais] AND Luminosité_intérieure[Sombre])) OR (Luminosité_intérieure[Moyen] AND Température_intérieure[Frais])) OR (Température_intérieure[Doux] AND Luminosité_intérieure[Sombre])}
Funtools.reduce 生成此输出语法(基于 https://docs.python.org/fr/3/library/functools.html : reduce(lambda x, y: x | y, [1, 2, 3, 4, 5]) 给出 ((((1|2)|3)|4)|5) 这不是我想要的。 我想要的是 (1 | 2 | 3 | 4 | 5) 其中每个值代表列表的每个元素
非常感谢