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 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 rapportApproximation(p, Nmax, nbInstances): x = np.linspace(1, Nmax, nbInstances) yC = [] yG = [] for i in range(nbInstances): n = int((i + 1) * Nmax / nbInstances) g = gr.grapheAlea(n, p) sol, cpt = branchementAmeliorePlusPlusBornesGlouton(g) solC = ma.algo_couplage(g) solG = ma.algo_glouton(g) yC.append(len(solC) / len(sol)) yG.append(len(solG) / len(sol)) plt.title("Rapport d'approximation") plt.xlabel("Taille n") plt.ylabel("r-approché") plt.plot(x, yC, c='blue', label='algo_couplage') plt.plot(x, yG, c='red', label='algo_glouton') plt.legend() plt.show()
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