Guest User

Untitled

a guest
May 17th, 2020
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 15.36 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.     #création selection
  56.     demande_selection = input("voulez vous inclure une selection o/n:")
  57.     if demande_selection == 'o':
  58.         taux_adaptation = cree_taux_selection()
  59.         time = cree_liste_time()
  60.         valeurs_cle = int(input("la valeurs z:"))
  61.     else:
  62.         taux_adaptation = [0]
  63.         time = []
  64.         valeurs_cle = 0
  65.     #création selection
  66.  
  67.     #génération simulation
  68.     taille_caneva = a+b+c
  69.     generation_finale = generation_n_fois (liste_mutation,limite, pop, taille_caneva, genetic_naissance,valeurs_cle,taux_adaptation,time)
  70.     #pour l'instant on ne s'occupe que de regarder la population finale mais cela changera dans les futures versions
  71.     return cree_graph(generation_finale, limite)
  72.     #génération simulation
  73.  
  74. def cree_taux_selection():
  75.     """
  76.    entrée: rien
  77.    sortie: liste d'entier taux selmection a b c
  78.    """
  79.     taux_a = int(input("taux de selection de a:"))
  80.     taux_b = int(input("taux de selection de b:"))
  81.     taux_c = int(input("taux de selection de c:"))
  82.  
  83.     liste = [taux_a]+[taux_b]+[taux_c]
  84.  
  85.     return liste
  86.  
  87. def cree_liste_time():
  88.     """
  89.    entrée: rien
  90.    sortie: liste dde tupple, temps apparition slection
  91.    """
  92.     liste_res = []
  93.     cpt_time = int(input("combien de foix la selection apparait:"))
  94.     for i in range(0,cpt_time):
  95.         liste_res = liste_res + [debut_fin_time(i)]
  96.     return liste_res    
  97.  
  98. def debut_fin_time(cpt):
  99.     """
  100.    entree: entier compteur
  101.    sortie: liste debut fin date
  102.    """
  103.     print("c'estla date n°", cpt )
  104.  
  105.     debut = int(input("date de debut:"))
  106.     fin = int(input("date de fin:"))
  107.     return [debut,fin]
  108.  
  109.  
  110. #####################
  111. #creation generation#
  112. #####################
  113.  
  114. def generation_n_fois (liste_mutation,limite, pop, taille_caneva, genetic_naissance,valeurs_cle,taux_adaptation,time):
  115.     """
  116.    entrée: une liste d'entier represente les coef de mutation
  117.            un entier nombre de foi ou l'on veut faire des generation
  118.            un dictionnaire d'entier avec des clé de population
  119.            un entier taille que la population doit faire
  120.            un dictionnaire d'entier avec des clé de génétique sur les naissances
  121.            un entier, valeurs de z sdoit limite pour selection
  122.            un dictionnaire d'entiet, les taux d'adaptqtion
  123.            une liste d'entier, les apparition de la selection
  124.    sortie: le dictionnaire finale
  125.    permet de faire n fois nouvelle generation
  126.    """
  127.     generation_finales = pop
  128.     liste_generation = []
  129.     cpt = 0
  130.     while cpt <= limite: # tourne la simulation le nombre de fois que limite
  131.         generation_finales = nouvelle_generation (liste_mutation,generation_finales, taille_caneva, genetic_naissance, cpt, valeurs_cle,taux_adaptation,time)
  132.         liste_generation = liste_generation+ [generation_finales]
  133.         cpt = cpt + 1
  134.     return liste_generation
  135.  
  136. def nouvelle_generation (liste_mutation, pop, taille_caneva, genetic_naissance, cpt, valeurs_cle,taux_adaptation,time):
  137.     """
  138.    entrée : liste d'entier representes le scoef de mutation
  139.             dictionnaire d'entier avec des clé de population,
  140.             entier taille que la population doit faire
  141.             un dictionnaire d'entier avec des clé de génétique sur les naissances
  142.             un entier, compte a quelle generation nous somme
  143.             une entier, z
  144.             liste entier, taux adaptation a selection de a b c
  145.             liste de tupple, temps adaptation
  146. <    sortie: ce meme dictionnaire d'entier avec des clé de population mais valeurs différente
  147.    cette fonction vas modifier les valeur de la population d'origine
  148.    """
  149.     return echantillonage(selection(mutation(naissance(pop, genetic_naissance), liste_mutation ), valeurs_cle, taux_adaptation, time, cpt), taille_caneva)
  150.  
  151. def echantillonage (population_nfixe, taille_caneva):
  152.     """
  153.    entrée: dictionnaire d'entiier avec des clé de population
  154.            entier taille que la population doit faire
  155.    sortie: dictionnaire d'entier avec des clé de population
  156.    echantillonne la population donné pour retrouvé la taille d'origine
  157.    """
  158.     liste = ["a"]*population_nfixe["a"]+["b"]*population_nfixe["b"]+["c"]*population_nfixe["c"]
  159.     liste_choisi = []
  160.     for i in range(0,taille_caneva):
  161.         choix = random.choice(liste)
  162.         liste = nv_list(liste, choix)
  163.         liste_choisi = liste_choisi + [choix]
  164.     dico_echantillon = creedico(liste_choisi)
  165.     return dico_echantillon
  166.  
  167. def creedico (liste):
  168.     """
  169.    entree: liste de caractere
  170.    sorite: dictionnaire
  171.    """
  172.     cpt_a2 = 0
  173.     cpt_b2 = 0
  174.     cpt_c2 = 0
  175.     for i in range(0,len(liste)):
  176.         if liste[i] == 'a':
  177.             cpt_a2 = cpt_a2+1
  178.         elif liste[i] == 'b':
  179.             cpt_b2 = cpt_b2+1
  180.         else:
  181.             cpt_c2 = cpt_c2+1
  182.            
  183.     nv_dico = {}
  184.     nv_dico["a"] = cpt_a2
  185.     nv_dico["b"] = cpt_b2
  186.     nv_dico["c"] = cpt_c2
  187.     return nv_dico
  188.  
  189. def nv_list (liste, carac):
  190.     """
  191.    entrée = liste de caractere rpz les individu
  192.             au caractère ( individu ) a enlevé
  193.    sortie = une liste de caractere rpz les individu restant
  194.    le but de cette fonction est d'enlevé l'individu choisi de la liste des individu restant
  195.    """
  196.     nvliste = []
  197.     cpt = 0
  198.     while liste[cpt] != carac:
  199.         nvliste = nvliste + [liste[cpt]]
  200.         cpt = cpt+1
  201.     for i in range(cpt+1,len(liste)):
  202.         nvliste = nvliste + [liste[i]]
  203.     return nvliste
  204.  
  205. def naissance (pop, genetic_naissance):
  206.     """
  207.    entrée: dictionnaire d'entiier avec des clé de population
  208.            un dictionnaire d'entier avec des clé de génétique sur les naissances
  209.    sortie: un dictionnaire d'entier avec des clé de population(sans taille caneva)
  210.    crée un dicionnaire avec toute les naissances possible
  211.    """
  212.     nv_population = {}
  213.     nv_population["a"] = int(pop["a"])+ int(for_de_naissance(pop, genetic_naissance,'a'))
  214.     nv_population["b"] = int(pop["b"])+ int(for_de_naissance(pop, genetic_naissance,'b'))
  215.     nv_population["c"] = int(pop["c"])+ int(for_de_naissance(pop, genetic_naissance,'c'))
  216.     return nv_population
  217.  
  218. def for_de_naissance(population, genetic_naissance,pop):
  219.     """
  220.    entrée: dictionnaire d'entiier avec des clé de population
  221.            un dictionnaire d'entier avec des clé de génétique sur les naissances
  222.            caractere qui est la population choisi
  223.    sortie: un entier nomlbre de naissance
  224.    """
  225.     cpt_pop = 0
  226.  
  227.     for i in range(0, population[pop]):
  228.         aleatoire = random.randint(0,100)
  229.         if aleatoire <= genetic_naissance[pop] :
  230.             cpt_pop = cpt_pop+1
  231.     return cpt_pop
  232.  
  233. ####################
  234. #creation mutation #
  235. ####################
  236.  
  237. def mutation(dico_pop, liste_mutation):
  238.     """
  239.    entree: dicotionnaire d'entier sur les population
  240.            liste d'entier represente les coef de mutation
  241.    sortie: dictionnaire d'entier sur les population mutée
  242.    cette fonction sert a faire mutéee la pop qui vien de naitre
  243.    """
  244.     pop_total_a = dico_pop["a"]
  245.     pop_total_b = dico_pop["b"]
  246.     pop_total_c = dico_pop["c"]
  247.     liste = liste_mutation
  248.    
  249.     pop_mute_a_vers_b = mutater(pop_total_a,0,liste[0])
  250.     pop_mute_a_vers_c = mutater(pop_total_a,pop_mute_a_vers_b,liste[1])
  251.     pop_mute_b_vers_a = mutater(pop_total_b,0,liste[2])
  252.     pop_mute_b_vers_c = mutater(pop_total_b,pop_mute_b_vers_a,liste[3])
  253.     pop_mute_c_vers_a = mutater(pop_total_c,0,liste[4])
  254.     pop_mute_c_vers_b = mutater(pop_total_c,pop_mute_c_vers_a,liste[5])
  255.    
  256.     dico_muter = {}
  257.     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
  258.     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
  259.     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
  260.  
  261.     return  dico_muter
  262.  
  263. def mutater(population,nb_enlever,coef):
  264.     """
  265.    entree: entier nb individu, eniter nb individu a lenlever du total, entier coeficient mutation
  266.    sortie: entier nb individu muter
  267.    """
  268.     nb_individu_muter = 0
  269.     total = population - nb_enlever
  270.     for i in range(0,total):
  271.         cpt = random.randint(0,100)
  272.         if cpt < coef:
  273.             nb_individu_muter += 1
  274.     return nb_individu_muter
  275.  
  276. #####################
  277. #creation selection #
  278. #####################
  279. def selection(dictionnaire_pop,valeurs_clé,taux_adaptation,time, cpt):
  280.     """
  281.    entree: dictionnaire d'entier, individu par population
  282.            entier, valeurs Z
  283.            entier, valeurs Y pour a
  284.            entier, valeurs Y pour b
  285.            entier, valeurs Y pour c
  286.            liste de tuple, temp de selection
  287.            entier, compteur generation
  288.    sortie: dictionnaire d'entier, individu par population
  289.    """
  290.     if time != [] and dans_temp_impartie(time, cpt) == True :
  291.  
  292.         #taux adaptation
  293.         taux_adaptation_a = valeurs_dans_list(taux_adaptation,0)
  294.         taux_adaptation_b = valeurs_dans_list(taux_adaptation,1)
  295.         taux_adaptation_c = valeurs_dans_list(taux_adaptation,2)
  296.         #taux adaptation
  297.  
  298.         #depart
  299.         liste_cle = ['a']*dictionnaire_pop['a']+['b']*dictionnaire_pop['b']+['c']*dictionnaire_pop['c']
  300.         liste_finale = []
  301.         #depart
  302.  
  303.         #for de selection
  304.         for i in range(0,len(liste_cle)):
  305.             test = selection_pour_un(valeurs_clé,liste_cle[i],taux_adaptation_a,taux_adaptation_b,taux_adaptation_c)
  306.             if test == True:
  307.                 liste_finale = liste_finale + [liste_cle[i]]
  308.  
  309.         dictionnaire_cle = creedico(liste_finale)
  310.         #for de selection
  311.  
  312.     else:
  313.         dictionnaire_cle = dictionnaire_pop
  314.  
  315.     return dictionnaire_cle
  316.  
  317. def selection_pour_un(val_z,entite,val_y_a,val_y_b,val_y_c):
  318.     """
  319.    entree: entier, valeurs Z
  320.            charactère, population de l'individu
  321.            entier, valeurs Y pour a
  322.            entier, valeurs Y pour b
  323.            entier, valeurs Y pour c
  324.    sortie: dictionnaire d'entier, individu par population
  325.    """
  326.     val_x = random.randint(0,100)
  327.     res= False
  328.     if entite == 'a':
  329.         if (val_x - val_y_a) <= val_z:
  330.             res = True
  331.     elif entite == 'b':
  332.         if (val_x - val_y_b) <= val_z:
  333.             res = True
  334.     else:
  335.         if (val_x - val_y_c) <= val_z:
  336.             res = True
  337.     return res
  338.  
  339. def dans_temp_impartie(time, nbgeneration):
  340.     """
  341.    entree: liste de tupple, les temps de selection
  342.            un entier, génération actuel
  343.    sortie: booleen
  344.    """
  345.     res = False
  346.     cpt = 0
  347.     while res == False and cpt < len(time):
  348.        
  349.         if est_dans_tupple(time[cpt],nbgeneration) == True:
  350.             res = True
  351.  
  352.         cpt = cpt + 1
  353.  
  354.     return res
  355.  
  356. def est_dans_tupple(tupple,entier):
  357.     """
  358.        entree: tupple
  359.                entier
  360.        sortie: un booleen
  361.    """
  362.  
  363.     res = False
  364.     if entier >= tupple[0] and entier <= tupple[1]:
  365.         res = True
  366.     return res
  367.  
  368. ####################
  369. #creation graphique#
  370. ####################
  371.  
  372. def cree_graph(dico_generation, nb_generation):
  373.     """entrée: une liste de dictionnaire, valeurs des pop a chaque rang
  374.               un entier, nombre de génération au total
  375.       sortie: rein, procédure
  376.       cette fonction crée un graphique"""
  377.     #creation des données
  378.     #liste d'entier allant de 0 a nb_generation
  379.     liste_generation = []
  380.     liste_generation = cree_liste_entier(nb_generation)
  381.     #liste de la valeurs de la population a chaque generation
  382.     valeurs_pop_a = cree_liste_pop(dico_generation, 'a')
  383.     valeurs_pop_b = cree_liste_pop(dico_generation, 'b')
  384.     valeurs_pop_c = cree_liste_pop(dico_generation, 'c')
  385.     #graphique en ligne
  386.    
  387.     #plt.subplot(400)
  388.     print(liste_generation)
  389.     print(valeurs_pop_a)
  390.     plt.title("nombre d'individu dans chaque population au cour du temp")
  391.     #population a
  392.     plt.plot(liste_generation, valeurs_pop_a)
  393.     #population b
  394.     plt.plot(liste_generation, valeurs_pop_b)
  395.     #population c
  396.     plt.plot(liste_generation, valeurs_pop_c)
  397.    
  398.     plt.ylabel("nombre d'individu")
  399.     plt.xlabel("génération")
  400.     plt.legend()
  401.  
  402.     #diagramme circulaire
  403.  
  404.     #plt.subplot(200)
  405.     #name = ['population a', 'population b', 'population c',]
  406.     #data = [ valeurs_pop_a[-1], valeurs_pop_a[-1], valeurs_pop_a[-1]]
  407.     #explode=( 0.15, 0.15, 0.15,)
  408.     #plt.pie(data, explode=explode, labels=name, autopct='%1.1f%%', startangle=90, shadow=True)
  409.     #plt.axis('equal')
  410.  
  411.     plt.show()
  412.  
  413. def cree_liste_entier(entier):
  414.     """                  
  415.    entree: un entier
  416.    sortie: une liste d'entier, allant de 0 a entier
  417.    """
  418.     liste_entier = []
  419.     for i in range(0,entier + 1):
  420.         liste_entier = liste_entier + [i]
  421.     return liste_entier
  422.  
  423. def cree_liste_pop(dico_valeurs_pop, nompop):
  424.     """                  
  425.    entree: liste de dicotionnaire d'entier, les valeurs des pop a chaque generation
  426.            string, nom de la population
  427.    sortie: une liste d'entier, la liste des individu a chaque génération de la population
  428.    """
  429.     liste_valeurs_pop =[]
  430.     for i in range(0,len(dico_valeurs_pop)):
  431.         liste_valeurs_pop = liste_valeurs_pop + [valeurs_dans_dico(dico_valeurs_pop[i], nompop)]
  432.     return liste_valeurs_pop
  433.  
  434. def valeurs_dans_dico(dictionnaire, classe):
  435.     """
  436.    entree: dictionnaire d'entier
  437.    sortie: attribu a dans le dico
  438.    """
  439.     return dictionnaire.get(classe)
  440.  
  441. def valeurs_dans_list(liste, valeurs):
  442.     """
  443.    entree:
  444.    sortie:
  445.    """
  446.     return liste[valeurs]
  447. #########################
  448. #creation simulation vie#
  449. #########################
Advertisement
Add Comment
Please, Sign In to add comment