示例#1
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
示例#2
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
示例#3
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
示例#4
0
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
示例#6
0
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
示例#7
0
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
示例#8
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