Beispiel #1
0
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
Beispiel #2
0
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
Beispiel #3
0
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
Beispiel #4
0
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()
Beispiel #5
0
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