Beispiel #1
0
def descenteStochastique(nomFichier):
    affectation, carac, listeServeurs, dicoRangees, dicoObstacles = methodeGloutonne2(
        nomFichier)
    cpt = 0
    maxIteration = 5000

    # dicoCaracServeur["id du serveur"] = [taille du serveur, capacite du serveur]
    dicoCaracServeur = {}
    for serveur in listeServeurs:
        dicoCaracServeur[str(serveur[0])] = [serveur[1], serveur[2]]

    while cpt < maxIteration:
        nouvelleAffectation, nouveauDicoObstacles = voisinage.uneAffectationVoisine(
            affectation, carac, listeServeurs, dicoObstacles, dicoCaracServeur,
            0.30, 0.66)
        if outils.calculScore(nouvelleAffectation, carac,
                              dicoCaracServeur) > outils.calculScore(
                                  affectation, carac, dicoCaracServeur):
            affectation = deepcopy(nouvelleAffectation)
            dicoObstacles = deepcopy(nouveauDicoObstacles)
        cpt += 1

    outils.genererFichierSolution(affectation, nomFichier,
                                  "descenteStochastique")

    print "Score descente stochastique: ", outils.calculScore(
        affectation, carac, dicoCaracServeur)
Beispiel #2
0
def recuitSimule(nomFichier):
    affectation, carac, listeServeurs, dicoRangees, dicoObstacles = methodeGloutonne2(
        nomFichier)
    temperature = 5  #Il faut jouer ici
    cpt = 0
    #    nouveauDicoObstacles = dicoObstacles
    RX = deepcopy(affectation)
    X = deepcopy(affectation)
    tmp = 0.99
    # dicoCaracServeur["id du serveur"] = [taille du serveur, capacite du serveur]
    dicoCaracServeur = {}
    for serveur in listeServeurs:
        dicoCaracServeur[str(serveur[0])] = [serveur[1], serveur[2]]

    while (temperature > math.pow(10, -3)):
        #      Y, nouveauDicoObstacles = voisinage.uneAffectationVoisine2(X,carac,listeServeurs,dicoObstacles, dicoCaracServeur)
        Y, nouveauDicoObstacles = voisinage.uneAffectationVoisine(
            X, carac, listeServeurs, dicoObstacles, dicoCaracServeur, 0.30,
            0.60)
        scoreY = outils.calculScore(Y, carac, dicoCaracServeur)
        scoreRX = outils.calculScore(RX, carac, dicoCaracServeur)
        scoreX = outils.calculScore(X, carac, dicoCaracServeur)
        #print("ScoreY, ScoreX, ScoreRX")
        #print( scoreY, scoreX, scoreRX)

        if scoreY > scoreRX:
            RX = deepcopy(Y)
            dicoObstacles = deepcopy(nouveauDicoObstacles)
        if scoreY > scoreX:
            X = deepcopy(Y)
            dicoObstacles = deepcopy(nouveauDicoObstacles)
        else:
            RND = random.random()  #Il faut jouer ici
            # print("ScoreY, ScoreX")
            #print( scoreY, scoreX)
            if (RND <= math.exp((scoreY - scoreX) / temperature)):
                #print("pris")
                # print("Hasard",RND,math.exp( (scoreY - scoreX) / temperature) )
                X = deepcopy(Y)
                dicoObstacles = deepcopy(nouveauDicoObstacles)

        if cpt % 100 == 0:
            temperature = temperature * tmp
        cpt += 1
        #bla +=1
    #print("nombre de tours",bla)
    outils.genererFichierSolution(RX, nomFichier, "recuitSimule")

    print("Score recuit simule: ",
          outils.calculScore(RX, carac, dicoCaracServeur))
Beispiel #3
0
def methodeGloutonne1(nomFichier):
    """
    Implementation de l'algorithme glouton de la Q 1.1. du sujet
    - Entree :
        nomFichier, nom de l'instance sur laquelle on applique l'algorithme
    - Sortie :
        genere un fichier enregistrant l'affectation, 
        affiche la repartition des serveurs sur les rangees et le score dans la console
        retourne les differentes structure de donnees generees
    """
    carac, dicoObstacles, listeServeurs, dicoRangees = outils.creeStructureDonnees(
        nomFichier)
    affectation = {}
    slotTrouve = False

    #Creer affectation
    for s in listeServeurs:
        for r in range(carac["R"]):
            numSlot = outils.positionServeurSlot(dicoObstacles[str(r)], s[1],
                                                 carac["S"])
            if numSlot != None:
                for i in range(s[1]):
                    dicoObstacles[str(r)].append(numSlot + i)
                    dicoRangees[str(r)][numSlot + i] = str(s[0])
                dicoObstacles[str(r)].sort()
                slotTrouve = True
                affectation[str(s[0])] = [r, numSlot]
                break
        if slotTrouve == False:
            affectation[str(s[0])] = 'x'

        slotTrouve = False

    #Affection des pools
    numPool = -1
    valTemp = None
    for k in dicoRangees.keys():
        for v in dicoRangees[k]:
            if not v == 'x':
                if not v == valTemp:
                    if numPool < carac["P"] - 1:
                        numPool += 1
                    else:
                        numPool = 0
                    affectation[v].append(numPool)
                    valTemp = v

    outils.genererFichierSolution(affectation, nomFichier, "glouton1")

    # dicoCaracServeur["id du serveur"] = [taille du serveur, capacite du serveur]
    dicoCaracServeur = {}
    for serveur in listeServeurs:
        dicoCaracServeur[str(serveur[0])] = [serveur[1], serveur[2]]

    score = outils.calculScore(affectation, carac, dicoCaracServeur)
    print "Score methode gloutonne 1 : ", score

    return affectation, carac, listeServeurs, dicoRangees, dicoObstacles
Beispiel #4
0
def methodeGloutonne2(nomFichier):
    """
    Implementation de notre l'algorithme personnelle glouton de la Q 1.2. du sujet
    - Entree :
        nomFichier, nom de l'instance sur laquelle on applique l'algorithme
    - Sortie :
        genere un fichier enregistrant l'affectation,
        affiche la repartition des serveurs sur les rangees et le score dans la console
        retourne les differentes structure de donnees generees
    """
    carac, dicoObstacles, listeServeurs, dicoRangees = outils.creeStructureDonnees(
        nomFichier)
    listeServeurs = outils.donnerPoolAuxServeurs(listeServeurs, carac)
    dicoPoolsCapacite = {}
    affectation = {}
    slotTrouve = False

    # dictionnaire dicoPoolsCapacite
    # cle : numero de pool, valeur : [numero de rangee, capacite dans la rangee de ce pool]
    for i in range(0, carac['P']):
        dicoPoolsCapacite[str(i)] = []
        for j in range(0, carac['R']):
            dicoPoolsCapacite[str(i)].append([j, 0])

    for s in listeServeurs:
        for r in dicoPoolsCapacite[str(s[3])]:
            numSlot = outils.positionServeurSlot((dicoObstacles[str(r[0])]),
                                                 s[1], carac["S"])
            if numSlot != None:
                for i in range(s[1]):
                    dicoObstacles[str(r[0])].append(numSlot + i)
                    dicoRangees[str(r[0])][numSlot + i] = str(s[0])
                dicoObstacles[str(r[0])].sort()
                slotTrouve = True
                affectation[str(s[0])] = [r[0], numSlot, s[3]]

                r[1] += s[2]
                dicoPoolsCapacite[str(s[3])].sort(key=lambda tup: tup[1])
                break

        if slotTrouve == False:
            affectation[str(s[0])] = 'x'

        slotTrouve = False

    outils.genererFichierSolution(affectation, nomFichier, "glouton2")

    # dicoCaracServeur["id du serveur"] = [taille du serveur, capacite du serveur]
    dicoCaracServeur = {}
    for serveur in listeServeurs:
        dicoCaracServeur[str(serveur[0])] = [serveur[1], serveur[2]]

    score = outils.calculScore(affectation, carac, dicoCaracServeur)
    print "Score methode gloutonne 2 : ", score

    return affectation, carac, listeServeurs, dicoRangees, dicoObstacles
def heuristiqueArrondiPerso2(nomFichier, pourcentage, z_mrsi, dicoCaracServeur,
                             carac):
    #    z_mrsi, dicoCaracServeur, carac = resolution_PL(nomFichier, pourcentage, "pl")

    masqueServeurLibre = {}
    listeTriee = []
    for m in z_mrsi.keys():
        masqueServeurLibre[m] = True
        for r in z_mrsi[m].keys():
            for s in z_mrsi[m][r].keys():
                for i in z_mrsi[m][r][s].keys():
                    listeTriee.append((m, r, s, i, z_mrsi[m][r][s][i].x))

    listeTriee.sort(key=lambda tup: tup[4], reverse=True)

    dicoVerif = {}
    affectation = {}
    rangeeCapacitesPools = {}

    for i in range(0, carac['R']):
        dicoVerif[str(i)] = ['' for j in range(carac['S'])]
        rangeeCapacitesPools[i] = []
        for j in range(0, carac['P']):
            rangeeCapacitesPools[i].append([j, 0])

    for elt in listeTriee:
        placementOk = True
        taille = dicoCaracServeur[elt[0]][0]
        if masqueServeurLibre[elt[0]]:
            for s in range(taille):
                if (dicoVerif[elt[1]][int(elt[2]) + s] != ''):
                    placementOk = False
                    break

            if placementOk:
                affectation[elt[0]] = [
                    int(elt[1]),
                    int(elt[2]), rangeeCapacitesPools[int(elt[1])][0][0]
                ]  # affecte le pool qui a le moins de capacite
                rangeeCapacitesPools[int(elt[1])][0][1] += dicoCaracServeur[
                    elt[0]][1]  #ajoute sa capacité au pool

                rangeeCapacitesPools[int(elt[1])].sort(key=lambda tup: tup[1])
                masqueServeurLibre[
                    elt[0]] = False  #marque ce serveur comme déjà place
                for s in range(taille):
                    dicoVerif[elt[1]][int(elt[2]) + s] = elt[0]

            else:
                affectation[elt[0]] = 'x'

    score = outils.calculScore(affectation, carac, dicoCaracServeur)
    print "Score obtenu avec notre heuristique perso 2 :", score
def heuristiqueArrondi(nomFichier, pourcentage):
    z_mrsi, dicoCaracServeur, carac = resolution_PL(nomFichier, pourcentage,
                                                    "pl")

    # cle : id du serveur, valeur : True / False pour savoir par la suite si le serveur est deja affecte ou non
    masqueServeurLibre = {}
    listeTriee = []
    for m in z_mrsi.keys():
        masqueServeurLibre[m] = True
        for r in z_mrsi[m].keys():
            for s in z_mrsi[m][r].keys():
                for i in z_mrsi[m][r][s].keys():
                    listeTriee.append((m, r, s, i, z_mrsi[m][r][s][i].x))

    listeTriee.sort(key=lambda tup: tup[4], reverse=True)

    dicoVerif = {}
    affectation = {}

    for i in range(0, carac['R']):
        dicoVerif[str(i)] = ['' for j in range(carac['S'])]

    for elt in listeTriee:
        placementOk = True
        taille = dicoCaracServeur[elt[0]][0]
        if masqueServeurLibre[elt[0]]:
            for s in range(taille):
                if (dicoVerif[elt[1]][int(elt[2]) + s] != ''):
                    placementOk = False
                    break
            # Si on peut le placer et que le serveur n'a pas encore ete affecte, on le place et on l'affecte
            if placementOk:
                affectation[elt[0]] = [int(elt[1]), int(elt[2]), int(elt[3])]
                masqueServeurLibre[elt[0]] = False
                for s in range(taille):
                    dicoVerif[elt[1]][int(elt[2]) + s] = elt[0]
            else:
                affectation[elt[0]] = 'x'

    score = outils.calculScore(affectation, carac, dicoCaracServeur)
    print "Score obtenu avec l'heuristique arrondi :", score

    return z_mrsi, dicoCaracServeur, carac