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)
import numpy as np import random as rd from glouton import glouton from progDyn import progDyn from localSearch import localSearch from utils import * # Chargement du tenseur de transitions load_file = np.loadtxt('cout_transition.txt', dtype=int) cout_transition = load_file.reshape((24, 5, 24, 5)) # Chargement de l'exemplaire notes = np.loadtxt("./Chansons/fur_elise.txt", skiprows=1, dtype=int) gloutonTime, gloutonCost, gloutonSol = glouton(cout_transition, notes) progDynTime, progDynCost, progDynSol = progDyn(cout_transition, notes) localSearchTime, localSearchCost, localSearchSol = localSearch( cout_transition, notes) print(localSearch(cout_transition, notes, gloutonSol, 100))
def gloutonV1(k, graph, verbose): g.glouton(k, graph, verbose, True)