Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/python3
- from random import random
- class hopital:
- def __init__(self, lits):
- self.lits = [0]*lits
- self.sauves = 0
- self.morts = 0
- class crise:
- def __init__(self, duree, frequence):
- # duree de la crise en jours
- self.duree = duree
- # 0 < frequence < 100 : probabilité qu'un patient se présente chaque jour
- self.frequence = frequence/100
- class patient:
- def __init__(self, santee):
- # santee est un coefficient entre 0.0 et 1.0 qui va déterminer les chances de survie et la durée de soin
- self.survie = santee
- # jours necessaires pour le traitement, on considère 20 jours de base
- # (selon les témoignages des medecins relayés par la presse)
- # et on pondère selon l'état de santé de +/- 3 jours
- self.duree = 20 + int((3*(1-santee)*([1,-1][santee>0.5])))
- def print_lits(hopital):
- lits = []
- for place in hopital.lits:
- if place is not 0:
- lits.append(place.duree)
- else:
- lits.append(0)
- print(lits)
- print(f"sauves: {hopital.sauves} - morts: {hopital.morts}")
- del(lits)
- def maj_duree(hopital):
- for i in range(len(hopital.lits)):
- if hopital.lits[i] is not 0:
- patient = hopital.lits[i]
- if patient.duree == 1:
- # on tire au sort pondéré si le patient s'en est sorti ou non
- etat = random() + patient.survie
- if etat >= 1:
- #print("- un patient a fini son traitement et a survecu")
- hopital.sauves += 1
- else:
- #print("- un patient a fini son traitement mais a succombé")
- hopital.morts += 1
- # on libère le lit
- hopital.lits[i] = 0
- else:
- patient.duree -= 1
- #print_lits(hopital)
- def strategie_destin(hopital):
- # est-ce qu'il y a un lit disponible ?
- if 0 in hopital.lits:
- # si oui on le donne au patient peut importe ses constantes
- hopital.lits[hopital.lits.index(0)] = patient(random())
- else:
- #print("- un patient est mort car aucun lit n'est disponible")
- hopital.morts += 1
- def strategie_meilleures_chances(hopital, seuil):
- # est-ce qu'il y a un lit disponible ?
- if 0 in hopital.lits:
- p = patient(random())
- # si oui on le donne au patient seulement s'il a plus de seuil % de chances de survie
- if p.survie >= seuil/100:
- hopital.lits[hopital.lits.index(0)] = p
- else:
- #print("- un patient est mort car il avait trop peu de chances pour avoir un lit")
- hopital.morts += 1
- else:
- #print("- un patient est mort car aucun lit n'est disponible")
- hopital.morts += 1
- def simulation_crise(hopital, crise, strategie, seuil):
- for jour in range(crise.duree):
- #print(f"JOUR {jour}")
- # un nouveau jour est passé pour tous les patients déjà présents
- maj_duree(hopital)
- # est-ce qu'un patient se présente ?
- if random() + crise.frequence >= 1:
- #print("- un patient se présente")
- # si oui, on applique la stratégie choisie :
- if strategie == "meilleures_chances":
- # on donne un lit que si la personne a suffisament de chances de s'en sortir
- strategie_meilleures_chances(hopital, seuil)
- elif strategie == "reallouer":
- # quand une personne arrive avec de meilleures chances, qu'une qui a deja un lit
- # on lui donne le lit de cette personne
- strategie_reallouer(hopital)
- else:
- strategie_destin(hopital)
- # la crise est finie, plus aucun malade ne rentre mais il y en a encore dans les lits
- places = len(hopital.lits)
- while hopital.lits.count(0) < places:
- maj_duree(hopital)
- # on comptabilise
- #print(f"TOTAL: {hopital.sauves+hopital.morts}\nVIES SAUVEES : {hopital.sauves} ({int(100*hopital.sauves/(hopital.sauves+hopital.morts))})%")
- return (hopital.sauves, hopital.morts)
- lits = 1000
- duree = 10000
- freq = 80
- mc = simulation_crise(hopital(lits), crise(duree, freq), "meilleures_chances", 50)
- dest = simulation_crise(hopital(lits), crise(duree, freq), "destin", 0)
- print("--- COMPARAISON")
- print(f"Meilleures chances:\t TOTAL: {mc[0]+mc[1]} - VIES SAUVEES : {mc[0]} ({int(100*mc[0]/(mc[0]+mc[1]))})%")
- print(f"Destin:\t\t\t TOTAL: {dest[0]+dest[1]} - VIES SAUVEES : {dest[0]} ({int(100*dest[0]/(dest[0]+dest[1]))})%")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement