def calculateFictifGain(s1,s2,P1,P2,graph): return objf.calculateGainNodesAB(s1,s2,P1,P2,graph)
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)