Herausforderung
Sie müssen ein einfaches Modell dafür erstellen, wie sich Krankheiten auf eine Gruppe von Menschen ausbreiten.
Regeln und Anforderungen
Das Modell muss ein 1000 x 1000 2D-Array sein, wobei jedes Element eine andere Person ist.
Der Benutzer muss drei Variablen mit argv eingeben: die Übertragungswahrscheinlichkeit (wie wahrscheinlich ist es, dass jemand anderes infiziert), die Wahrscheinlichkeit einer Mutation und die Dauer der Simulation.
In der ersten Periode ( t=0
) sollten vier Personen nach dem Zufallsprinzip ausgewählt und mit der Krankheit infiziert werden.
Das Krankheitsverhalten richtet sich nach folgenden Regeln:
- Die Krankheit kann sich nur vertikal und horizontal bewegen und auf die Person nebenan übertragen.
- Die Infektion dauert 3 Perioden bei jeder Person. Sie können Immundefekte nicht berücksichtigen.
- Nachdem eine Person dreimal infiziert wurde, ist sie immun und kann nicht erneut infiziert werden.
- Die Krankheit unterliegt einer Mutation, die die zuvor immunen Menschen für diese neue mutierte Krankheit anfällig macht. Die mutierte Krankheit hat genau die gleichen Merkmale und folgt den gleichen Regeln wie die ursprüngliche Krankheit.
- Wenn eine Mutation auftritt, ändert sich die gesamte Krankheit nicht, nur das bestimmte "Paket" bei der Übertragung.
- Sobald eine Person mit einem Virus infiziert wurde, kann sie erst wieder infiziert werden, wenn die aktuelle Infektion vorüber ist.
- Wenn eine Person infiziert ist, ist sie vom Beginn ihrer Infektionsperiode bis zu ihrem Ende infektiös.
- Es gibt keine Stufen der Immunität - eine Person ist entweder immun oder nicht.
- Um die Speicherüberlastung zu stoppen, sind maximal 800 Mutationen zulässig.
Am Ende der angegebenen Anzahl von Perioden sollten Sie die Ergebnisse ausgeben.
Das Ergebnis muss ein 1000 x 1000-Raster sein, aus dem hervorgeht, welche Personen infiziert sind und welche nicht. Dies kann als Textdatei, als Bilddatei oder als grafische Ausgabe ausgegeben werden (wobei #FFFFFF eine gesunde Person und # 40FF00 eine infizierte Person ist).
Bitte geben Sie in Ihrer Antwort den Namen der Sprache und einen Befehl zum Ausführen an.
Gewinnen
Der schnellste Code, der auf meinem Computer ausgeführt wird, gewinnt. Seine Zeit wird mit dem folgenden Python-Code gemessen:
import time, os
start = time.time()
os.system(command)
end = time.time()
print(end-start)
Beachten Sie, dass ich beim Ausführen dieses Skripts die folgenden Standardeinstellungen verwende:
Probability of transmission = 1
Chance of mutation = 0.01
Number of periods = 1000
quelle
V
den Virus , der zweite befällt den VirusV'
. Die Kontraktion endet beide im selben Zeitraum. Kann ein VirusV
die zweite Person infizieren? (Oder eine eher schwarzweiße Frage:V
persönlichA
undV
wieder persönlichB
. Können beide, wenn sie das Virus übertragen, zur gleichen Mutation mutierenV'
? Oder vielleicht in der Tat sie sollten auf den gleichen Virusstamm mutieren? Wenn sie willkürlich mutieren können, wie hoch ist die Wahrscheinlichkeit, dass zwei Viren zum selben Virusstamm mutieren?Antworten:
Ich war gespannt, wie das aussehen würde, also habe ich diesen schnellen und schmutzigen Hack in JavaScript gemacht: http://jsfiddle.net/andrewmaxwell/r8m54t9c/
quelle
C ++ 11, 6-8 Minuten
Mein Testlauf dauert auf meiner Fedora 19, i5-Maschine ca. 6-8 Minuten. Aber aufgrund der Zufälligkeit der Mutation kann es genauso gut schneller sein oder länger dauern. Ich denke, dass die Bewertungskriterien neu ausgerichtet werden müssen.
Gibt das Ergebnis am Ende der Fertigstellung als Text aus, gesunde Person mit Punkt (
.
), infizierte Person mit Stern (*
), sofern dasANIMATE
Flag nicht auf true gesetzt ist. In diesem Fall werden unterschiedliche Zeichen für Personen angezeigt, die mit unterschiedlichen Virusstämmen infiziert sind.Hier ist ein GIF für 10x10, 200 Perioden.
Mutationsverhalten
Jede Mutation ergibt einen neuen Stamm, der noch nie zuvor gesehen wurde (es ist also möglich, dass eine Person die vier Nachbarn mit vier verschiedenen Stämmen infiziert), es sei denn, es wurden 800 Stämme erzeugt. In diesem Fall wird kein Virus mehr mutiert.
Das 8-Minuten-Ergebnis stammt von der folgenden Anzahl infizierter Personen:
Das 6-Minuten-Ergebnis ergibt sich aus:
Personenvertretung
Jede Person ist in 205 Bytes vertreten. Vier Bytes zum Speichern des Virustyps, den diese Person infiziert, ein Byte zum Speichern, wie lange diese Person infiziert war, und 200 Bytes zum Speichern, wie oft sie jeden Virusstamm infiziert hat (jeweils 2 Bit). Möglicherweise werden einige zusätzliche Byte-Alignments von C ++ vorgenommen, aber die Gesamtgröße liegt bei 200 MB. Ich habe zwei Gitter, um den nächsten Schritt zu speichern, also verbraucht es insgesamt ungefähr 400 MB.
Ich speichere den Ort infizierter Personen in einer Warteschlange, um die Zeit zu verkürzen, die in den frühen Perioden benötigt wird (was bis zu Perioden <400 wirklich nützlich ist).
Programmtechniken
Alle 100 Schritte druckt dieses Programm die Anzahl der infizierten Personen, sofern das
ANIMATE
Flag nicht auf gesetzttrue
ist. In diesem Fall wird das gesamte Raster alle 100 ms gedruckt.Dies erfordert C ++ 11-Bibliotheken (Kompilieren mit
-std=c++11
flag oder in Mac mitclang++ -std=c++11 -stdlib=libc++ virus_spread.cpp -o virus_spread
).Führen Sie es ohne Argumente für die Standardwerte oder mit folgenden Argumenten aus:
./virus_spread 1 0.01 1000
quelle
C # 6-7 Minuten
Bearbeiten 2
Ich habe schließlich (5 Stunden) eine ausführliche Ausgabe für fast 1000 Zeiträume (nur 840 Bilder, dann stürzte sie ab) bei 1000x1000 generiert, alle 1 Zeiträume, jedoch fast 160 MB, und es wird der gesamte Speicher auf meinem System benötigt, um angezeigt zu werden (IrfanView). Ich bin mir nicht einmal sicher, ob das in einem Browser funktionieren würde.
BEARBEITEN
Ich habe viel Zeit darauf verwendet, dies effizienter zu gestalten, je nach der Antwort von "Beta Decay" mit der Aussage "Wähle den Stamm nach dem Zufallsprinzip". Ich habe nur die Zufallsmethode gewählt, um zu bestimmen, wer wen pro Periode infiziert Ich habe meine Posts mit den neuen Details aktualisiert.
Soweit ich das beurteilen kann, hoffe ich, dass alle Regeln eingehalten werden. Es verbraucht eine Tonne Speicher auf meinem System (ungefähr 1,2 GB). Das Programm kann animierte GIFs (sieht cool aus, sehr langsam) oder nur ein Bild ausgeben, das den Spezifikationen von "Beta Decay" entspricht. Das ist ein bisschen, um das Rad neu zu erfinden, sieht aber auf jeden Fall cool aus:
Ergebnisse
(Hinweis: Dies unterscheidet nur zwischen infiziert und nicht infiziert, dh nicht ausführlich)
1000 Perioden, 1% Mutationsrate, 100% Verbreitung:
Beispiele (ausführlich)
Auf jeden Fall ist die Verwendung von 100% "Übertragungswahrscheinlichkeit" im nicht-ausführlichen Modus etwas langweilig, da Sie immer die gleichen Formen erhalten und die verschiedenen Mutationen nicht sehen können, wenn Sie die Parameter ein wenig verändern (und den ausführlichen Modus aktivieren). Sie erhalten eine cool aussehende Ausgabe (animierte GIFs werden alle 10 Bilder angezeigt):
Zufällig - Rastergröße: 200, ProbTransmission: 100%, ProbMutation: 1%
Zufällig - Rastergröße: 200, ProbTransmission: 20%, ProbMutation: 1%
Wertung
Ich stimme "justhalf" zu, dass die Bewertungskriterien möglicherweise nicht fair sind, da sich jeder Lauf aufgrund der Zufälligkeit der Mutationen und der Position der zufälligen Startpunkte unterscheidet. Vielleicht könnten wir durchschnittlich mehrere Läufe machen oder so ... naja, trotzdem ist das in C #, also Kopfgeld für mich :( trotzdem.
Code
Stellen Sie sicher, dass Sie die MagickImage-Bibliothek einschließen (auf Kompilieren von x64-Bit eingestellt), da sie sonst nicht erstellt werden kann ( http://pastebin.com/vEmPF1PM ):
quelle