0

I am trying to create fuzzy a ctrl.ControlSystemSimulation with scikit-fuzzy package. To do that, I created Antecedents ( Antecedent: Luminosité_intérieure and Antecedent: Luminosité_intérieure), Consequent (Consequent: Ouverture) and memberships functions based on my database. The problem is to create ctrl.Rule() dynamically using loop. Here are my rules as python dict :

{'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}]}

Where :

{'Ouverture:Fermé': [{'Chaud': Antecedent: Température_intérieure,
             'Fort': Antecedent: Luminosité_intérieure},
             {'Doux': Antecedent: Température_intérieure,
             'Fort': Antecedent: Luminosité_intérieure}], ...}

meanings

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']

I would like to know how I can generate this kind of rule with a python code loop. Thanks a lot.

EDIT :

Ok, so maybe i have to add more details. I need to format my dict to skfuzzy.control.Term / TermAggregate, and I really don't understand this classe object. But, I tried somethings yersterday and I can say this one :

using this function :

functools.reduce(lambda x, y: x & y, [antecedent[qualificatif] for k2,v2 in elt_list.items()])

I can now produce this output which is good :

{'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]]}

The last step is to produce the "OR" concatenation between element list like this :

{'Fermé': [Température_intérieure[Chaud] AND Luminosité_intérieure[Fort] OR
             Température_intérieure[Doux] AND Luminosité_intérieure[Fort]]

For a list of length 2 it works with this function :

functools.reduce(lambda x, y: x | y, list_of_rules_by_key)

but this one produce this output :

{'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 produce this output syntax (based on https://docs.python.org/fr/3/library/functools.html : reduce(lambda x, y: x | y, [1, 2, 3, 4, 5]) gives ((((1|2)|3)|4)|5) which is not I want. What I want is (1 | 2 | 3 | 4 | 5) where each value represents each element of lists

Thanks a lot

A.Dumas
  • 63
  • 1
  • 5

0 Answers0