Pregunta

Para un proyecto, estoy desarrollando una simulación en NetLogo lidiar con la rabia enfermedades en perros y seres humanos.Tengo algunas tortugas-los seres humanos con los perros que pueden ser vacunados o no.Al principio me cree un perro con rabie y, en función de la fase (1 o 2) de la enfermedad, se puede propagar la enfermedad a otros perros con una probabilidad.Al final el perro puede morir, ya sea por parálisis (si la probabilidad es mayor que 75%) o de otras complicaciones.Aquí está el código:

http://pastebin.com/esR75G3T

En el final se puede ver que un perro no morir por parálisis va a morir después de algunos días (entre 4 o 6).En otras palabras, cuando la days_infected son iguales al final de la vida.

Para comprobar si todo está bien al principio traté de establecer que NINGUNO de los que el perro está vacunado para que todos se supone que para obtener la enfermedad.De hecho, cuando el perro está en la fase 2 se va a morder a nadie.El problema es que si puedo borrar la última línea de código, todo funciona, y algunos perros se mueren de la parálisis y la otra sigue viva.Si me permiten, además, la última línea para dejar que los otros perros mueren demasiado, no funciona nada...ningún perro está infectado.por qué?

¿Fue útil?

Solución

Este no es un problema con el código:este es un problema con la dinámica de su modelo.Lo que sucede es que su inicial perro enfermo muere antes de infectar a otro perro.Esta es la razón por la eliminación de la if (days_infected = end-life) [die] "soluciona" el problema.

Cuando traté de tu modelo con una gran población (por ejemplo, 5000 personas), de modo que los encuentros son más frecuentes, la infección se transmite.Usted también podría aumentar la probabilidad de infección, o aumentar la duración de los "furiosos" de fase, supongo.

Otro no relacionado sugerencia, si se me permite:usted debe tener distintas persons y dogs razas.Tratando de meter todo dentro de regular las tortugas, el código es mucho más complicado de lo que debería.La manera en que yo abordara este sería crear un enlace de la persona a su perro y, a continuación, utilizar tie para que el perro se mueve automáticamente cuando se mueve la persona.

Editar:

OK, aquí está una versión de su código ligeramente modificado para el uso de razas:

globals [
  total_dogs_infected
  total_dogs
  dead_humans
  dead_dogs
]

breed [ persons person ]
persons-own [
  sick?
]

breed [ dogs dog ]
dogs-own [
  sick?
  vaccinated?
  rabies_phase
  days_infected
  end-incubator
  end-furious
  end-life
]

to setup
  clear-all
  initialize-globals
  setup-turtles
  reset-ticks
end

to initialize-globals
  set dead_humans 0
  set dead_dogs 0
  set total_dogs_infected 0
end

to setup-turtles
  set-default-shape persons "person"
  set-default-shape dogs "wolf"
  create-persons people [
    setxy random-xcor random-ycor
    set size 1.5
    set sick? false
    ifelse random 100 < 43 [
      set color green
      hatch-dogs 1 [
        set color brown
        set heading 115 fd 1
        create-link-from myself [ tie ]
        set days_infected 0
        set vaccinated? (random 100 > %_not_vaccinated)
        if not vaccinated? [ set color orange ]
      ]      
    ]
    [
      set color blue  ;umano sano senza cane
    ]
  ]

  set total_dogs count dogs
  ask one-of dogs [ get_sick ]

end

to get_sick
  set sick? true
  set color white
  set rabies_phase 1
  set end-incubator 14 + random 57
  set end-furious (end-incubator + random 5)
  set end-life (end-furious + 4 + random 2)  
  set total_dogs_infected total_dogs_infected + 1
end

to go
  move
  infect
  get-older-sick-dog
  tick
end

to move
  ask persons [
    rt random 180
    lt random 180
    fd 1
  ]
end

to infect
  ask dogs with [ sick? ] [
    if (rabies_phase = 1 and (random 100) <= 2) or rabies_phase = 2 [
      ask other dogs-here with [ not sick? and not vaccinated? ] [ get_sick ]
    ]    
  ]
end

to get-older-sick-dog
  ask dogs with [ sick? ] [    
    set days_infected days_infected + 1
    ;the incubator phase ends after at least 14 days + random(57) and then we have phase 2 (furious)
    if (days_infected = end-incubator) [ set rabies_phase 2 ]
    ;when the main furious phase finishes we have 75% of probability that a secondary furious phase continues for other 4 - 6 days until death                                                               ;or we have a probability of 25% that the disease end in paralysis with a fast death
    if (days_infected = end-furious and (random 100 > 75)) [
      set dead_dogs dead_dogs + 1
      die
    ]
    if (days_infected = end-life) [
      die
    ] 
  ]
end

; These last reporters are not used,
; they just illustrate how to get the
; dog from the owner or vice-versa:

to-report my-dog ; person reporter
  report one-of out-link-neighbors
end

to-report has-dog? ; person reporter
  report any? out-link-neighbors  
end

to-report my-owner ; dog reporter
  report one-of in-link-neighbors
end

No sólo simplificar algunas expresiones (por ejemplo, ask dogs with [ sick? ] en lugar de ask turtles with [ has_dog? and sick_dog? ]), abre todo tipo de posibilidades:un perro podría huir de su dueño, el propietario podría morir sin que el perro de morir, un propietario puede tener dos perros, etc.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top