예제 #1
0
def test_mutation_indic_ope(num):
    # Permet de calculer sur 100 itérations le nombre de fois où la mutation de 
    # type choisi (0, 1, 2 ou 3) a réussi à générer une solution fille ayant un
    # score de fitness opérationnel supérieur à celui de la meilleure solution 
    # de la génération initiale.
    
    # Initialisation des dictionnaires pour les conversions de fichiers
    dico_transf_init()
    # Classement d'une génération
    ranked = rankings("1") 
    # récupération meilleure solution opérationnelle
    best_ope = choix_indiv_rg(ranked, "1", "fitness_ope", 1)
    iteration_reussie = 0
    start_time = time.time()
    
    if best_ope == "0":
        constantes.typechoix = 1
    else :
        constantes.typechoix = 0

    # Choix du type de la mutation
    mutation = type_mutation(num)

    for i in range(100):
        print("Iter ",i)
        changes_ope = mutation(0, best_ope, 0, True, 1)
        if changes_ope == True: 
            print("Mutation operateur operationnel ok in ", time.time() - start_time)
            iteration_reussie += 1
        
    print("nombre d'itérations réussies :", iteration_reussie)
예제 #2
0
def test_mutation_cravate(num):
    
    # On cherche ici, à partir de la solution présentant le meilleur score 
    # pour l'indicateur de lissage de maintenance, à améliorer le score 
    # opérationnel de cette solution, sans dégrader son score "lissage". Pour 
    # ce faire on utilise dans le re-bouclage l'algorithme glouton avec l'option 
    # "cravate" qui présente de bonnes performances opérationnelles lors de la  
    # création d'une solution.
    
    # Initialisation des dictionnaires pour les conversions de fichiers
    dico_transf_init()
    # Initialisation : création des individus de la première génération
    ranked = rankings("1") # Classement de la premiere génération
    # Initialisation des données du Front de Pareto
    dataPareto = pd.DataFrame() 
    dataPareto = addGeneration(ranked, dataPareto) 
    
    # Récupération de la solution de la génération 1 ayant le meilleur score "lissage"
    best_liss = choix_indiv_rg(ranked, "1", "fitness_lis", 1)
    # On utilise le re-bouclage avec option "cravate"
    constantes.typechoix = 0
    iteration_reussie = 0    
    gen = 2
    
    # Choix du type de la mutation
    mutation = type_mutation(num)  
    
    for i in range(10):
        nom_fichier_sortie(gen,i)
        print("Iter ",i)
        changes_ope = mutation(0, best_liss, 0, True, 3)
        if changes_ope == True: 
            print("Fitness operationnelle améliorée par mutation_cravate")
            iteration_reussie += 1
    
    print("Nombre d'itérations réussies : ", iteration_reussie)

    # Classement et ajout des nouvelles solutions
    ranked = rankings("2") 
    dataPareto = addGeneration(ranked, dataPareto)
    
    drawPareto(dataPareto)
    
    dataPareto.to_csv("ParetoTestCravate.csv",sep=";",index=False,header=None)
예제 #3
0
def test_mutation_indic_lis(num):
    # Permet de calculer sur 100 itérations le nombre de fois où la mutation de 
    # type choisi (0, 1, 2 ou 3) a réussi à générer une solution fille ayant un
    # score de fitness lissage supérieur à celui de la meilleure solution de la 
    # génération initiale.
    
    # Initialisation des dictionnaires pour les conversions de fichiers
    dico_transf_init()
    # Classement d'une génération
    ranked = rankings("1") 
    # récupération meilleure solution lissage
    best_liss = choix_indiv_rg(ranked, "1", "fitness_lis", 1)
    constantes.typechoix = 1
    iteration_reussie = 0
    start_time = time.time()
    # Initialisation des données du Front de Pareto
    dataPareto = pd.DataFrame() 
    dataPareto = addGeneration(ranked, dataPareto) 
    
    # Choix du type de la mutation
    mutation = type_mutation(num)
    for generation in [2,3]:
        for i in range(10):
            print("Generation", generation, "Iter ",i)
            nom_fichier_sortie(generation,i)
            changes_lis = mutation(0, best_liss, 0, False, 1)
            if changes_lis == True: 
                print("mutation operateur lissage maintenance OK in ", time.time() - start_time)
                iteration_reussie += 1
        # Classement et ajout des nouvelles solutions
        ranked = rankings(str(generation)) 
        dataPareto = addGeneration(ranked, dataPareto)
        
    print("nombre d'itérations réussies :", iteration_reussie)
       
    drawPareto(dataPareto)
    dataPareto.to_csv("ParetoTestMutArriereLis.csv",sep=";",index=False,header=None)
예제 #4
0
def test_pareto_optimalite(nb_iter):
    
    # 0: mutation_arriere, 1: mutation_DSP, 2: mutation_i_aleatoire
    indice_mutation = [0, 1, 2]
    
    scores_cumules =  pd.DataFrame(np.nan, index = range(4), columns = range(nb_iter))
    scores_cumules.index = ["mut_arr", "mut_DSP", "mut_i_al", "no_mut"]
    
    fitness =  pd.DataFrame(np.nan, index = range(8), columns = range(nb_iter))
    fitness.index = ["fit_ope_mut_arr", "fit_lis_mut_arr", "fit_ope_mut_DSP", \
                     "fit_lis_mut_DSP", "fit_ope_mut_i_al", "fit_lis_mut_i_al",\
                     "fit_ope_no_mut", "fit_lis_no_mut"]
    
    nb_solution_PO = 0
    for i in range(nb_iter):
        new_indic, new_df = programme(True, 0)
        fitness.loc["fit_ope_no_mut"][i] = fitness_ope_indiv(new_indic)
        fitness.loc["fit_lis_no_mut"][i] = fitness_lis_indiv(new_indic)

        if is_Pareto_opt(fitness.loc["fit_ope_no_mut":"fit_lis_no_mut",:i].T,\
                         fitness.loc["fit_ope_no_mut"][i], fitness.loc["fit_lis_no_mut"][i], "no_mut") :
            nb_solution_PO += 1
            scores_cumules.loc["no_mut"][i] = nb_solution_PO
        print(scores_cumules)
        
    for mut_type in indice_mutation :
        nb_solution_PO = 0
        for it in range(nb_iter):
            ranked = rankings("1")
            sol = choix_indiv_rg(ranked, "1", "fitness_lis", 1)
            mutation = type_mutation(mut_type)
            mutation(0, sol, 0, True, 1)
            # A chaque iteration on réécrit sur la solution test
            nom_mut = scores_cumules.index[indice_mutation[mut_type]]
            print(nom_mut)
            fitness.loc["fit_ope_"+nom_mut][it] = fitness_ope_indiv("solutionTest.csv")
            fitness.loc["fit_lis_"+nom_mut][it] = fitness_lis_indiv("solutionTest.csv")

            if is_Pareto_opt(fitness.loc["fit_ope_"+nom_mut:"fit_lis_"+nom_mut,:it-1].T,\
                         fitness.loc["fit_ope_"+nom_mut][it], fitness.loc["fit_lis_"+nom_mut][it],nom_mut) :
                nb_solution_PO += 1
                scores_cumules.loc[nom_mut][it] = nb_solution_PO
            print(scores_cumules)

    return fitness, scores_cumules
예제 #5
0
파일: main_gen.py 프로젝트: aymiem/pie68
def programme_gen(max_iter, max_time, mut_type):
    print("Lancement du programme génétique")

    start = time.time()
    elapsed = 0

    ### INITIALISATION

    #On remet à zéro le fichier de lecture des données
    resetDonneeLecture()

    # Si les dossiers n'existent pas on les recrée
    if not os.path.exists(paths.indicateurs_path):
        os.mkdir(paths.indicateurs_path)
        os.mkdir(paths.indicateurs_final_path)
        os.mkdir(paths.sitInits_path)
        os.mkdir(paths.solutions_path)
        os.mkdir(paths.solutions_final_path)

    #On vide les répertoires des précédentes solutions
    print('Suppression archives')
    emptyFolder(paths.indicateurs_path)
    #emptyFolder(paths.indicateurs_final_path)
    emptyFolder(paths.sitInits_path)
    emptyFolder(paths.solutions_path)
    #emptyFolder(paths.solutions_final_path)

    # Initialisation des dictionnaires pour les conversions de fichiers
    dico_transf_init()
    # Initialisation : création des individus de la première génération
    d = initialisation(
    )  # Pour avoir un accès aux caractéristiques des missions
    miss_pots = {m.nom: [m.pu, str(int(m.pu))]
                 for m in d["listeMission"]
                 }  # Dico des missions et leur potentiel horaire
    ranked = rankings("1")  # Classement de la premiere génération

    # Initialisation des données du Front de Pareto
    dataPareto = pd.DataFrame()
    dataPareto = addGeneration(ranked, dataPareto)
    # Initialisation du numero de la generation
    gen = 1
    # Itialisation de l'opérateur de mutation
    mutation = type_mutation(mut_type)

    ### EVOLUTION par CROSSOVER et MUTATION

    while ((elapsed <= max_time) & (gen < max_iter)):
        gen += 1
        gen_str = str(gen)

        # CROSSOVER pour les individus X0, X1 selon indicateur opérationnel

        # dictionnaire des solutions pour le crossover
        sols_ope = {}
        sols_ope["best"] = choix_indiv_rg(ranked, gen_str, "fitness_ope", 1)
        sols_ope["worst"] = choix_indiv_rg(ranked, gen_str, "fitness_ope", 0)
        sols_ope["median"] = choix_indiv_rg(ranked, gen_str, "fitness_ope",
                                            0.5)
        # crossover
        print("Crossover sur generation", gen, "pour indic operationnel")
        sitInit_ope = crossover(sols_ope, gen)
        # génération des deux nouveaux individus "solution_gen_0" et "solution_gen_1"
        indiv = 0
        for x in sitInit_ope:
            nom_fichier_sortie(gen, indiv)
            programme(False, x)
            indiv += 1

        # CROSSOVER pour les individus X2, X3 selon indicateur de maintenance

        # dictionnaire des solutions pour le crossover
        sols_lis = {}
        sols_lis["best"] = choix_indiv_rg(ranked, gen_str, "fitness_lis", 1)
        sols_lis["worst"] = choix_indiv_rg(ranked, gen_str, "fitness_lis", 0)
        sols_lis["median"] = choix_indiv_rg(ranked, gen_str, "fitness_lis",
                                            0.5)
        # crossover
        print("crossover sur generation", gen, "pour indic maint lissage")
        sitInit_lis = crossover(sols_lis, gen)
        # génération des deux nouveaux individus "solution_gen_2" et "solution_gen_3"
        for x in sitInit_lis:
            nom_fichier_sortie(gen, indiv)
            programme(False, x)
            indiv += 1

        # MUTATION pour créer individu "solution_gen_4"
        # à partir de l'individu ayant le meilleur score opérationnel

        print("mutation sur generation", gen, "pour indic operationnel")
        nom_fichier_sortie(gen, 4)
        changes_ope = mutation(str(gen - 1), sols_ope["best"], 4, True, 4)

        # MUTATION pour créer individu "solution_gen_5" à partir
        # de l'individu ayant le meilleur score de lissage de maintenance

        print("mutation sur generation", gen, "pour indic maint lissage")
        nom_fichier_sortie(gen, 5)
        changes_lis = mutation(str(gen - 1), sols_lis["best"], 5, False, 4)

        # On conserve les meilleurs individus de la génération précédente et on
        # les intègre à la nouvelle génération sous les numéros "gen_6" et "gen_7"

        nom_fichier_sortie(gen, 6)
        os.rename("solutions\solution" + sols_ope["best"] + ".csv",
                  "solutions\solution" + gen_str + "6" + ".csv")
        os.rename("indicateurs\indicateurs" + sols_ope["best"] + ".csv",
                  "indicateurs\indicateurs" + gen_str + "6" + ".csv")
        if sols_ope["best"] != sols_lis["best"]:
            nom_fichier_sortie(gen, 7)
            os.rename("solutions\solution" + sols_lis["best"] + ".csv",
                      "solutions\solution" + gen_str + "7" + ".csv")
            os.rename("indicateurs\indicateurs" + sols_lis["best"] + ".csv",
                      "indicateurs\indicateurs" + gen_str + "7" + ".csv")

        # Classement de la nouvelle génération et ajout au front de Pareto
        ranked = rankings(gen_str)
        dataPareto = addGeneration(ranked, dataPareto)

        elapsed = time.time() - start

        print(elapsed)

        nom_fichier_sortie(gen, 8)
        nom_fichier_sortie(gen, 9)

        drawPareto(dataPareto)

    ### AFFICHAGE et SAUVEGARDE du front de Pareto

    drawPareto(dataPareto)
    dataPareto.to_csv("dataPareto0.csv", sep=";", index=False, header=None)

    #On determine les solutions pareto-optimales et on les deplace dans les répertoires _final

    pareto_opti = is_pareto_efficient(dataPareto)
    print(pareto_opti)
    for ind in pareto_opti:
        shutil.copy("solutions\solution" + ind + ".csv",
                    "solutions_final\solution" + ind + ".csv")
        addDollars("solutions\solution" + ind + ".csv", d,
                   miss_pots)  #On aoute les dollars pour l'excel
        shutil.copy("indicateurs\indicateurs" + ind + ".csv",
                    "indicateurs_final\indicateurs" + ind + ".csv")

    print("temps total", elapsed, "sec")
    return dataPareto