Guest User

Untitled

a guest
May 18th, 2020
279
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 10.80 KB | None | 0 0
  1. import random
  2. import matplotlib.pyplot as plt
  3.  
  4. #####################
  5. #creation simulation#
  6. #####################
  7.    
  8. def simulation():
  9.     """
  10.    entrée: rien
  11.    sortie: rien
  12.    cette fonction est une procédure ou ici on implémentera les différent effet visuel et c'est a partir d'ici que l'on lancera la simulation
  13.    """
  14.  
  15.    
  16.     # input
  17.     limite = int(input("nombre de génération que l'on veut = "))
  18.    
  19.     a = int(input("population a = "))
  20.     b = int(input("population b = "))
  21.     c = int(input("population c = "))
  22.    
  23.     naissance_a = int(input("pourcentage de chance de crée un desendent pour a = "))
  24.     naissance_b = int(input("pourcentage de chance de crée un desendent pour b = "))
  25.     naissance_c = int(input("pourcentage de chance de crée un desendent pour c = "))
  26.  
  27.     print("mutation pour a")
  28.     mutationa_b = int(input("pourcentage de chance de mutation b = "))
  29.     mutationa_c = int(input("pourcentage de chance de mutation c = "))
  30.    
  31.     print("mutation pour b")
  32.     mutationb_a = int(input("pourcentage de chance de mutation a = "))
  33.     mutationb_c = int(input("pourcentage de chance de mutation c = "))
  34.  
  35.     print("mutation pour c")
  36.     mutationc_a = int(input("pourcentage de chance de mutation a = "))
  37.     mutationc_b = int(input("pourcentage de chance de mutation b = "))
  38.  
  39.     liste_mutation = [mutationa_b,mutationa_c,mutationb_a,mutationb_c,mutationc_a,mutationc_b]
  40.     #input
  41.  
  42.  
  43.     #creation des dico
  44.     pop = {}
  45.     pop["a"] = a
  46.     pop["b"] = b
  47.     pop["c"] = c
  48.  
  49.     genetic_naissance = {}
  50.     genetic_naissance["a"] =  naissance_a
  51.     genetic_naissance["b"] =  naissance_b
  52.     genetic_naissance["c"] =  naissance_c
  53.     #creation des dico
  54.  
  55.     #génération simulation
  56.     taille_caneva = a+b+c
  57.     generation_finale = generation_n_fois (liste_mutation,limite, pop, taille_caneva, genetic_naissance)
  58.     #pour l'instant on ne s'occupe que de regarder la population finale mais cela changera dans les futures versions
  59.     return cree_graph(generation_finale, limite)
  60.     #génération simulation
  61.  
  62.  
  63.  
  64.  
  65. #####################
  66. #creation generation#
  67. #####################
  68.  
  69. def generation_n_fois (liste_mutation,limite, pop, taille_caneva, genetic_naissance,valeurs_cle,taux_adaptation,time):
  70.     """
  71.    entrée: une liste d'entier represente les coef de mutation
  72.            un entier nombre de foi ou l'on veut faire des generation
  73.            un dictionnaire d'entier avec des clé de population
  74.            un entier taille que la population doit faire
  75.    sortie: le dictionnaire finale
  76.    permet de faire n fois nouvelle generation
  77.    """
  78.     generation_finales = pop
  79.     liste_generation = []
  80.     cpt = 0
  81.     while cpt <= limite: # tourne la simulation le nombre de fois que limite
  82.         generation_finales = nouvelle_generation (liste_mutation,generation_finales, taille_caneva, genetic_naissance)
  83.         liste_generation = liste_generation+ [generation_finales]
  84.         cpt = cpt + 1
  85.     return liste_generation
  86.  
  87. def nouvelle_generation (liste_mutation, pop, taille_caneva, genetic_naissance,):
  88.     """
  89.    entrée : liste d'entier representes le scoef de mutation
  90.             dictionnaire d'entier avec des clé de population,
  91.             entier taille que la population doit faire
  92.             un dictionnaire d'entier avec des clé de génétique sur les naissances
  93. <    sortie: ce meme dictionnaire d'entier avec des clé de population mais valeurs différente
  94.    cette fonction vas modifier les valeur de la population d'origine
  95.    """
  96.     return echantillonage(mutation(naissance(pop, genetic_naissance), liste_mutation ), taille_caneva)
  97.  
  98. def echantillonage (population_nfixe, taille_caneva):
  99.     """
  100.    entrée: dictionnaire d'entiier avec des clé de population
  101.            entier taille que la population doit faire
  102.    sortie: dictionnaire d'entier avec des clé de population
  103.    echantillonne la population donné pour retrouvé la taille d'origine
  104.    """
  105.     liste = ["a"]*population_nfixe["a"]+["b"]*population_nfixe["b"]+["c"]*population_nfixe["c"]
  106.     liste_choisi = []
  107.     for i in range(0,taille_caneva):
  108.         choix = random.choice(liste)
  109.         liste = nv_list(liste, choix)
  110.         liste_choisi = liste_choisi + [choix]
  111.     dico_echantillon = creedico(liste_choisi)
  112.     return dico_echantillon
  113.  
  114. def creedico (liste):
  115.     """
  116.    entree: liste de caractere
  117.    sorite: dictionnaire
  118.    """
  119.     cpt_a2 = 0
  120.     cpt_b2 = 0
  121.     cpt_c2 = 0
  122.     for i in range(0,len(liste)):
  123.         if liste[i] == 'a':
  124.             cpt_a2 = cpt_a2+1
  125.         elif liste[i] == 'b':
  126.             cpt_b2 = cpt_b2+1
  127.         else:
  128.             cpt_c2 = cpt_c2+1
  129.            
  130.     nv_dico = {}
  131.     nv_dico["a"] = cpt_a2
  132.     nv_dico["b"] = cpt_b2
  133.     nv_dico["c"] = cpt_c2
  134.     return nv_dico
  135.  
  136. def nv_list (liste, carac):
  137.     """
  138.    entrée = liste de caractere rpz les individu
  139.             au caractère ( individu ) a enlevé
  140.    sortie = une liste de caractere rpz les individu restant
  141.    le but de cette fonction est d'enlevé l'individu choisi de la liste des individu restant
  142.    """
  143.     nvliste = []
  144.     cpt = 0
  145.     while liste[cpt] != carac:
  146.         nvliste = nvliste + [liste[cpt]]
  147.         cpt = cpt+1
  148.     for i in range(cpt+1,len(liste)):
  149.         nvliste = nvliste + [liste[i]]
  150.     return nvliste
  151.  
  152. def naissance (pop, genetic_naissance):
  153.     """
  154.    entrée: dictionnaire d'entiier avec des clé de population
  155.            un dictionnaire d'entier avec des clé de génétique sur les naissances
  156.    sortie: un dictionnaire d'entier avec des clé de population(sans taille caneva)
  157.    crée un dicionnaire avec toute les naissances possible
  158.    """
  159.     nv_population = {}
  160.     nv_population["a"] = int(pop["a"])+ int(for_de_naissance(pop, genetic_naissance,'a'))
  161.     nv_population["b"] = int(pop["b"])+ int(for_de_naissance(pop, genetic_naissance,'b'))
  162.     nv_population["c"] = int(pop["c"])+ int(for_de_naissance(pop, genetic_naissance,'c'))
  163.     return nv_population
  164.  
  165. def for_de_naissance(population, genetic_naissance,pop):
  166.     """
  167.    entrée: dictionnaire d'entiier avec des clé de population
  168.            un dictionnaire d'entier avec des clé de génétique sur les naissances
  169.            caractere qui est la population choisi
  170.    sortie: un entier nomlbre de naissance
  171.    """
  172.     cpt_pop = 0
  173.  
  174.     for i in range(0, population[pop]):
  175.         aleatoire = random.randint(0,100)
  176.         if aleatoire <= genetic_naissance[pop] :
  177.             cpt_pop = cpt_pop+1
  178.     return cpt_pop
  179.  
  180. ####################
  181. #creation mutation #
  182. ####################
  183.  
  184. def mutation(dico_pop, liste_mutation):
  185.     """
  186.    entree: dicotionnaire d'entier sur les population
  187.            liste d'entier represente les coef de mutation
  188.    sortie: dictionnaire d'entier sur les population mutée
  189.    cette fonction sert a faire mutéee la pop qui vien de naitre
  190.    """
  191.     pop_total_a = dico_pop["a"]
  192.     pop_total_b = dico_pop["b"]
  193.     pop_total_c = dico_pop["c"]
  194.     liste = liste_mutation
  195.    
  196.     pop_mute_a_vers_b = mutater(pop_total_a,0,liste[0])
  197.     pop_mute_a_vers_c = mutater(pop_total_a,pop_mute_a_vers_b,liste[1])
  198.     pop_mute_b_vers_a = mutater(pop_total_b,0,liste[2])
  199.     pop_mute_b_vers_c = mutater(pop_total_b,pop_mute_b_vers_a,liste[3])
  200.     pop_mute_c_vers_a = mutater(pop_total_c,0,liste[4])
  201.     pop_mute_c_vers_b = mutater(pop_total_c,pop_mute_c_vers_a,liste[5])
  202.    
  203.     dico_muter = {}
  204.     dico_muter["a"] = pop_total_a - pop_mute_a_vers_b - pop_mute_a_vers_c + pop_mute_b_vers_a + pop_mute_c_vers_a
  205.     dico_muter["b"] = pop_total_b - pop_mute_b_vers_a - pop_mute_b_vers_c + pop_mute_a_vers_b + pop_mute_c_vers_b
  206.     dico_muter["c"] = pop_total_c - pop_mute_c_vers_a - pop_mute_c_vers_b + pop_mute_a_vers_c + pop_mute_b_vers_c
  207.  
  208.     return  dico_muter
  209.  
  210. def mutater(population,nb_enlever,coef):
  211.     """
  212.    entree: entier nb individu, eniter nb individu a lenlever du total, entier coeficient mutation
  213.    sortie: entier nb individu muter
  214.    """
  215.     nb_individu_muter = 0
  216.     total = population - nb_enlever
  217.     for i in range(0,total):
  218.         cpt = random.randint(0,100)
  219.         if cpt < coef:
  220.             nb_individu_muter += 1
  221.     return nb_individu_muter
  222.  
  223.  
  224. ####################
  225. #creation graphique#
  226. ####################
  227.  
  228. def cree_graph(dico_generation, nb_generation):
  229.     """entrée: une liste de dictionnaire, valeurs des pop a chaque rang
  230.               un entier, nombre de génération au total
  231.       sortie: rein, procédure
  232.       cette fonction crée un graphique"""
  233.     #creation des données
  234.     #liste d'entier allant de 0 a nb_generation
  235.     liste_generation = []
  236.     liste_generation = cree_liste_entier(nb_generation)
  237.     #liste de la valeurs de la population a chaque generation
  238.     valeurs_pop_a = cree_liste_pop(dico_generation, 'a')
  239.     valeurs_pop_b = cree_liste_pop(dico_generation, 'b')
  240.     valeurs_pop_c = cree_liste_pop(dico_generation, 'c')
  241.     #graphique en ligne
  242.    
  243.     #plt.subplot(400)
  244.     print(liste_generation)
  245.     print(valeurs_pop_a)
  246.     plt.title("nombre d'individu dans chaque population au cour du temp")
  247.     #population a
  248.     plt.plot(liste_generation, valeurs_pop_a)
  249.     #population b
  250.     plt.plot(liste_generation, valeurs_pop_b)
  251.     #population c
  252.     plt.plot(liste_generation, valeurs_pop_c)
  253.    
  254.     plt.ylabel("nombre d'individu")
  255.     plt.xlabel("génération")
  256.     plt.legend()
  257.  
  258.     #diagramme circulaire
  259.  
  260.     #plt.subplot(200)
  261.     #name = ['population a', 'population b', 'population c',]
  262.     #data = [ valeurs_pop_a[-1], valeurs_pop_a[-1], valeurs_pop_a[-1]]
  263.     #explode=( 0.15, 0.15, 0.15,)
  264.     #plt.pie(data, explode=explode, labels=name, autopct='%1.1f%%', startangle=90, shadow=True)
  265.     #plt.axis('equal')
  266.  
  267.     plt.show()
  268.  
  269. def cree_liste_entier(entier):
  270.     """                  
  271.    entree: un entier
  272.    sortie: une liste d'entier, allant de 0 a entier
  273.    """
  274.     liste_entier = []
  275.     for i in range(0,entier + 1):
  276.         liste_entier = liste_entier + [i]
  277.     return liste_entier
  278.  
  279. def cree_liste_pop(dico_valeurs_pop, nompop):
  280.     """                  
  281.    entree: liste de dicotionnaire d'entier, les valeurs des pop a chaque generation
  282.            string, nom de la population
  283.    sortie: une liste d'entier, la liste des individu a chaque génération de la population
  284.    """
  285.     liste_valeurs_pop =[]
  286.     for i in range(0,len(dico_valeurs_pop)):
  287.         liste_valeurs_pop = liste_valeurs_pop + [valeurs_dans_dico(dico_valeurs_pop[i], nompop)]
  288.     return liste_valeurs_pop
  289.  
  290. def valeurs_dans_dico(dictionnaire, classe):
  291.     """
  292.    entree: dictionnaire d'entier
  293.    sortie: attribu a dans le dico
  294.    """
  295.     return dictionnaire.get(classe)
  296.  
  297. def valeurs_dans_list(liste, valeurs):
  298.     """
  299.    entree:
  300.    sortie:
  301.    """
  302.     return liste[valeurs]
  303. #########################
  304. #creation simulation vie#
  305. #########################
Advertisement
Add Comment
Please, Sign In to add comment