def branchementAmeliorePlusPlusBornesGlouton(G, C=[], u=None): cpt = 0 E = list(G.edges()) G_copie = gr.copie(G) if u in G_copie.nodes(): gr.suppression(G_copie, u) E = list(G_copie.edges()) if E == []: C.append(u) return C, cpt couvertures = [] e = E[0] dico = dict(gr.degres(G)) e_liste = list(e) if dico[e[0]] < dico[e[1]]: e_liste[0] = e[1] e_liste[1] = e[0] e = tuple(e_liste) for i in range(2): C_temp = C.copy() C_temp.append(e[i]) Gbis = gr.suppression(gr.copie(G), e[i]) if gr.valeurDegreMax(Gbis) == 0: couvertures.append(C_temp) cpt += 1 elif dico[e[i]] == 1: cpt += 1 else: ac = ma.algo_couplage(Gbis) ag = ma.algo_glouton(Gbis) n = len(list(Gbis.nodes())) m = len(list(Gbis.edges())) b1 = m / gr.valeurDegreMax(Gbis) b2 = len(ac) / 2 b3 = (2 * n - 1 - math.sqrt(((2 * n - 1)**2) - (8 * m))) / 2 borneInf = max([b1, b2, b3]) borneSup = len(ag) if borneInf < borneSup: if i == 0: u = None c, cptemp = branchementAmeliorePlusPlusBornesGlouton( Gbis, C_temp, u) elif i == 1: u = e[0] c, cptemp = branchementAmeliorePlusPlusBornesGlouton( Gbis, C_temp, u) couvertures.append(c) cpt += cptemp + 1 else: C_temp = C_temp + ag couvertures.append(C_temp) cpt += 1 if len(couvertures) == 0: return C, cpt elif len(couvertures) == 1 or (len(couvertures[0]) <= len(couvertures[1])): C = couvertures[0] else: C = couvertures[1] return C, cpt
def branchementAmelioreBornesGlouton(G, C=[], u=None): cpt = 0 E = list(G.edges()) G_copie = gr.copie(G) if u in G_copie.nodes(): gr.suppression(G_copie, u) E = list(G_copie.edges()) if E == []: C.append(u) return C, cpt couvertures = [] e = E[0] for i in range(2): C_temp = C.copy() C_temp.append(e[i]) Gbis = gr.suppression(gr.copie(G), e[i]) if gr.valeurDegreMax(Gbis) == 0: couvertures.append(C_temp) cpt += 1 else: ac = ma.algo_couplage(Gbis) ag = ma.algo_glouton(Gbis) n = len(list(Gbis.nodes())) m = len(list(Gbis.edges())) b1 = m / gr.valeurDegreMax(Gbis) b2 = len(ac) / 2 b3 = (2 * n - 1 - math.sqrt(((2 * n - 1)**2) - (8 * m))) / 2 borneInf = max([b1, b2, b3]) borneSup = len(ag) if borneInf < borneSup: if i == 0: # première branche : pas de sommet u à ignorer u = None c, cptemp = branchementAmelioreBornesGlouton( Gbis, C_temp, u) elif i == 1: # deuxième branche : sommet u à ignorer u = e[0] c, cptemp = branchementAmelioreBornesGlouton( Gbis, C_temp, u) couvertures.append(c) cpt += cptemp + 1 else: C_temp = C_temp + ag couvertures.append(C_temp) cpt += 1 if len(couvertures) == 0: return C, cpt elif len(couvertures) == 1 or (len(couvertures[0]) <= len(couvertures[1])): C = couvertures[0] else: C = couvertures[1] return C, cpt
def bornesGloutonTriviale(G, C=[]): cpt = 0 E = list(G.edges()) couvertures = [] e = E[0] for i in range(2): C_temp = C.copy() C_temp.append(e[i]) Gbis = gr.suppression(gr.copie(G), e[i]) if gr.valeurDegreMax(Gbis) == 0: couvertures.append(C_temp) cpt += 1 else: ac = ma.algo_couplage(Gbis) ag = ma.algo_glouton(Gbis) borneInf = len(ac) / 2 borneSup = len(ag) if borneInf < borneSup: c, cptemp = bornesGlouton(Gbis, C_temp) couvertures.append(c) cpt += cptemp + 1 else: C_temp = C_temp + ag couvertures.append(C_temp) cpt += 1 if len(couvertures) == 0: return C, cpt elif len(couvertures) == 1 or (len(couvertures[0]) <= len(couvertures[1])): C = couvertures[0] else: C = couvertures[1] return C, cpt
def bornesCouplageTriviale(G, C=[]): cpt = 0 E = list(G.edges()) # ensemble des arêtes couvertures = [] e = E[0] # arete e for i in range(2): C_temp = C.copy() C_temp.append(e[i]) Gbis = gr.suppression(gr.copie(G), e[i]) if gr.valeurDegreMax(Gbis) == 0: # cran d'arrêt '''si en enlevant le sommet, il n'y a plus d'arrêt alors c'est une feuille''' couvertures.append(C_temp) cpt += 1 else: # calcul des bornes ac = ma.algo_couplage(Gbis) borneInf = len(ac) / 2 borneSup = len(ac) if borneInf < borneSup: # on continue c, cptemp = bornesCouplage(Gbis, C_temp) couvertures.append(c) cpt += cptemp + 1 else: # sinon on élague C_temp = C_temp + ac couvertures.append(C_temp) cpt += 1 # sélection de la couverture minimale à retourner if len(couvertures) == 0: return C, cpt elif len(couvertures) == 1 or (len(couvertures[0]) <= len(couvertures[1])): C = couvertures[0] else: C = couvertures[1] return C, cpt
def algo_glouton(G): Gbis = gr.copie( G ) # copie du graphe afin de préserver l'original pour les autres commandes C = [] E = list(Gbis.edges()) while E != []: # Tant que E n'est pas vide v = gr.degreMax(Gbis) # Prendre un sommet v de degré maximum C.append(v) # Ajouter v à C # et supprimer de E les arêtes couvertes par v Gbis = gr.suppression(Gbis, v) # on supprime de G, v #nwx.draw(G) #plt.show() # pour afficher ensuite E = list(Gbis.edges( )) # on réinitalise E avec le nouveau graphe G avec v de supprimé return C
def bornesInf(G, C=[], borneSup=None): cpt = 0 E = list(G.edges()) # ensemble des arêtes couvertures = [] e = E[0] # arete e for i in range(2): C_temp = C.copy() C_temp.append(e[i]) Gbis = gr.suppression(gr.copie(G), e[i]) if gr.valeurDegreMax(Gbis) == 0: # cran d'arrêt '''si en enlevant le sommet, il n'y a plus d'arrêt alors c'est une feuille''' couvertures.append(C_temp) cpt += 1 if borneSup != None and borneSup > len(C_temp): borneSup = len(C_temp) else: # calcul des bornes ac = ma.algo_couplage(Gbis) n = len(list(Gbis.nodes())) m = len(list(Gbis.edges())) b1 = m / gr.valeurDegreMax(Gbis) b2 = len(ac) / 2 b3 = (2 * n - 1 - math.sqrt(((2 * n - 1)**2) - (8 * m))) / 2 borneInf = max([b1, b2, b3]) if borneSup == None or borneInf < borneSup: # on continue c, cptemp = bornesInf(Gbis, C_temp, borneSup) couvertures.append(c) cpt += cptemp + 1 if borneSup != None and borneSup > len(c): borneSup = len(c) else: # sinon on élague C_temp = C_temp + ac couvertures.append(C_temp) cpt += 1 if borneSup != None and borneSup > len(C_temp): borneSup = len(C_temp) # sélection de la couverture minimale à retourner if len(couvertures) == 0: return C, cpt elif len(couvertures) == 1 or (len(couvertures[0]) <= len(couvertures[1])): C = couvertures[0] else: C = couvertures[1] return C, cpt
def branchement(G, C=[]): cpt = 0 # compteur de noeuds visités E = list(G.edges()) # ensemble des arêtes if E == []: return C, cpt couvertures = [] e = E[0] # prend une arête e for i in range(2): # soit u est dans la couverture, soit v C_temp = C.copy() C_temp.append(e[i]) Gbis = gr.suppression(gr.copie(G), e[i]) # graphe où l’on a supprimé le sommet c, cptemp = branchement(Gbis, C_temp) couvertures.append(c) cpt += cptemp + 1 if len(couvertures[0]) <= len(couvertures[1]): C = couvertures[0] else: C = couvertures[1] return C, cpt
def bornesGlouton(G, C=[]): cpt = 0 E = list(G.edges()) couvertures = [] e = E[0] for i in range(2): C_temp = C.copy() C_temp.append(e[i]) Gbis = gr.suppression(gr.copie(G), e[i]) if gr.valeurDegreMax(Gbis) == 0: couvertures.append(C_temp) cpt += 1 else: ac = ma.algo_couplage(Gbis) ag = ma.algo_glouton(Gbis) n = len(list(Gbis.nodes())) m = len(list(Gbis.edges())) b1 = m / gr.valeurDegreMax(Gbis) b2 = len(ac) / 2 b3 = (2 * n - 1 - math.sqrt(((2 * n - 1)**2) - (8 * m))) / 2 borneInf = max([b1, b2, b3]) borneSup = len(ag) if borneInf < borneSup: c, cptemp = bornesGlouton(Gbis, C_temp) couvertures.append(c) cpt += cptemp + 1 else: C_temp = C_temp + ag couvertures.append(C_temp) cpt += 1 if len(couvertures) == 0: return C, cpt elif len(couvertures) == 1 or (len(couvertures[0]) <= len(couvertures[1])): C = couvertures[0] else: C = couvertures[1] return C, cpt