lunes, 12 de noviembre de 2012

Simulación de sistema ecológico

Descargar Solución de la galería de códigos de msdn aqui

Se considera un océano representado por una matriz bidimensional de celdas.
Cada celda puede estar vacía (agua), tener un obstáculo o estar ocupada por un espécimen vivo

de plancton, sardina, tiburón o cangrejo, o estar ocupada por una sardina muerta o por un
tiburón muerto. Es decir el plancton y el cangrejo no mueren.
Se quiere simular y observar el efecto que se produce en el océano al estar las especies
moviéndose, comiendo y reproduciéndose.

Regla de reproducción
Las especies plancton, sardina y tiburón se reproducen. Tienen cada una un reloj biológico de
reproducción. Al comenzar la simulación todas las criaturas que se encuentren en el océano
tendrán este reloj en 0, se verá mas abajo como este reloj puede cambiar de valor.
Cuando una criatura se ha movido y con este movimiento su reloj de reproducción alcanza el
valor del tiempo de reproducción de su especie (igual para todos los de la misma especie) se
reproducirá dejando su prole en la celda de la que se mueve. Al reproducirse la criatura
comienza de nuevo con 0 en su reloj de reproducción.

Muerte por inanición
Las especies sardina y tiburón tienen también un reloj biológico de alimentación y un tope de
supervivencia que significa la cantidad máxima de movimientos que pueden estar sin comer. Al
comenzar la simulación todas las sardinas y tiburones tienen 0 en su reloj de alimentación Si
una de estas criaturas se tiene que mover y con dicho movimiento alcanza el tope de
supervivencia de su especie entonces morirá si en este movimiento no puede comer (y claro
está no se moverá entonces). Si una sardina o un tiburón muere por inanición su cadáver
permanece en la celda en la cual murió. Un cadáver sólo podrá ser comido por un cangrejo

Reglas de movimiento y alimentación
Cada especie tiene la capacidad potencial de moverse hacia una cualquiera de las 8 celdas que
pueden rodearla según sus reglas específicas de movimiento.

Obstáculo
Un obstáculo no se mueve ni se alimenta. Su única función es bloquear el movimiento de las
criaturas a través de la celda ocupada por el obstáculo.

Plancton
Cuando a un plancton le corresponde moverse busca una celda vecina vacía (si hay mas de una
libre la escoge aleatoriamente). Al moverse se mueve se incrementa su reloj biológico de
reproducción. Si todas las celdas vecinas están ocupadas no se mueve y pierde su oportunidad.

Sardina
Cuando a una sardina le corresponde moverse busca en las celdas vecinas cuáles contienen
plancton y entre estas escoge una aleatoriamente y se la “come” (su reloj de alimentación se
pone en 0) y se mueve a esta celda e incrementa su reloj de reproducción. Si no hay plancton a
comer busca entonces las celdas vecinas vacías y escoge una aleatoriamente para moverse
hacia ella e incrementa su reloj de alimentación y su reloj de reproducción. Es decir, siempre
que pueda comer come.

Tiburón
Cuando a un tiburón le corresponde moverse busca en sus celdas vecinas las que tienen
sardinas y entre estas escoge una aleatoriamente, se la come y pone su reloj de alimentación
en 0.
Si no puede comerse ninguna sardina (no hay ninguna a su alrededor) y su reloj de
alimentación es igual a su tope de supervivencia (está a punto de morirse) intentará atacar a
algún tiburón vecino. Si hay más de uno lo escoge aleatoriamente.
Cada tiburón tiene también un peso (que es 0 al nacer) y que se incrementa en 1 cada vez que
come. Cuando un tiburón se ve forzado a atacar a otro (porque se va a morir de inanición)
matará a éste otro si su peso es mayor que el del otro (pero recuerde que la selección de a cuál
ataca es aleatoria, es decir, el no puede escoger a uno más pequeño sino que se lanza a riesgo
a la pelea). En este caso se lo come pasa a su celda y su reloj de alimentación se pone en 0. En
caso contrario (el peso es menor o igual que el del atacado) es el tiburón atacado quien mata y
se come al atacante y ocupa su celda (e incrementa su reloj de reproducción).
Si no está en ninguna de las situaciones anteriores el tiburón sólo buscará una celda vacía para
moverse hacia ésta incrementando su reloj de reproducción.

Cangrejo
Cuando a un cangrejo le corresponde moverse este sólo se moverá si encuentra una sardina o
un tiburón muerto a su alrededor. Si encuentra más de un cadáver a su alrededor entonces
escoge uno aleatoriamente se lo come y se mueve a esta celda. El cangrejo intentará seguir
comiendo de nuevo. Los cangrejos no se reproducen, nadie se los puede comer y no mueren
de inanición (son simples limpiadores de carroña).

NOTA
En el océano se crea una cadena de alimentación en la que los tiburones pueden comerse a las
sardinas o atacar, matar y comerse a otros tiburones. Las sardinas pueden comer sólo
plancton. El plancton no come (imaginariamente se alimenta de la luz solar y sustancias en el
agua). Las sardinas y los tiburones deben comer cada cierto período de tiempo, de lo contrario
mueren por inanición. Los cangrejos no mueren y sólo comen sardinas y tiburones muertos.
El plancton, las sardinas y los tiburones se reproducen después que se han movido una cierta
cantidad de veces. Se crea entonces un complejo ecológico en el que las especies pueden pasar
de períodos de expansión demográfica a decadencia, y bajo determinadas circunstancias una
especie puede también extinguirse.
El objetivo de la simulación es observar y registrar la dinámica poblacional de cada especie.

Flujo de la Simulación
Se inicializa la simulación con un número determinado de plancton, sardinas, tiburones,
cangrejos y obstáculos distribuidos aleatoriamente en el océano. Se entenderá por generación
cero a esta distribución inicial.
En una generación se le deberá dar a cada criatura susceptible de moverse (plancton ,
cangrejo, sardina y tiburón) una oportunidad de hacerlo. El orden en que reciben esta
oportunidad se deberá lograr aleatoriamente. Cuando todas las criaturas que existía
originalmente en la generación hayan tenido su oportunidad de moverse se considerará que se
ha pasado a una nueva generación. Note que las criaturas que nacen durante una generación
no tendrán oportunidad de moverse hasta la próxima generación.
La simulación deberá tener una GUI en la que se puedan introducir y/o visualizar:
Tamaño del océano
Cantidad original de criaturas por especie (que serán distribuidas aleatoriamente en el océano)
Tope de supervivencia y tiempo de reproducción para cada una de las especies a las que esto
sea aplicable
Indicación numérica de la cantidad de criaturas por especie.
Opción para visualizar el océano después de cada movimiento o después de cada n
movimientos donde n debe poderse dar también a través del GUI.
Opción para visualizar el océano después de cada generación o después de cada n
generaciones donde n debe poderse dar también a través del GUI.
Opción para visualizar el océano cuando se haya extinguido una especie
Opción para visualizar el océano en la próxima muerte.
Opción para visualizar el océano en el próximo nacimiento.



Descargar Solución de la galería de códigos de msdn aqui