Вызов
Вы должны создать простую модель того, как болезнь распространяется вокруг группы людей.
Правила и требования
Модель должна представлять собой двумерный массив 1000 на 1000, причем каждый элемент является отдельным человеком.
Пользователь должен ввести три переменные, используя argv: вероятность передачи (вероятность того, что кто-то заразит кого-то другого), вероятность мутации и сколько периодов симуляции должно пройти.
В первом периоде ( t=0
) четыре человека должны быть выбраны случайным образом и заражены этой болезнью.
То, как ведет себя болезнь, регулируется следующими правилами:
- Болезнь может двигаться только вертикально и горизонтально, приближаясь к человеку по соседству.
- Инфекция длится 3 периода у каждого человека. Вы не можете учитывать иммунодефициты.
- После того, как человек был заражен три раза, он становится невосприимчивым и не может быть заражен снова.
- Болезнь подвержена мутациям, что делает ранее иммунных людей уязвимыми для этой новой мутированной болезни. Мутировавшее заболевание имеет те же черты и следует тем же правилам, что и исходное заболевание.
- Если происходит мутация, вся болезнь не меняется, только этот конкретный «пакет» при передаче.
- Как только человек был заражен одним вирусом, он не может быть заражен снова, пока текущая инфекция не пройдет.
- Если человек заражен, он заразен от начала своего инфекционного периода до его конца.
- Нет никаких уровней иммунитета - человек или неуязвим или нет.
- Чтобы остановить перегрузку памяти, существует максимум 800 мутаций.
В конце указанного количества периодов вы должны вывести результаты.
Результаты должны быть сеткой 1000 x 1000, показывающей, какие люди заражены, а какие нет. Это может быть выведено как текстовый файл, как файл изображения или графический вывод (где #FFFFFF - здоровый человек, а # 40FF00 - зараженный человек).
Пожалуйста, можете ли вы включить название языка и команду для его запуска в ответе.
выигрыш
Самый быстрый код для запуска на моем компьютере выигрывает. Его время будет измеряться следующим фрагментом кода Python:
import time, os
start = time.time()
os.system(command)
end = time.time()
print(end-start)
Обратите внимание, что при запуске этого скрипта я буду использовать следующие значения по умолчанию:
Probability of transmission = 1
Chance of mutation = 0.01
Number of periods = 1000
источник
V
, второй заражает вирусомV'
. Сокращение закончится в один и тот же период. Может ли вирусV
заразить второго человека? (Или более черно-белый вопрос: возможно ли, что человек заразится сразу же после того, как он исцелен, поэтому у него будет 6 последовательных периодов заражения?)V
личноA
, иV
снова личноB
. Когда они передают вирус, могут ли они мутировать в одну и ту же мутациюV'
? Или, может быть, они на самом деле должны мутировать в одном и том же штамме вируса? Если они могут мутировать произвольно, какова вероятность того, что два вируса мутируют в один и тот же штамм вируса?Ответы:
Мне было любопытно, как это будет выглядеть, поэтому я быстро и грязно взломал JavaScript: http://jsfiddle.net/andrewmaxwell/r8m54t9c/
источник
С ++ 11, 6-8 минут
Мой тестовый прогон занимает около 6-8 минут на моей машине Fedora 19, i5. Но из-за случайности мутации, это также может быть быстрее или занять больше времени. Я думаю, что критерии оценки должны быть переадресованы.
Печатает результат в виде текста в конце завершения, здорового человека, обозначенного точкой (
.
), зараженного человека звездочкой (*
), если дляANIMATE
флага не установлено значение true, и в этом случае он будет отображать разные символы для людей, зараженных различным штаммом вируса.Вот GIF для 10x10, 200 периодов.
Мутационное поведение
Каждая мутация даст новый штамм, который никогда не наблюдался ранее (поэтому возможно, что один человек заразит четырех соседних людей четырьмя различными штаммами), если только не было получено 800 штаммов, и в этом случае ни один вирус не будет подвергаться дальнейшей мутации.
8-минутный результат получается из следующего числа зараженных людей:
в то время как 6-минутный результат получается из следующего:
Личное представление
Каждый человек представлен в 205 байтах. Четыре байта для хранения типа вируса, с которым заражается этот человек, один байт для хранения информации о том, как долго этот человек был заражен, и 200 байтов для хранения информации о том, сколько раз он заразился каждым штаммом вируса (по 2 бита). Возможно, в C ++ есть дополнительное выравнивание байтов, но общий размер будет около 200 МБ. У меня есть две сетки для хранения следующего шага, поэтому в общей сложности он использует около 400 МБ.
Я сохраняю местонахождение зараженных людей в очереди, чтобы сократить время, необходимое в ранние периоды (что действительно полезно до периодов <400).
Программные особенности
Каждые 100 шагов эта программа будет печатать количество зараженных людей, если не установлен
ANIMATE
флагtrue
, и в этом случае она будет печатать всю сетку каждые 100 мс.Для этого требуются библиотеки C ++ 11 (скомпилируйте с использованием
-std=c++11
флага или в Mac с помощьюclang++ -std=c++11 -stdlib=libc++ virus_spread.cpp -o virus_spread
).Запустите его без аргументов для значений по умолчанию или с такими аргументами:
./virus_spread 1 0.01 1000
источник
C # 6-7 минут
Редактировать 2
Наконец, я (5 часов) сгенерировал подробный вывод в течение почти 1000 периодов (только 840 кадров, после которых произошел сбой) при 1000x1000, каждый 1 период, однако он близок к 160 МБ и требует отображения всей памяти в моей системе (IrfanView) , даже не уверен, что сработает в браузере, может я выложу это позже.
РЕДАКТИРОВАТЬ
Я потратил много времени на то, чтобы сделать это более эффективным, согласно ответу «Бета-распада», в котором говорилось: «Выбирайте штамм случайным образом». У меня есть выбор случайным образом только для выбора того, кто кого заражает за период, однако я изменил рассчитанный метод. и проделал все, я обновил свои сообщения с новыми деталями.
Закодировать мою самую близкую оценку к этому я мог, я надеюсь, что она следует всем правилам, она использует тонну памяти в моей системе (около 1,2 ГБ). Программа может выводить анимированные GIF-файлы (выглядит круто, очень медленно) или просто изображение, соответствующее характеристикам "Beta Decay". Это немного изобретать велосипед, но определенно выглядит круто:
Результаты
(Примечание: это различает только инфицированных и неинфицированных, то есть не многословный)
1000 периодов, 1% мутации, 100% распространения:
Примеры (Многословный)
В любом случае, использование 100% «вероятности передачи» в не многословном режиме довольно скучно, так как вы всегда получаете одинаковые формы и не видите разных мутаций, если немного подправить параметры (и включить подробный режим) вы получите круто выглядящий результат (анимированные GIF-файлы отображаются в каждом 10-м кадре):
Случайный - размер сетки: 200, вероятности передачи: 100%, вероятности передачи: 1%
Случайный - размер сетки: 200, вероятности передачи: 20%, вероятности передачи: 1%
счет
Я согласен с «justhalf» в том, что критерии оценки могут быть несправедливыми, поскольку каждый прогон будет отличаться из-за случайности мутаций и положения случайных стартовых точек. Может быть, мы могли бы сделать в среднем несколько прогонов или что-то в этом роде ... ну, в любом случае, это в C #, так что щедрость для меня :( в любом случае.
Код
Обязательно включите библиотеку MagickImage (настроенную на компиляцию 64-битной версии), иначе она не будет собираться ( http://pastebin.com/vEmPF1PM ):
источник