示例#1
0
def randomSolver(nbErreurs, choixExercice):
    """
    Fonction permettant de remplir la matrice "city plan" de façon aléatoire.

    :param nbErreurs: (int) nombre d'erreurs maximale autorisée
    :param choixExercice: (int) choisir parmi les "inputs" fournis par Google. 0->a_*, 5->f_*
    """
    nbErreursCourant = 0

    print("Random Solver lancé !")
    print("Création de grille lancée à : " + time.strftime('%H:%M:%S'))
    print("chargement des projets du fichier " +
          Const.FILE_NAMES[choixExercice] + ".in ...")
    inputs = InManager(Const.FILE_NAMES[choixExercice])
    maximumDistance = inputs.walkDist

    # ici on charge dans projectList les projets présents dans le fichier
    projectList, trueNum = projectListBuilder(inputs)

    print("fichiers chargés\n\nconstructions des batiments ...")

    city = Grid(inputs.rows, inputs.columns)
    while nbErreursCourant < nbErreurs:  # Condition d'arrêt : après un certains nombre d'érreurs consecutives

        # sélection aléatoire de coordonnées et de type de batiment
        numProjectRand = random.randint(0, len(projectList) - 1)
        numColsRand = random.randint(0, inputs.columns)
        numRowsRand = random.randint(0, inputs.rows)

        if city.isBuildable(projectList[numProjectRand],
                            (numRowsRand, numColsRand)):
            # Si le projet peut-être placé alors nous le plaçons aux coordonnées définie aléatoirement.
            city.buildProject(projectList[numProjectRand],
                              (numRowsRand, numColsRand))
        else:
            nbErreursCourant += 1

    inputs.close()

    print("limite de {} erreurs atteinte".format(nbErreursCourant) +
          " : grille construite")

    out = OutManager("{} {}".format(Const.FILE_NAMES[choixExercice],
                                    time.strftime('%d-%m-%Y %H-%M-%S')))

    # city.showNumProject() # Prend beaucoup de ressources.

    print("nombre de batiments résidentiels : ", len(city.buildedR),
          " / utilitaires : ", len(city.buildedU), "\n")

    # on calcule le score et on l'écrit dans un fichier et dans le terminal
    score = getGridScore(projectList, maximumDistance, city.buildedR,
                         city.buildedU, True)
    out.writeScore(score)
    out.writeProjects(getBuildedNums(city.buildedR + city.buildedU, trueNum))
    print("score = ", score)
    # printGrid(city, projectList) # Affichage avec TKinter
    Grid.show(city)  # Affiche la grille dans la console
示例#2
0
def BestCitySolver(nbErreurs, choixExercice, nbSimus):
    """
    Fonction permettant de remplir la matrice "city plan" en divisant la grille originelle puis en maximisant le score dans cette grille plus petite. Puis multiplication pour retrouver la grille par défaut.

    :param nbErreurs: (int) nombre d'erreurs maximale autorisée
    :param choixExercice: (int) choisir parmi les "inputs" fournis par Google. 0->a_*, 5->f_*
    :param nbSimu: (int) nombre de simulation à effectuer pour obtenir la meilleur grille
    """

    simulation_not_stop = True
    score_max = 0
    i = 0
    print("Algo d'adjacence locale lancé !")
    print("Création de grille lancée à : " + time.strftime('%H:%M:%S'))
    print("chargement des projets du fichier " +
          Const.FILE_NAMES[choixExercice] + ".in ...")
    inputs = InManager(Const.FILE_NAMES[choixExercice])
    maximumDistance = inputs.walkDist

    # ici on charge dans projectList les projets présents dans le fichier
    projectList, trueNum = projectListBuilder(inputs)

    print("fichiers chargés\n\nconstructions des batiments ...")

    rows = inputs.rows
    columns = inputs.columns
    if inputs.rows == 1000:
        rows = inputs.rows // 10
        columns = inputs.columns // 10
    best_city = Grid(rows, columns)
    nbErreursCourant = 0
    initialization = True

    # ici on charge dans projectList les projets présents dans le fichier
    i = 0
    n = 0
    while projectList[i].isResid():
        i += 1
    # i est le dernier indice des résidentiels
    residList = projectList[:i]
    utilList = projectList[i:]

    listWeightsR = calculWeight.weight(residList)

    while simulation_not_stop:
        initialization = True
        city = Grid(rows, columns)
        # Création des listes de projets résidentiels et utilitaires:
        # ici on charge dans projectList les projets présents dans le fichier
        while initialization:
            firstProjectResid = calculWeight.selectRandResid(
                residList, listWeightsR)
            firstProjectUtil = calculWeight.selectRandUtil(
                utilList, projectList, maximumDistance, city.buildedU,
                city.buildedR)

            residBuildable = city.isBuildable(
                firstProjectResid,
                (rows // 2 - firstProjectResid.rows // 2, columns // 2))
            utilBuildable = city.isBuildable(
                firstProjectUtil, (rows // 2 - firstProjectUtil.rows // 2,
                                   columns // 2 - firstProjectUtil.columns))

            # Si on arrive à placer les 2 bâtiments, on les place et on passe au placement unitaire
            if residBuildable and utilBuildable:
                city.buildProject(
                    firstProjectResid,
                    (rows // 2 - firstProjectResid.rows // 2, columns // 2))
                city.buildProject(firstProjectUtil,
                                  (rows // 2 - firstProjectUtil.rows // 2,
                                   columns // 2 - firstProjectUtil.columns))

                initialization = False
        while nbErreursCourant < nbErreurs:  # Condition d'arrêt : après un certains nombre d'érreurs consecutives
            # sélection aléatoire de coordonnées et de type de batiment
            numProjectRand = random.randint(0, len(projectList) - 1)
            numColsRand = random.randint(0, columns)
            numRowsRand = random.randint(0, rows)

            if city.isBuildable(projectList[numProjectRand],
                                (numRowsRand, numColsRand)):
                # Si le projet peut-être placé alors nous le plaçons aux coordonnées définie aléatoirement.
                city.buildProject(projectList[numProjectRand],
                                  (numRowsRand, numColsRand))
            else:
                nbErreursCourant += 1
        score_simu = getGridScore(projectList, maximumDistance, city.buildedR,
                                  city.buildedU, False)

        nbErreursCourant = 0
        if score_max < score_simu:
            score_max = score_simu
            best_city = copy.deepcopy(city)
        sys.stdout.write('Simulations en cours ... %3d%%\r' % int(
            (n / nbSimus) * 100))
        n += 1
        if n == nbSimus:
            simulation_not_stop = False

    if inputs.rows == 1000:
        print("duplication de la grille par 100")
        finalCity = duplicate(best_city, 10, 10, projectList)
    else:
        finalCity = best_city

    print("nombre de batiments résidentiels : ", len(finalCity.buildedR),
          " / utilitaires : ", len(finalCity.buildedU), "\n")
    print("Calcul du score ...")
    score_max = getGridScore(projectList, maximumDistance, finalCity.buildedR,
                             finalCity.buildedU, False)
    inputs.close()
    print("Score final : {}".format(score_max))
    print("THE END !")
    out = OutManager("{} {}".format(Const.FILE_NAMES[choixExercice],
                                    time.strftime('%d-%m-%Y %H-%M-%S')))

    out.writeScore(score_max)
    out.writeProjects(
        getBuildedNums(finalCity.buildedR + finalCity.buildedU, trueNum))
    # printGrid(finalCity, projectList) # Affichage avec TKinter
    Grid.show(finalCity)  # Affiche la grille dans la console
示例#3
0
def placementUnitOpti(nbErreurs, choixExercice, nbSimu):
    """
    Fonction permettant de remplir la matrice "city plan" bâtiment par bâtiment en
    optimisant le score.

    :param nbErreurs: (int) nombre d'erreurs maximale autorisée
    :param choixExercice: (int) choisir parmi les "inputs" fournis par Google. 0->a_*, 5->f_*
    :param nbSimu: (int) nombre de simulation à effectuer pour obtenir la meilleur grille
    """

    print("Placement Unitaire Optimisé lancé !")
    print("Création de grille lancée à : " + time.strftime('%H:%M:%S'))
    print("chargement des projets du fichier " +
          Const.FILE_NAMES[choixExercice] + ".in ...")
    inputs = InManager(Const.FILE_NAMES[choixExercice])
    maximumDistance = inputs.walkDist

    # ici on charge dans projectList les projets présents dans le fichier
    projectList, trueNum = projectListBuilder(inputs)
    i = 0
    while isinstance(projectList[i], type(projectList[0])):
        i += 1
    # i est le dernier indice des résidentiels
    residList = projectList[:i]
    utilList = projectList[i:]

    print("fichiers chargés\n\nconstructions des batiments ...")

    listWeightsR = weight(residList)

    bestCity = None
    bestCityScore = 0
    for simuCourrante in range(nbSimu):
        # on effectue un certain nombre de simulations sur city et on garde la meilleure dans bestCity

        if inputs.rows == 1000:
            city = Grid(inputs.rows // 10, inputs.columns // 10)
        else:
            city = Grid(inputs.rows, inputs.columns)

        # on construit les deux premiers batiments au milieu de la map
        initialization = True
        while initialization:

            firstProjectResid = selectRandResid(residList, listWeightsR)
            firstProjectUtil = selectRandUtil(utilList, projectList,
                                              maximumDistance, city.buildedU,
                                              city.buildedR)

            residRandCo = (random.randint(0,
                                          city.grows - firstProjectResid.rows),
                           random.randint(
                               0, city.gcolumns - firstProjectResid.columns))
            utilRandCo = (random.randint(0,
                                         city.grows - firstProjectResid.rows),
                          random.randint(
                              0, city.gcolumns - firstProjectResid.columns))

            residBuildable = city.isBuildable(firstProjectResid, residRandCo)
            utilBuildable = city.isBuildable(firstProjectUtil, utilRandCo)

            # Si on arrive à placer les 2 bâtiments, on les place et on passe au placement unitaire
            if residBuildable and utilBuildable:
                city.buildProject(firstProjectResid, residRandCo)
                city.buildProject(firstProjectUtil, utilRandCo)

                initialization = False

        # on construit le plus de batiment possible avec le meilleur score possible
        constructing = True
        while constructing:

            bestCoords = (-1, -1)
            bestScore = 0

            constructR = (True if random.randint(0, 1) == 1 else False)
            proj = (selectRandResid(residList, listWeightsR) if constructR else
                    utilList[random.randint(0,
                                            len(utilList) - 1)])

            # pour le projet choisi, on teste un certain nombre de coordonnées aléatoires et on garde celles qui rapportent le plus de score
            for nbTests in range(nbErreurs):
                curentCoords = (random.randint(0, city.grows - proj.rows),
                                random.randint(0,
                                               city.gcolumns - proj.columns))
                if city.isBuildable(proj, curentCoords):
                    if constructR:
                        curentScore = getResidScore(
                            projectList,
                            (proj.numProject, curentCoords, proj.capacity),
                            maximumDistance, city.buildedU)
                    else:
                        curentScore = getUtilScore(
                            projectList,
                            (proj.numProject, curentCoords, proj.utilType),
                            maximumDistance, city.buildedR, city.buildedU)

                    if curentScore > bestScore:
                        bestScore = curentScore
                        bestCoords = curentCoords

            if bestCoords != (-1, -1):
                city.buildProject(proj, bestCoords)
            else:
                constructing = False

        scoreSimu = getGridScore(projectList, maximumDistance, city.buildedR,
                                 city.buildedU, False)
        if scoreSimu > bestCityScore:
            bestCity = copy.deepcopy(city)
            bestCityScore = scoreSimu

    finalCity = duplicate(bestCity, 10, 10, projectList)

    inputs.close()

    print("limite de {} simulations atteinte".format(nbSimu) +
          " : grille construite")

    out = OutManager("{} {}".format(Const.FILE_NAMES[choixExercice],
                                    time.strftime('%d-%m-%Y %H-%M-%S')))

    # city.showNumProject() # Prend beaucoup de ressources.

    print("nombre de batiments résidentiels : ", len(finalCity.buildedR),
          " / utilitaires : ", len(finalCity.buildedU), "\n")

    # on calcule le score et on l'écrit dans un fichier et dans le terminal
    score = getGridScore(projectList, maximumDistance, finalCity.buildedR,
                         finalCity.buildedU, True)
    out.writeScore(score)
    out.writeProjects(
        getBuildedNums(finalCity.buildedR + finalCity.buildedU, trueNum))
    print("score = ", score)
    # printGrid(city, projectList) # Affichage avec TKinter
    Grid.show(city)  # Affiche la grille dans la console