예제 #1
0
    def __init__(self, motListe, algo):
        self.listeNoeud = FastTable()
        self.solution = None
        mot = algo.heur(motListe, None)
        motListe.remove(mot)
        for el in mot.getValueDomaine():
            t = (el[1], Noeud(None, motListe[:], mot, el))
            self.listeNoeud.insert(t)

        self.algo = algo
예제 #2
0
class Arbre:
    def __init__(self, motListe, algo):
        self.listeNoeud = FastTable()
        self.solution = None
        mot = algo.heur(motListe, None)
        motListe.remove(mot)
        for el in mot.getValueDomaine():
            t = (el[1], Noeud(None, motListe[:], mot, el))
            self.listeNoeud.insert(t)

        self.algo = algo

    # Fonction qui retourne la feuille possédant la valeur maximum
    # En cas d'égalité, on prend le noeuds le plus profond
    def get_Noeud_Max(self):
        global NBMANMAX
        maxtuple = self.listeNoeud.tail()
        maxval = maxtuple[0]

        # S'il ne reste plus qu'une varible à instanncier on la retourne
        if len(self.listeNoeud) == 0:
            return maxtuple

        # Sinon on récupère tout les noeuds de la liste qui ont la valeur max
        tmp = self.listeNoeud.tail()
        tableMax = [maxtuple]

        while tmp[0] == maxval and len(self.listeNoeud)>0:
            tableMax += [tmp]
            tmp = self.listeNoeud.tail()
        self.listeNoeud.insert(tmp)

        # Parmi les noeuds récupérés, on récupère le plus profond
        elmax = max(tableMax,key=lambda x:x[1].prof)
        tableMax.remove(elmax)
        # On remet les autres noeuds dans la liste
        for el in tableMax:
            self.listeNoeud.insert(el)
        # On renvoi le noeud choisi
        return elmax

    # Fonction de mise à jour de l'arbre
    def update(self):
        # Récupère le noeud max parmis les feuilles et crée ses fils puis les ajoutes à la liste de feuilles
        if len(self.listeNoeud) > 0:
            n = self.get_Noeud_Max()
        else:
            return "Pas de solution"

        l = n[1].create_Fils(self.algo, self.listeNoeud)
        if isinstance(l, Noeud):
            # Si l est un Noeud et non une liste alors c'est la solution optimale
            self.solution = l
            return l