Inférence à chaînage avant avec facteurs de certitude

Solutions du code

Module .../moteur_avec_variables_fc/facteurs_certitude.py

""" Fonctions utilitaires pour gérer des facteurs de certitude. """

def fc_ou(fc1, fc2):
    """ Calcule le facteur de certitude d'une disjonction de faits. """
    if fc1 > 0.0 and fc2 > 0.0:
        return fc1 + fc2 - (fc1 * fc2)
    elif fc1 < 0.0 and fc2 < 0.0:
        return fc1 + fc2 + (fc1 * fc2)
    else:
        return (fc1 + fc2) / (1.0 - min(abs(fc1), abs(fc2)))

def fc_et(fc1, fc2):
    """ Calcule le facteur de certitude d'une conjonction de faits. """
    return min(fc1, fc2)

Module .../moteur_avec_variables_fc/regle_avec_variables_fc.py

from .facteurs_certitude import fc_et

class RegleAvecVariables_FC:
    """ Représentation d'une règle d'inférence pour le chaînage avec variables. """

    def __init__(self, conditions, conclusion, fc=1.0):
        """ Construit une règle étant donné une liste de conditions,\
            une conclusion et un facteur de certitude associé.

            :param list conditions: une collection de propositions (pouvant\
            contenir des variables) nécessaires à déclencher la règle.
            :param conclusion: la proposition (pouvant contenir des variables)\
            résultant du déclenchement de la règle.
            :param fc: le facteur de certitude associé.
        """
        self.conditions = conditions
        self.conclusion = conclusion
        self.fc = fc

    def depend_de(self, fait, methode):
        """ Vérifie qu'un fait fait partie, sous réserve de substitution,\
            des conditions de la règle.

            :param fait: un fait qui doit faire partie des conditions de\
            déclenchement.
            :param methode: ``Filtre`` ou ``Unificateur``, détermine le type\
             de pattern match à appliquer.
            :return: un dictionnaire qui attribue un environnement à chaque\
            condition qui peut être satisfaite par le fait pasée en paramètre.\
            ``False`` si aucune condition n'est satisfaite par le fait.
        """

        envs = {}

        for condition in self.conditions:
            # Si au moins une des conditions retourne un environnement,
            # nous savons que la proposition satisfait une des conditions.
            env = methode.pattern_match(fait, condition, {})
            if env != methode.echec:
                envs[condition] = env

        return envs

    def satisfaite_par(self, faits, cond, env, env_fc, methode):
        """ Vérifie que des faits suffisent, sous réserve de substitution,\
            à déclencher la règle.

            :param list faits: une liste de faits.
            :param cond: la condition qui a donné lieu à ``env`` par le\
            pattern match.
            :param dict env: un environnement de départ déjà établi par\
            ``depend_de``.
            :param env_fc: le facteur de certitude associé à ``env``.
            :param methode: ``Filtre`` ou ``Unificateur``, détermine le type\
             de pattern match à appliquer.
            :return: une liste d'environnements qui correspondent à toutes les\
            substitutions possibles entre les conditions de la règle et les\
            propositions. On retourne une liste vide si au moins une condition\
            ne peut être satisfaite.
        """
        envs_et_fcs = [(env, env_fc)]
        conditions_a_tester = [cond1 for cond1 in self.conditions if cond1 != cond]

        for cond1 in conditions_a_tester:
            nouveaux_envs_et_fcs = []

            for fait, fait_fc in faits:
                for env1, env_fc1 in envs_et_fcs:
                    env1 = methode.pattern_match(fait, cond1, env1)
                    if env1 != methode.echec:
                        fc_mix = fc_et(env_fc1, fait_fc)
                        nouveaux_envs_et_fcs.append((env1, fc_mix))

            if len(nouveaux_envs_et_fcs) == 0:
                return []

            envs_et_fcs = nouveaux_envs_et_fcs

        return envs_et_fcs

    def __repr__(self):
        """ Représentation d'une règle sous forme de string. """

        return '{} => {}, {}'.format(str(self.conditions),
                                     str(self.conclusion),
                                     str(self.fc))

Module .../moteur_avec_variables_fc/connaissance_fc.py

from .facteurs_certitude import fc_ou
from moteur_avec_variables_fc.regle_avec_variables_fc import RegleAvecVariables_FC

class BaseConnaissances_FC:
    """ Une base de connaissances destinée à contenir les faits et les règles\
        d'un système de chaînage avec facteurs de certitude.
    """

    def __init__(self):
        """ Construit une base de connaissances. """

        self.faits = {}
        self.regles = []

    def ajoute_un_fait(self, fait):
        """ Ajoute un fait dans la base de connaissances.

            Un fait est un tuple composé du fait proprement dit, c'est-à-dire\
            une proposition sans variable, et optionnellement d'un scalaire\
            représentant son facteur de certitude.

            :param fait: un fait.
        """
        if len(fait) == 2:
            prop, fc = fait
        elif len(fait) == 1:
            prop, fc = fait[0], 1.0
        else:
            raise ValueError("Fait mal formé: " + str(fait))

        fc_deja_present = self.faits.get(prop)
        if fc_deja_present is not None:
            nouveau_fc = fc_ou(fc, fc_deja_present)
            self.faits[prop] = nouveau_fc
        else:
            self.faits[prop] = fc

    def ajoute_faits(self, faits):
        """ Ajoute une liste de faits dans la base de connaissances.

            :param list faits: une liste de faits.
        """

        for fait in faits:
            self.ajoute_un_fait(fait)

    def ajoute_une_regle(self, description):
        """ Ajoute une règle dans la base de connaissances étant donné sa\
            description.

            Une règle est décrite par une liste (ou un tuple) de deux ou trois\
            éléments: une liste de conditions, une conclusion et un facteur de\
            certitude optionnel.

            Les conditions et la conclusion doivent être des propositions.

            :param description: une description de règle.
        """
        if len(description) == 2:
            regle = RegleAvecVariables_FC(description[0], description[1])
        elif len(description) == 3:
            regle = RegleAvecVariables_FC(description[0], description[1], description[2])
        else:
            raise ValueError("Une règle doit avoir deux ou trois éléments. Reçu " +
                             str(description))

        self.regles.append(regle)

    def ajoute_regles(self, descriptions):
        """ Ajoute des règles dans la base de connaissance.

            L'argument est une liste de descriptions, chacune composée d'une\
            liste de conditions, d'une conséquence et optionnellement d'un\
            facteur de certitude.

            :param list descriptions: une liste de descriptions de règles.
        """

        for description in descriptions:
            self.ajoute_une_regle(description)

Module .../moteur_avec_variables_fc/chainage_avant_avec_variables_fc.py

from moteur_sans_variables.chainage import Chainage
from moteur_avec_variables.filtre import Filtre

class ChainageAvantAvecVariables_FC(Chainage):
    """ Un moteur d'inférence à chaînage avant avec variables. """

    def __init__(self, connaissances, methode=None):
        """
            :param methode: ``Filtre`` ou ``Unificateur``, détermine le type de\
            pattern match à appliquer. ``Filtre`` par défaut.
        """

        Chainage.__init__(self, connaissances)

        if methode is None:
            self.methode = Filtre()
        else:
            self.methode = methode

    def instancie_conclusion(self, regle, envs_et_fcs):
        """ Instancie la conclusion d'une règle pour tous les environnements.

            :param regle: la règle dont la conclusion doit être instanciée.
            :param list envs_et_fcs: une liste de paires d'environnements et de\
            facteurs de certitude servant à instancier la conclusion de la règle.
            :return: une liste de propositions correspondant aux différentes\
            instanciations de la conclusion.
        """
        nouveaux_faits = []

        for env, env_fc in envs_et_fcs:
            prop = self.methode.substitue(regle.conclusion, env)
            nouveau_fait = (prop, max(0.0, env_fc) * regle.fc)
            nouveaux_faits.append(nouveau_fait)

        return nouveaux_faits

    def chaine(self):
        """ Effectue le chaînage avant sur les faits et les règles contenus\
            dans la base de connaissances.
        """
        queue = [p for p in self.connaissances.faits.items()]
        self.reinitialise()

        while len(queue) > 0:
            fait, fait_fc = queue.pop(0)

            if (fait, fait_fc) not in self.solutions:
                self.trace.append((fait, fait_fc))
                self.solutions.append((fait, fait_fc))

                # Si le facteur de certitude du fait est supérieur à 0.0
                if fait_fc > 0.0:

                    # on vérifie si des règles sont déclenchées par le nouveau fait.
                    for regle in self.connaissances.regles:
                        envs = regle.depend_de(fait, self.methode)

                        for cond, env in envs.items():
                            # On remplace l'environnement par ceux qui satisfont toutes les conditions de la règle
                            # et pas seulement la première condition.
                            envs1 = regle.satisfaite_par(self.solutions, cond, env, fait_fc, self.methode)

                            # On ajoute à la queue la conclusion de la règle instanciée selon chaque environnement possible.
                            if len(envs1) > 0:
                                queue.extend(self.instancie_conclusion(regle, envs1))
                                self.trace.append(regle)

        return self.solutions

Documentation du code

Fonctions utilitaires pour gérer des facteurs de certitude.

moteur_avec_variables_fc.facteurs_certitude.fc_et(fc1, fc2)

Calcule le facteur de certitude d’une conjonction de faits.

moteur_avec_variables_fc.facteurs_certitude.fc_ou(fc1, fc2)

Calcule le facteur de certitude d’une disjonction de faits.

class moteur_avec_variables_fc.regle_avec_variables_fc.RegleAvecVariables_FC(conditions, conclusion, fc=1.0)

Représentation d’une règle d’inférence pour le chaînage avec variables.

__init__(conditions, conclusion, fc=1.0)

Construit une règle étant donné une liste de conditions, une conclusion et un facteur de certitude associé.

Paramètres:
  • conditions (list) – une collection de propositions (pouvant contenir des variables) nécessaires à déclencher la règle.
  • conclusion – la proposition (pouvant contenir des variables) résultant du déclenchement de la règle.
  • fc – le facteur de certitude associé.
__repr__()

Représentation d’une règle sous forme de string.

depend_de(fait, methode)

Vérifie qu’un fait fait partie, sous réserve de substitution, des conditions de la règle.

Paramètres:
  • fait – un fait qui doit faire partie des conditions de déclenchement.
  • methodeFiltre ou Unificateur, détermine le type de pattern match à appliquer.
Retourne:

un dictionnaire qui attribue un environnement à chaque condition qui peut être satisfaite par le fait pasée en paramètre. False si aucune condition n’est satisfaite par le fait.

satisfaite_par(faits, cond, env, env_fc, methode)

Vérifie que des faits suffisent, sous réserve de substitution, à déclencher la règle.

Paramètres:
  • faits (list) – une liste de faits.
  • cond – la condition qui a donné lieu à env par le pattern match.
  • env (dict) – un environnement de départ déjà établi par depend_de.
  • env_fc – le facteur de certitude associé à env.
  • methodeFiltre ou Unificateur, détermine le type de pattern match à appliquer.
Retourne:

une liste d’environnements qui correspondent à toutes les substitutions possibles entre les conditions de la règle et les propositions. On retourne une liste vide si au moins une condition ne peut être satisfaite.

class moteur_avec_variables_fc.connaissance_fc.BaseConnaissances_FC

Une base de connaissances destinée à contenir les faits et les règles d’un système de chaînage avec facteurs de certitude.

__init__()

Construit une base de connaissances.

ajoute_faits(faits)

Ajoute une liste de faits dans la base de connaissances.

Paramètres:faits (list) – une liste de faits.
ajoute_regles(descriptions)

Ajoute des règles dans la base de connaissance.

L’argument est une liste de descriptions, chacune composée d’une liste de conditions, d’une conséquence et optionnellement d’un facteur de certitude.

Paramètres:descriptions (list) – une liste de descriptions de règles.
ajoute_un_fait(fait)

Ajoute un fait dans la base de connaissances.

Un fait est un tuple composé du fait proprement dit, c’est-à-dire une proposition sans variable, et optionnellement d’un scalaire représentant son facteur de certitude.

Paramètres:fait – un fait.
ajoute_une_regle(description)

Ajoute une règle dans la base de connaissances étant donné sa description.

Une règle est décrite par une liste (ou un tuple) de deux ou trois éléments: une liste de conditions, une conclusion et un facteur de certitude optionnel.

Les conditions et la conclusion doivent être des propositions.

Paramètres:description – une description de règle.
class moteur_avec_variables_fc.chainage_avant_avec_variables_fc.ChainageAvantAvecVariables_FC(connaissances, methode=None)

Bases: moteur_sans_variables.chainage.Chainage

Un moteur d’inférence à chaînage avant avec variables.

ChainageAvantAvecVariables_FC.__init__(connaissances, methode=None)
Paramètres:methodeFiltre ou Unificateur, détermine le type de pattern match à appliquer. Filtre par défaut.
ChainageAvantAvecVariables_FC.affiche_solutions(indent=None)

Affiche les solutions d’un chaînage après l’appel à chaine.

Paramètres:indent (str) – l’identation souhaitée au début de chaque ligne (quatre espaces par défaut).
ChainageAvantAvecVariables_FC.affiche_trace(indent=None)

Affiche la trace d’un chaînage après l’appel à chaine.

Paramètres:indent (str) – l’identation souhaitée au début de chaque ligne (quatre espaces par défaut).
ChainageAvantAvecVariables_FC.chaine()

Effectue le chaînage avant sur les faits et les règles contenus dans la base de connaissances.

ChainageAvantAvecVariables_FC.instancie_conclusion(regle, envs_et_fcs)

Instancie la conclusion d’une règle pour tous les environnements.

Paramètres:
  • regle – la règle dont la conclusion doit être instanciée.
  • envs_et_fcs (list) – une liste de paires d’environnements et de facteurs de certitude servant à instancier la conclusion de la règle.
Retourne:

une liste de propositions correspondant aux différentes instanciations de la conclusion.

ChainageAvantAvecVariables_FC.reinitialise()

Réinitialise le moteur.

La trace et les solutions sont à nouveau vides après l’appel à cette méthode.