Desafio
Você deve criar um modelo simples de como a doença se espalha por um grupo de pessoas.
Regras e Requisitos
O modelo deve ser uma matriz 2D de 1000 por 1000, com cada elemento sendo uma pessoa diferente.
O usuário deve inserir três variáveis usando argv: probabilidade de transmissão (qual a probabilidade de alguém infectar outra pessoa), chance de mutação e quantos períodos a simulação deve ser executada.
No primeiro período ( t=0
), quatro pessoas devem ser escolhidas aleatoriamente e infectadas com a doença.
O modo como a doença se comporta é regido pelas seguintes regras:
- A doença só pode se mover vertical e horizontalmente, passando para a pessoa ao lado.
- A infecção dura 3 períodos em todas as pessoas. Você não pode levar em consideração as imunodeficiências.
- Após uma pessoa ter sido infectada três vezes, ela fica imune e não pode ser infectada novamente.
- A doença está sujeita a mutações, tornando as pessoas anteriormente imunes vulneráveis a essa nova doença mutada. A doença mutada tem exatamente as mesmas características e segue as mesmas regras da doença original.
- Se ocorrer uma mutação, toda a doença não muda, apenas esse 'pacote' específico na transmissão.
- Depois que uma pessoa foi infectada por um vírus, ela não pode ser infectada novamente até que a infecção atual passe.
- Se uma pessoa está infectada, ela é infecciosa desde o início do período de infecção até o fim.
- Não há níveis de imunidade - uma pessoa é imune ou não.
- Para parar a sobrecarga de memória, há um limite máximo de 800 mutações.
No final do número especificado de períodos, você deve exibir os resultados.
Os resultados devem ser uma grade de 1000 x 1000, mostrando quais pessoas estão infectadas e quais não. Isso pode ser produzido como um arquivo de texto, como um arquivo de imagem ou gráfico (onde #FFFFFF é uma pessoa saudável e # 40FF00 é uma pessoa infectada).
Você pode incluir o nome do idioma e um comando para executá-lo em sua resposta.
Ganhando
O código mais rápido a ser executado no meu computador vence. Seu tempo será medido com o seguinte trecho de código Python:
import time, os
start = time.time()
os.system(command)
end = time.time()
print(end-start)
Observe que, ao executar este script, usarei os seguintes padrões:
Probability of transmission = 1
Chance of mutation = 0.01
Number of periods = 1000
fonte
V
, o segundo contrai vírusV'
. A contração terminará no mesmo período. O vírus podeV
infectar a segunda pessoa? (Ou uma questão mais preto-e-branco: é possível que uma pessoa ser infectada imediatamente após ele está curado, então ele vai acabar com 6 período consecutivo de infecção?)V
pessoalmenteA
, eV
novamente pessoalmenteB
. Quando eles transmitem o vírus, os dois podem sofrer a mesma mutaçãoV'
? Ou talvez eles de fato devam sofrer mutação para a mesma cepa de vírus? Se eles podem sofrer mutações arbitrárias, qual é a probabilidade de dois vírus sofrerem a mesma estirpe?Respostas:
Eu estava curioso para saber como isso seria, então fiz esse hack rápido e sujo no JavaScript: http://jsfiddle.net/andrewmaxwell/r8m54t9c/
fonte
C ++ 11, 6-8 minutos
Minha execução de teste leva de 6 a 8 minutos na minha máquina Fedora 19, i5. Mas devido à aleatoriedade da mutação, pode muito bem ser mais rápido ou levar mais tempo do que isso. Eu acho que os critérios de pontuação precisam ser reajustados.
Imprime o resultado como texto no final da conclusão, pessoa íntegra denotada por ponto (
.
), pessoa infectada por asterisco (*
), a menos que oANIMATE
sinalizador esteja definido como verdadeiro; nesse caso, ele exibirá caracteres diferentes para pessoas infectadas com diferentes tipos de vírus.Aqui está um GIF para 10x10, 200 períodos.
Comportamento de mutação
Cada mutação dará uma nova cepa nunca vista antes (portanto, é possível que uma pessoa infecte as quatro pessoas vizinhas com 4 cepas distintas), a menos que 800 cepas tenham sido geradas, caso em que nenhum vírus sofrerá mais mutação.
O resultado de 8 minutos vem do seguinte número de pessoas infectadas:
enquanto o resultado de 6 minutos vem do seguinte:
Representação de pessoa
Cada pessoa é representada em 205 bytes. Quatro bytes para armazenar o tipo de vírus que essa pessoa está contraindo, um byte para armazenar por quanto tempo essa pessoa está infectada e 200 bytes para armazenar quantas vezes ele contraiu cada cepa de vírus (2 bits cada). Talvez haja algum alinhamento adicional de bytes feito pelo C ++, mas o tamanho total será de cerca de 200 MB. Eu tenho duas grades para armazenar a próxima etapa; portanto, ele usa cerca de 400 MB.
Eu armazeno o local das pessoas infectadas em uma fila, para reduzir o tempo necessário nos primeiros períodos (o que é realmente útil até períodos <400).
Detalhes técnicos do programa
A cada 100 etapas, este programa imprime o número de pessoas infectadas, a menos que o
ANIMATE
sinalizador esteja definidotrue
, nesse caso, imprime a grade inteira a cada 100 ms.Isso requer bibliotecas C ++ 11 (compile usando
-std=c++11
sinalizador ou no Mac comclang++ -std=c++11 -stdlib=libc++ virus_spread.cpp -o virus_spread
).Execute-o sem argumentos para os valores padrão ou com argumentos como este:
./virus_spread 1 0.01 1000
fonte
C # 6-7 minutos
Editar 2
Finalmente, (5 horas) gerei uma saída detalhada por cerca de 1000 períodos (apenas 840 quadros depois travou) a 1000x1000, a cada 1 período, no entanto, é perto de 160MB e requer toda a memória do meu sistema para exibir (IrfanView) , nem mesmo certo de que isso funcionaria em um navegador, posso colocá-lo mais tarde.
EDITAR
Gastei muito tempo para tornar isso mais eficiente, de acordo com a resposta do "Decaimento beta", afirmando "Escolha a estirpe aleatoriamente". Eu escolhi apenas o método aleatório para escolher quem infecta quem por período, no entanto, mudei a maneira como é calculada e resolvi tudo, atualizei minhas postagens com os novos detalhes.
Codifiquei minha estimativa mais próxima disso, espero que siga todas as regras, use uma tonelada de memória no meu sistema (cerca de 1,2 GB). O programa pode gerar gifs animados (parece legal, muito lento) ou apenas uma imagem correspondente às especificações de "Beta Decay". Isso é um pouco de reinventar a roda, mas definitivamente parece legal:
Resultados
(Nota: isso apenas diferencia entre infectado e não infectado, ou seja, não detalhado)
1000 períodos, 1% de taxa de mutação, 100% de propagação:
Exemplos (verboso)
De qualquer forma, usar 100% de "Probabilidade de transmissão" no modo não detalhado é meio chato, pois você sempre obtém as mesmas formas e não pode ver as diferentes mutações, se ajustar os parâmetros um pouco (e ativar o modo detalhado) você obtém uma saída interessante (GIFs animados são exibidos a cada 10 quadros):
Aleatório - Tamanho da grade: 200, ProbTransmission: 100%, ProbMutation: 1%
Aleatório - Tamanho da grade: 200, ProbTransmission: 20%, ProbMutation: 1%
Pontuação
Eu concordo com "justhalf" que os critérios de pontuação podem não ser justos, pois cada corrida será diferente devido à aleatoriedade das mutações e à posição dos pontos de partida aleatórios. Talvez pudéssemos fazer a média de várias execuções ou algo assim ..., bem, de qualquer maneira isso está em C #, então é uma recompensa para mim :( de qualquer maneira.
Código
Certifique-se de incluir a biblioteca MagickImage (definida para compilar x64 bits), caso contrário ela não será criada ( http://pastebin.com/vEmPF1PM ):
fonte