コード例 #1
0
ファイル: corrige_tp01.py プロジェクト: borjanG/IA-Vacuum
 def __init__(self, probaExploitation : float,
              lCap: TupLst = [],
              lAct: TupLst = "Gauche Droite Aspirer".split(),
              learn: bool =False) -> None :
     super().__init__(lCap,lAct)
     assert 0 <= probaExploitation <= 1, "Probability expected"
     assert isinstance(learn,bool), "Boolean expected got %s" % type(learn)
     # initialisation de variables privées __XXX (nom à choisir)
     self.__kb = KB() # base de données vide
     self.__proba = probaExploitation
     self.__learn = learn
     self.reset()
コード例 #2
0
ファイル: tp01.py プロジェクト: borjanG/IA-Vacuum
    def __init__(self, probaExploitation, lCap=[], lAct="Gauche Droite Aspirer".split(), learn=False):
        super(Aspirateur_KB,self).__init__(lCap,lAct)

        assert 0 <= probaExploitation <= 1, "Probability expected"
        assert isinstance(learn, bool), "Boolean expected got %s" % type(learn)
        
        self.__knowbase = KB()     # base de données vide
        self.__probaExploitation = probaExploitation
        self.__learn = learn
        self.__lastAction = None  # dernière action choisie
        self.__lastPercept = None # dernier percept reçu
        # self.compteurs = collections.OrderedDict()
        self.compteurs = {'alea': 0, 'exploitation' : 0, 'total' : 0, 'exploration': 0}
コード例 #3
0
 def __init__(self,
              probaExploitation,
              lCap=[],
              lAct="Gauche Droite Aspirer".split(),
              learn=False):
     super(Aspirateur_KB, self).__init__(lCap, lAct)
     assert 0 <= probaExploitation <= 1, "Probability expected"
     assert isinstance(learn, bool), "Boolean expected got %s" % type(learn)
     self._dicAspi["know"] = KB()  # base de données vide
     self._dicAspi["exploit"] = probaExploitation
     self._dicAspi["learn"] = learn
     self._dicAspi["lastaction"] = None  # dernière action choisie
     self._dicAspi["lastpercept"] = None  # dernier percept reçu
     self.compteurs = {
         'alea': 0,
         'exploitation': 0,
         'total': 0,
         'exploration': 0
     }
コード例 #4
0
ファイル: tp01.py プロジェクト: borjanG/IA-Vacuum
class Aspirateur_KB(Aspirateur):
    """ 4 paramètres
        probaExploitation: pas de valeur par défaut
        lCap: valeur par défaut []
        lAct: valeur par défaut la liste des 3 actions Gauche Droite Aspirer
        learn: valeur par défaut False (pas d'apprentissage)
    """
    def __init__(self, probaExploitation, lCap=[], lAct="Gauche Droite Aspirer".split(), learn=False):
        super(Aspirateur_KB,self).__init__(lCap,lAct)

        assert 0 <= probaExploitation <= 1, "Probability expected"
        assert isinstance(learn, bool), "Boolean expected got %s" % type(learn)
        
        self.__knowbase = KB()     # base de données vide
        self.__probaExploitation = probaExploitation
        self.__learn = learn
        self.__lastAction = None  # dernière action choisie
        self.__lastPercept = None # dernier percept reçu
        # self.compteurs = collections.OrderedDict()
        self.compteurs = {'alea': 0, 'exploitation' : 0, 'total' : 0, 'exploration': 0}
        
    @property
    def apprentissage(self): return self.__learn
    @apprentissage.setter
    def apprentissage(self, v):
        assert isinstance(v, bool), "pas bool."
        self.__learn = v    
    @property
    def knowledge(self): return copy.deepcopy(self.__knowbase)
    @knowledge.setter
    def knowledge(self, v):
        assert isinstance(v, KB), "pas KB"
        self.__knowbase = v   
    @property
    def probaExploitation(self): return self.__probaExploitation
    
    # def getEvaluation(self): 
    #     # super().getEvaluation()
    #     return (self.nettoyage+1)/(len(self.knowledge)+1)
        
    def getDecision(self, percepts):
        assert isinstance(percepts,(list,tuple)), "%s should be list or tuple" % percepts
        assert len(percepts) == len(self.capteurs), "percepts and capteurs do not match"
        assert all([x in objetsStatiques for x in percepts]), "bad percepts %s" % percepts

        self.__lastPercept = percepts
        rule_lst = self.__knowbase.find(percepts)

        if len(rule_lst) == 0:
            action = choice(self.actions)
            self.compteurs['alea'] += 1
        else:
            base_actions = [regle.conclusion for regle in rule_lst]
            notbase_actions = list(set(self.actions) - set(base_actions))
            best_rule = max(rule_lst, key = lambda rule: rule.scoreMoyen)
            r = random()
            if r < self.probaExploitation:
                action = best_rule.conclusion
                self.compteurs['exploitation'] += 1
            else:
                num = rule_lst.index(best_rule)
                other_rules = rule_lst[:num] + rule_lst[(num+1):]
                if len(other_rules) !=0:
                    _ = choice(other_rules)
                    action = _.conclusion
                    if _.scoreMoyen < 0 and len(notbase_actions) != 0:
                        action = choice(notbase_actions)
                else:
                    action = choice(notbase_actions)
                self.compteurs['exploration'] += 1 

        self.compteurs['total'] += 1
        self.__lastAction = action
        return self.__lastAction
        
    def setReward(self, value):
        super(Aspirateur_KB,self).setReward(value)
        if self.apprentissage:
            r = Rule(self.__lastPercept, self.__lastAction, value)
            _ = self.knowledge
            _.add(r)
            self.knowledge = _
コード例 #5
0
ファイル: corrige_tp01.py プロジェクト: borjanG/IA-Vacuum
class Aspirateur_KB(Aspirateur):
    """ 4 paramètres
        probaExploitation: pas de valeur par défaut
        lCap: valeur par défaut []
        lAct: valeur par défaut la liste des 3 actions Gauche Droite Aspirer
        learn: valeur par défaut False (pas d'apprentissage)
    """
    def __init__(self, probaExploitation : float,
                 lCap: TupLst = [],
                 lAct: TupLst = "Gauche Droite Aspirer".split(),
                 learn: bool =False) -> None :
        super().__init__(lCap,lAct)
        assert 0 <= probaExploitation <= 1, "Probability expected"
        assert isinstance(learn,bool), "Boolean expected got %s" % type(learn)
        # initialisation de variables privées __XXX (nom à choisir)
        self.__kb = KB() # base de données vide
        self.__proba = probaExploitation
        self.__learn = learn
        self.reset()
        
    def reset(self):
        """ réinitialisation de variables possibles """
        self.__lastAction = None # dernière action choisie
        self.__lastPercept = None # dernier percept reçu
        # compteurs pour statistiques
        self.compteurs = {'alea': 0, 'exploration': 0, 'exploitation': 0, 'total': 0 }
        
    @property
    def apprentissage(self): return self.__learn
    @apprentissage.setter
    def apprentissage(self,v):
        # on vérifie que v est un booléen et si oui on affecte la_variable_privée_contenant_learn
        if isinstance(v,bool): self.__learn = v
        
    @property
    def knowledge(self): return copy.deepcopy(self.__kb)
    @knowledge.setter
    def knowledge(self,v):
        # on vérifie que v est une KB, si oui on affecte la_variable_privée_contenant_la_base_de_connaissance
        if isinstance(v,KB): self.__kb = v
        
    @property
    def probaExploitation(self): return self.__proba
    
    def getEvaluation(self):
        # On renvoie l'évaluation de l'agent
        # (nombre de pièces nettoyées + 1) / ( len(self.knowledge) + 1 )
        if hasattr(self,'nettoyage'):
            return (self.nettoyage +1) / (len(self.knowledge) + 1)
        else: raise AttributeError("no attribut 'nettoyage' found")

        
    def getDecision(self,percepts):
        assert isinstance(percepts,(list,tuple)), "%s should be list or tuple" % percepts
        assert len(percepts) == len(self.capteurs), "percepts and capteurs do not match"
        assert all([ x in objetsStatiques for x in percepts ]), "bad percepts %s" % percepts
        # On sauvegarde percepts dans la_variable_privée_contenant_le_dernier_percept
        # On récupère la liste des règles dont la condition correspond aux percepts
        # Si la liste est vide on choisit une action au hasard
        # Sinon
        #     On calcule les actions les actions dans la base pour ce percept
        #     On calcule les actions pas dans la base pour ce percept
        #     On cherche l'action ayant le meilleur score moyen (elle existe)
        #     On tire un nombre aléatoire (r) que l'on compare à la probabilité d'exploitation
        #     si r < probaExploitation alors 
        #        l'action choisie est celle déterminée par le scoreMoyen maximum
        #     sinon on pioche de manière équiprobable dans les autres actions
        #        si pas d'autres on pioche aléatoirement dans les actions pas dans la base
        #        si elle existe mais que son score est négatif et qu'il y a des actions pas dans la base
        #           on prend une action aléatoire
        # On sauvegarde dans la_variable_privée_contenant_la_dernière_action_choisie
        # On renvoie l'action
        self.__lastPercept = percepts
        _rules = self.knowledge.find(percepts)
        if _rules == [] : 
            _a = random.choice(self.actions)
            self.compteurs['alea'] += 1
        else:
            _possibles = [_.conclusion for _ in _rules ] 
            _newActions = [_ for _ in self.actions if _ not in _possibles ]
            _best = _rules[0] # existe
            for r in _rules:
                if r.scoreMoyen > _best.scoreMoyen : _best = r
            if random.random() < self.probaExploitation: # Exploitation
                _a = _best.conclusion
                self.compteurs['exploitation'] += 1
            elif len(_rules) == 1:
                _a = random.choice( _newActions )
                self.compteurs['alea']+= 1
            else: # d'autres choix possible
                _residu = _rules[:]
                _residu.remove( _best )
                _choix = random.choice( _residu )
                if _choix.scoreTotal < 0 and _newActions != [] :
                    _a = random.choice( _newActions )
                    self.compteurs['alea'] +=1
                else:
                    _a = _choix.conclusion
                    self.compteurs['exploration'] += 1
        self.__lastAction = _a # sauvegarde
        self.compteurs['total'] += 1
        return self.__lastAction
        
                
        
    def setReward(self,value):
        super(Aspirateur_KB,self).setReward(value)
        if self.apprentissage:
            # On crée une Rule avec les 3 paramètres percepts,action,value r = Rule(....)
            # On ajoute cette règle dans la base grace à self.knowledge.add(r)
            self.__kb.add(Rule(self.__lastPercept,self.__lastAction,value))