Défi
Vous devez créer un modèle simple de la façon dont la maladie se propage autour d'un groupe de personnes.
Règles et exigences
Le modèle doit être un tableau 2D de 1 000 par 1 000, chaque élément étant une personne différente.
L'utilisateur doit saisir trois variables en utilisant argv: la probabilité de transmission (la probabilité que quelqu'un va infecter quelqu'un d'autre), le risque de mutation et le nombre de périodes pendant lesquelles la simulation doit s'exécuter.
Dans la première période ( t=0
), quatre personnes doivent être choisies au hasard et infectées par la maladie.
Le comportement de la maladie est régi par les règles suivantes:
- La maladie ne peut se déplacer que verticalement et horizontalement, se déplaçant vers la personne d'à côté.
- L'infection dure 3 périodes chez chaque personne. Vous ne pouvez pas prendre en compte les immunodéficiences.
- Après qu'une personne a été infectée trois fois, elle est immunisée et ne peut plus être infectée.
- La maladie est sujette à mutation, ce qui rend les personnes auparavant immunisées vulnérables à cette nouvelle maladie mutée. La maladie mutée a exactement les mêmes traits et suit les mêmes règles que la maladie d'origine.
- Si une mutation se produit, la maladie entière ne change pas, juste ce «paquet» particulier lors de la transmission.
- Une fois qu'une personne a été infectée par un virus, elle ne peut plus être infectée tant que l'infection actuelle n'est pas passée.
- Si une personne est infectée, elle est contagieuse du début de sa période d'infection jusqu'à sa fin.
- Il n'y a pas de niveaux d'immunité - une personne est immunisée ou non.
- Pour arrêter la surcharge de la mémoire, il existe une limite maximale de 800 mutations.
À la fin du nombre de périodes spécifié, vous devez générer les résultats.
Les résultats doivent être une grille de 1000 x 1000 montrant quelles personnes sont infectées et quelles personnes ne le sont pas. Cela peut être sorti sous forme de fichier texte, sous forme de fichier image ou de sortie graphique (où #FFFFFF est une personne en bonne santé et # 40FF00 est une personne infectée).
Veuillez inclure le nom de la langue et une commande pour l'exécuter dans votre réponse.
Gagnant
Le code le plus rapide à exécuter sur mon ordinateur gagne. Son temps sera mesuré avec le morceau de code Python suivant:
import time, os
start = time.time()
os.system(command)
end = time.time()
print(end-start)
Notez que lors de l'exécution de ce script, j'utiliserai les valeurs par défaut suivantes:
Probability of transmission = 1
Chance of mutation = 0.01
Number of periods = 1000
la source
V
, le deuxième virus de contratsV'
. La contraction prendra fin à la même période. Le virus peut-ilV
infecter la deuxième personne? (Ou une question plus en noir et blanc: est-il possible qu'une personne soit infectée immédiatement après sa guérison, de sorte qu'elle se retrouvera avec 6 périodes consécutives d'infection?)V
en personneA
, etV
encore en personneB
. Lorsqu'ils transmettent le virus, peuvent-ils tous deux muter vers la même mutationV'
? Ou peut-être qu'ils devraient en fait muter vers la même souche virale? S'ils peuvent muter arbitrairement, quelle est la probabilité de mutation de deux virus vers la même souche virale?Réponses:
J'étais curieux de savoir à quoi cela ressemblerait alors j'ai fait ce hack rapide et sale en JavaScript: http://jsfiddle.net/andrewmaxwell/r8m54t9c/
la source
C ++ 11, 6-8 minutes
Mon test dure environ 6 à 8 minutes sur ma machine Fedora 19, i5. Mais en raison du caractère aléatoire de la mutation, elle pourrait aussi bien être plus rapide ou prendre plus de temps. Je pense que les critères de notation doivent être revus.
Imprime le résultat sous forme de texte à la fin de l'opération, personne en bonne santé indiquée par un point (
.
), personne infectée par un astérisque (*
), sauf si leANIMATE
drapeau est défini sur vrai, auquel cas il affichera différents caractères pour les personnes infectées par une souche virale différente.Voici un GIF pour 10x10, 200 périodes.
Comportement de mutation
Chaque mutation donnera une nouvelle souche jamais vue auparavant (il est donc possible qu'une personne infecte les quatre personnes voisines avec 4 souches distinctes), à moins que 800 souches aient été générées, auquel cas aucun virus ne subira de mutation supplémentaire.
Le résultat de 8 minutes provient du nombre de personnes infectées suivantes:
tandis que le résultat de 6 minutes provient des éléments suivants:
Représentation des personnes
Chaque personne est représentée en 205 octets. Quatre octets pour stocker le type de virus contracté par cette personne, un octet pour enregistrer depuis combien de temps cette personne a été infectée et 200 octets pour stocker combien de fois il a contracté chaque souche de virus (2 bits chacun). Il y a peut-être un alignement d'octets supplémentaire effectué par C ++, mais la taille totale sera d'environ 200 Mo. J'ai deux grilles pour stocker la prochaine étape, donc au total, il utilise environ 400 Mo.
Je stocke l'emplacement des personnes infectées dans une file d'attente, pour réduire le temps requis dans les premières périodes (ce qui est vraiment utile jusqu'à des périodes <400).
Caractéristiques techniques du programme
Toutes les 100 étapes, ce programme imprimera le nombre de personnes infectées, sauf si l'
ANIMATE
indicateur est défini surtrue
, auquel cas il imprimera la grille entière toutes les 100 ms.Cela nécessite des bibliothèques C ++ 11 (compiler en utilisant
-std=c++11
flag, ou dans Mac avecclang++ -std=c++11 -stdlib=libc++ virus_spread.cpp -o virus_spread
).Exécutez-le sans arguments pour les valeurs par défaut, ou avec des arguments comme celui-ci:
./virus_spread 1 0.01 1000
la source
C # 6-7 minutes
Modifier 2
J'ai finalement (5 heures) généré une sortie détaillée pendant près de 1000 périodes (seulement 840 images, puis il s'est écrasé) à 1000x1000, toutes les 1 période, mais il est proche de 160 Mo et nécessite toute la mémoire de mon système pour s'afficher (IrfanView) , même pas sûr que cela fonctionnerait dans un navigateur, puis-je le mettre plus tard.
ÉDITER
J'ai passé beaucoup de temps à rendre cela plus efficace selon la réponse de "Beta Decay" en disant "Choisissez la souche au hasard" J'ai choisi uniquement la méthode aléatoire pour choisir qui infecte qui par période, mais j'ai changé la façon de calculer et mis en place tout, j'ai mis à jour mes messages avec les nouveaux détails.
Codé mon estimation la plus proche de ce que je pouvais, j'espère que cela suit toutes les règles, il utilise une tonne de mémoire sur mon système (environ 1,2 Go). Le programme peut produire des gifs animés (l'air cool, vraiment lent) ou simplement une image correspondant aux spécifications de "Beta Decay". C'est un peu la réinvention de la roue, mais ça a vraiment l'air cool:
Résultats
(Remarque: cela ne fait que la différence entre infecté et non infecté, c'est-à-dire non verbeux)
1000 périodes, 1% de taux de mutation, 100% de propagation:
Exemples (verbeux)
Quoi qu'il en soit, utiliser 100% de "probabilité de transmission" en mode non verbeux est un peu ennuyeux car vous obtenez toujours les mêmes formes et vous ne pouvez pas voir les différentes mutations, si vous ajustez les paramètres autour d'un bit (et activez le mode verbeux) vous obtenez une sortie cool (les GIF animés s'affichent toutes les 10 images):
Aléatoire - Taille de la grille: 200, ProbTransmission: 100%, ProbMutation: 1%
Aléatoire - Taille de la grille: 200, ProbTransmission: 20%, ProbMutation: 1%
Notation
Je suis d'accord avec "justhalf" que les critères de notation peuvent ne pas être équitables car chaque course sera différente en raison du caractère aléatoire des mutations et de la position des points de départ aléatoires. Peut-être que nous pourrions faire en moyenne plusieurs runs ou quelque chose comme ça ..., bon de toute façon c'est en C # donc bounty pour moi :( de toute façon.
Code
Assurez-vous d'inclure la bibliothèque MagickImage (définie pour compiler x64 bits) sinon elle ne sera pas construite ( http://pastebin.com/vEmPF1PM ):
la source