コード例 #1
0
def calculateFictifGain(s1,s2,P1,P2,graph):
    return objf.calculateGainNodesAB(s1,s2,P1,P2,graph)
コード例 #2
0
def kl(graph,verbose):
    print "Starting KL version 3.."
    startTime = time.time()
    ## Initialisation ##

    # Sert à mémoriser les sommets échangés
    exchangedNodes = []
    # Liste de partitions
    partitionsList = []
    # Initialisation des listes de sommets à étudier 
    # (une par partition)
    remainingNodesS1 = []
    remainingNodesS2 = []
    
    #  Initialisation des listes de gain fictif
    GFictif = 0
    
    
    ## Déroulement de l'algo ##    
    # bipartition
    partitionsList, graph = g.glouton(2,graph,False,False)
    
    # Mise a jour des listes des sommets à étudier
    remainingNodesS1 = list(partitionsList[0])
    remainingNodesS2 = list(partitionsList[1])
    if verbose: 
        print "Partition Init 1: ", remainingNodesS1
        print "Partition Init 2: ", remainingNodesS2
    
    optimumEqu = False
    # boucle principale
    deltaTime = -time.time()
    
    # calcul du gain global initial
    globalMin = objf.calculateCut(remainingNodesS1,remainingNodesS2,graph)
    if verbose: 
        print "Global Min Initial:", globalMin

    while remainingNodesS1 != [] and remainingNodesS2 != [] and not optimumEqu:
        improvement = False
        P1 = list(partitionsList[0])
        P2 = list(partitionsList[1])
    
        localMin = sys.maxint

        # On inverse l'ordre de P1 et de P2 car les derniers sommets ajoutés
        # sont les plus susceptibles à ressortir en premier
        for nodeA in reversed(remainingNodesS1):
            # s1 : sommet candidat de S1 pour un échange
            s1 = nodeA

            for nodeB in reversed(remainingNodesS2):
                # on cherche le meilleur candidat pour un échange avec s1
                # Calcul du gain lié à l'échange de a et b : G(a,b)
                #gainAB = calculateFictifGain(s1, nodeB, P1, P2, graph)
                gainAB = objf.calculateGainNodesAB(s1, nodeB, P1, P2, graph)

                if gainAB + globalMin < localMin:
                    localMin = gainAB + globalMin
                    # s2 : sommet candidat de S2 pour un échange avec s1
                    s2 = nodeB
                    if verbose: 
                        print "Nouveau gain local:", localMin, "Nodes: ", s1, s2
                    #GFictif = gainAB
                    GFictif = localMin
                
                    
            # Mise a jour du gain global
            if (GFictif < globalMin):
                improvement = True
                globalMin = GFictif
                if verbose: 
                    print "Nouveau gain global:", globalMin, "Nodes:", s1, s2
                exchangedNodes.append(s1)
                exchangedNodes.append(s2)
                
                # P ← échanger les sommets s1 et s2
                partitionsList = switchNodes(partitionsList,s1,s2)                
                if verbose: 
                    print "Les noeuds",s1,"et",s2, "ont été échangés"                
                    print "Partition 1:", partitionsList[0]
                    print "Partition 2:", partitionsList[1]
                
                # Mise a jour des listes des sommets à étudier
                remainingNodesS1 = setRemainingNodes(partitionsList[0],exchangedNodes)
                remainingNodesS2 = setRemainingNodes(partitionsList[1],exchangedNodes)

  
        if (improvement == False):
            if verbose: 
                print "Optimum équilibré trouvé:", objf.calculateCut(partitionsList[0], partitionsList[1], graph)
            optimumEqu = True

    if verbose:
        print ""
        print "Recherche de sommets uniques à changer..."   
   
    while exchangedNodes != [] :
        localMin = sys.maxint
        
        for node in exchangedNodes:
            gain = calculateFictifGainUnique(node, partitionsList[0], partitionsList[1], graph)

            # recherche du meilleur gain local            
            if gain < localMin:
                localMin = gain
                if verbose:
                    print "Nouveau gain local:", localMin, "Node: ", node
                s = node
                GFictif = gain

        exchangedNodes.remove(s)        
        if (GFictif < globalMin):
            globalMin = GFictif
            if verbose: 
                print "Nouveau gain global:", globalMin, "Node:", s
                print "Le noeud",s,"a été échangé de partition"
            partitionsList = switchNodesUnique(partitionsList,s)
 
    stopTime = time.time()
    deltaTime += time.time()
    print "Temps d'exécution total:", stopTime-startTime
    print "Temps d'exécution KL:", deltaTime
    if verbose:
        print "Partition Finale 1:", partitionsList[0]
        print "Partition Finale 2:", partitionsList[1]
    print "Global cut:", objf.calculateCut(partitionsList[0], partitionsList[1], graph)