CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[DEBUTANT] Simulation d'épidémie, HELP !

saphira331
saphira331
Niveau 7
02 mai 2020 à 14:12:06

Salut :hap:

Je débute sur Python. J'ai commencé à l'apprendre hier donc rigolez pas si je dis de la merde ou que mon problème est basique. :hap:

Donc ce matin j'ai commencé un petit exercice pour m'entraîner, et que je voulais faire depuis le début : une simulation d'épidémie se basant sur plusieurs paramètres d'une fonction qu'on va nommer pandemic(). Voici le code pour l'instant :

def pandemic(deathRate,recoveryRate,population,reproductionNumber,lockdownRate,lockDown_reduceRate,finalDay):

  from time import sleep

  """SIMULATION OF PANDEMIC    

  NOT SUPPOSED TO BE LEGIT"""

  # AFFECTING VARIABLES:
  day = 0
  infected = 1
  dead = 0
  recovered = 0
  totalRecovered = 0

  # DATA COMPUTATION:
  while day != finalDay:

    # INFECTED & DEAD & TOTAL INFECTED & RECOVERED & LOCKED DOWN & POPULATION REDUCE
    infected += (reproductionNumber*infected)
    dead = ((infected-dead)*deathRate)/100
    dead = int(dead)
    infected -= dead
    totalInfected = infected + dead
    recovered = (infected*recoveryRate)/100
    recovered = int(recovered)
    totalRecovered += recovered
    locked_down = (lockdownRate*population)/100
    locked_down = int(locked_down)
    lockedDown_reduce = (lockDown_reduceRate*locked_down)/100
    lockedDown_reduce = int(lockedDown_reduce)
    population -= dead
    infected -= recovered

    # LOCK DOWN REDUCE 1 DAY OVER 2
    if day%2==0:
      locked_down -= lockedDown_reduce
      int(locked_down)
    else:
      lockedDown_reduce = 0
    # SPECIAL CASES TREATMENT
    if reproductionNumber == 0:
      infected = 1
      totalInfected = 1
      if deathRate == 100:
        dead = 1
        infected = 1
        totalInfected = 1
    # COUNTING DAYS LOOP
    day += 1
    # ANNOUNCING DAILY DATA
    print("Day", day, """:
    Remaining population:""", population, """
    Current infected:""", infected, """
    Total infected:""", totalInfected, """
    New recovered:""", recovered, """
    Total recovered:""", totalRecovered, """
    Number of total deaths:""", dead, """
    Locked down:""", locked_down, """
    Locked down reduce:""", lockedDown_reduce)
    # BREAKING THE LOOP
    if infected > population:
      infected += (population - infected)
      day += 1
      if totalInfected > population:
        totalInfected = population
      if day%2==0:
        locked_down -= lockedDown_reduce
        int(locked_down)
      else:
        lockedDown_reduce = 0

      print("FINAL DAY", day, """:
    Remaining population:""", population, """
    Current infected:""", infected, """
    Total infected:""", totalInfected, """
    New recovered:""", recovered, """
    Total recovered:""", totalRecovered, """
    Number of total deaths:""", dead, """
    Locked down:""", locked_down, """
    Locked down reduce:""", lockedDown_reduce)
      break
    # LOADING IMPRESSION
    sleep(0.005)

Si vous voulez bien m'aider pour ce qui suit, le mieux serait d’exécuter le programme par vous-même et d'essayer différents paramètres. :hap:

J'ai rencontré plusieurs obstacles et problèmes et j'aimerai bien que vous me donniez des pistes de résolution.
1- Donc comme vous pouvez le voir, il y a un paramètre qui indique le lockdown rate (le taux de "confinement" dans la population quoi (et qui d'ailleurs ne résulte pas forcément de la propagation du virus)). Ce lockdown rate génère par la suite une variable locked_down qui désigne le nombre de confinés (se basant sur le nombre d'individus dans la population ajouté en paramètre). Le truc que je veux faire est d'exclure les confinés de la population, pour qu'ils ne soient pas comptés en infectés. Sauf que comme vous pouvez le voir dans la code, le nombre d'infectés n'est pas exprimé en fonction de la population. Donc si je fais population -= locked_down, ça ne changera rien aux infectés. Et c'est surtout que je veux que les confinés soient comptés en tant qu'individus de la population. La seconde solution qui s'offre à moi et de soustraire le nombre de confinés du nombre d'infectés. Or, si je mets infected -= locked_down dans les débuts du programme, j'aurai des nombres négatifs, car au début le nombre d'infectés est très bas, alors que le nombre de confinés est assez haut. Et donc ça brouillera tous les données du programme. Donc je fais comment pour faire en sorte que les confinés ne soient pas infectés ?
2- Comment je peux faire pour arrêter le programme quand le totalInfected est égal à toute la population (ou bien à la population - lockedDown) et que tous les infectés sont soi morts soi guéris ?

Donc voilà j'ai sûrement besoin d'aide dans tout le code, si quelqu'un pouvait le corriger un peu et surtout ces deux points que j'ai mentionnés. :hap:

Merci.
Je sais que le code est très désordonné et pas du tout optimisée. J'ai écrit les variables en anglais car je veux le pratiquer. :hap:

PS: quelques nota bene:
- 1 jour sur 2, le nombre de confinés est réduit d'un certain taux paramétré. Le jour suivant, il revient à l'état normal.
- reproductionNumber est le terme anglais pour dire index de contagiosité (c'est-à-dire, une personne infecte combien en moyenne).

Message édité le 02 mai 2020 à 14:14:09 par saphira331
saphira331
saphira331
Niveau 7
02 mai 2020 à 14:36:00

J'ai oublié de préciser que c'était du Python, pardon :up:

HoMaDouceAah
HoMaDouceAah
Niveau 62
02 mai 2020 à 21:51:30

hmrpl y'a pas une video de 3blue1brown ? ca s'appele une courbe logistique ce que tu cherche a faire non ? j'ai lu en diagonale

ha j'ai trouvé. https://www.youtube.com/watch?v=Kas0tIxDvrg&t=22s
je suis saoul et j'ai pas lu ton code, mais 3blue1brown ca fait jamais de mal a personne

blackapplex
blackapplex
Niveau 10
03 mai 2020 à 16:38:12

Déjà globalement c'est ambitieux si tu débutes :hap: Mais c'est bien il faut avoir de l'ambition :ok:

Ton problème est un problème de conception de la simulation:

Sauf que comme vous pouvez le voir dans la code, le nombre d'infectés n'est pas exprimé en fonction de la population.

Evidemment c'est là que ça coince. Un nombre d'infecté est forcément fonction d'une population. Ce que tu dois déterminer chaque jour c'est le taux de la population qui passe en infecté. Avec confinement, ce taux est faible, sans confinement, ce taux est fort :ok:
Oublie pas de toujours garder des références relatives pour éviter d'avoir des nombres d'infectés négatif ou supérieur au total de la population.

Comment je peux faire pour arrêter le programme quand le totalInfected est égal à toute la population (ou bien à la population - lockedDown) et que tous les infectés sont soi morts soi guéris ?

Bah avec un break non :noel: ? if infecté > size_population: print("Game over");break;
Bonne chance :noel: Et si tu débutes et que t'arrives à un moment avec un code flou, hésites pas à tout reprendre de 0 surtout quand t'as juste une 30aine de ligne à retapper

Pseudo supprimé
Pseudo supprimé 03 mai 2020 à 18:50:29

Tu as commencé à apprendre hier et tu en est déjà la ?
Soit tu connais déjà un langage, soit .. chapeau !

saphira331
saphira331
Niveau 7
04 mai 2020 à 01:12:36

Salut ! :hap:
J'ai pas encore retravaillé le programme et je pense que je vais tout refaire à 0, et faire plus organisé et propre.

HoMaDouceAah > la vidéo est super intéressante, en plus j'adore ce youtubeur ! Merci ! :)

blackapplex > merci beaucoup pour ta réponse :ok: Effectivement je dois exprimer les infectés en fonction de la population, ok pour le break. Merci pour les conseils !

LornMalvo > Haha j'ai jamais fait de cours de programmation mais j'avais cette logique des langages de programmation, que je développais surtout avec le raisonnement mathématique, donc je pense que ça m'a beaucoup aidé... en tout cas merci !

Je vais essayer de mettre à jour l'évolution du programme cette semaine du coup

blackapplex
blackapplex
Niveau 10
04 mai 2020 à 13:55:04

J'avais dis d'utiliser des taux mais en fait c'est pas forcément la meilleure façon. Tu peux aussi juste mettre des valeurs absolus et seuiller les nombres en fonction de la population (via une fonction mathématique continue de préférence)
Le nouveau nombre d'infectés est en delta_infecté = f(nombre_d'infecté, nombre_d'infectable, contagiosité)
et nombre_d'infectable = f(taille_population, nombre_confinés, nombre_non_infecté)

Enfin idéalement faudrait savoir pour chaque individu s'il a un statut infecté / confiné / etc.

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment