NOTA
Este problema se tomó de este hilo de reddit (¡alerta de spoiler!), Y lo he ajustado para que se ajuste al formato de este sitio. Todo el crédito va al usuario de reddit "Coder_d00d".
En este problema, simularemos un bosque.
Para este bosque simulado trataremos 3 aspectos.
- Árboles que pueden ser un árbol joven, árbol o árbol viejo.
- Leñadores (corta árboles, come su almuerzo y va al Lava-try)
- Osos (golpea a los leñadores que huelen a panqueques)
Una advertencia previa: estas reglas probablemente no sean perfectas. Véalos como una guía, y si necesita ajustar algo que esté bien (las tasas de desove se han señalado como un problema, vea la respuesta de kuroi neko como un ejemplo de esto.
Ciclo de tiempo:
La simulación simulará por meses. Avanzarás progresivamente en el tiempo con un "tic". Cada "marca" representa un mes. Cada 12 "garrapatas" representa un año. Nuestro bosque cambiará y estará en constante cambio. Registraremos el progreso de nuestro bosque y analizaremos lo que le sucede.
Bosque:
El bosque será un bosque bidimensional. Requeriremos una entrada de N para representar el tamaño del bosque en una cuadrícula de N x N de tamaño. En cada ubicación puedes sostener árboles, osos o leñadores. Pueden ocupar el mismo lugar, pero a menudo ocurren eventos cuando ocupan el mismo lugar.
Nuestro bosque se generará aleatoriamente según el tamaño. Por ejemplo, si su valor de N = 10. Tendrá un bosque de 10 por 10 y 100 puntos.
- El 10% del bosque tendrá un leñador en 10 lugares al azar. (usando nuestro bosque de 100 puntos, esto debería ser 10 leñadores)
- El 50% del bosque tendrá árboles (los árboles pueden ser uno de los 3 tipos y comenzarán como el medio del "árbol") en puntos aleatorios.
- El 2% del bosque tendrá osos.
La forma en que recibe el tamaño del bosque depende de usted (lea desde stdin, un archivo o codifíquelo). Recomendaría mantener N como 5 o superior. Los pequeños bosques no son muy divertidos.
Eventos:
Durante la simulación habrá eventos. Los eventos ocurren en base a alguna lógica que explicaré a continuación. Describiré los eventos a continuación en cada descripción de los 3 elementos de nuestro bosque.
Los eventos siguen primero el orden de los árboles, los leñadores en segundo lugar y los osos en último lugar.
Arboles:
Todos los meses, un árbol tiene un 10% de probabilidad de generar un nuevo "árbol joven". En un espacio abierto aleatorio adyacente a un árbol, tienes un 10% de posibilidades de crear un "Retoño".
Por ejemplo, un árbol en el medio del bosque tiene otros 8 puntos a su alrededor. Uno de estos (si están vacíos) se convertirá en un "Retoño".
Después de 12 meses de existencia, un "Retoño" se actualizará a un "Árbol". Un "Retoño" no puede generar otros árboles hasta que haya madurado hasta convertirse en un "Árbol".
Una vez que un "Retoño" se convierte en un árbol, puede generar otros nuevos "Retoños".
Cuando un "Árbol" ha existido durante 120 meses (10 años) se convertirá en un "Árbol de Ancianos".
Los árboles antiguos tienen un 20% de probabilidad de generar un nuevo "Retoño" en lugar del 10%.
Si no hay lugares adyacentes abiertos a un Árbol o Árbol Mayor, no generará ningún Árbol nuevo.
Leñadores:
Los leñadores talan árboles, saltan y saltan, les gusta presionar flores silvestres.
Cada mes los leñadores vagarán. Se moverán hasta 3 veces a un lugar elegido al azar que sea adyacente en cualquier dirección. Entonces, por ejemplo, un leñador en el medio de su cuadrícula tiene 8 lugares para moverse. Vagará a un lugar al azar. Entonces otra vez. Y finalmente por tercera vez. NB: Este puede ser cualquier lugar (para que puedan entrar en osos, lo que resulta en un maul)
Cuando el leñador se mueve, si encuentra un árbol (no un árbol joven), se detendrá y su deambular por ese mes llegará a su fin. Luego cosechará el árbol para obtener madera. Retira el árbol. Gana 1 pieza de madera.
Los leñadores no cosecharán "retoños".
Los lumberacks también cosechan árboles de saúco. Los árboles viejos valen 2 piezas de madera.
Seguimiento de la madera:
Cada 12 meses, la cantidad de madera cosechada se compara con la cantidad de leñadores en el bosque.
Si la madera recolectada es igual o superior a la cantidad de leñadores en el bosque, se contratan varios leñadores nuevos y se generan aleatoriamente en el bosque.
Calcule la cantidad de leñadores a contratar con:
floor(lumber_collected / number_of_lumberjacks)
Sin embargo, si después de un período de 12 meses, la cantidad de madera recolectada es inferior a la cantidad de leñadores, entonces se deja ir a un leñador para ahorrar dinero y se retira 1 leñador al azar del bosque. Tenga en cuenta que nunca reducirá su fuerza laboral de leñador por debajo de 0.
Osos:
Los osos deambulan por el bosque como un leñador. Sin embargo, en lugar de 3 espacios, un oso recorrerá hasta 5 espacios.
Si un oso se encuentra con un leñador, dejará de deambular por el mes. (Por ejemplo, después de 2 movimientos, el oso aterriza en un espacio con un leñador, no hará más movimientos para este mes)
Los leñadores huelen a panqueques. A los osos les encantan los panqueques. Por lo tanto, el oso lamentablemente lastima y lastima al leñador. El leñador será retirado del bosque (irá a casa y comprará los miércoles y tomará bollos con mantequilla para el té).
Seguiremos esto como un accidente de "Maul".
Tenga en cuenta que la población de leñadores nunca puede caer por debajo de 1, por lo tanto, si se mutila el último leñador, simplemente genere otro.
Seguimiento de Maul:
Durante el transcurso de 12 meses, si hay 0 accidentes de "Maul", la población de osos aumentará en 1. Sin embargo, si hay algún accidente de "Maul", los Leñadores contratarán un zoológico para atrapar y llevarse un oso. Eliminar 1 oso al azar. Tenga en cuenta que si su población de osos llega a 0 osos, no habrá accidentes de "Maul" en el próximo año, por lo que generará 1 nuevo oso el próximo año.
Si solo hay 1 leñador en el bosque y lo maulen, lo enviarán a casa, pero se contratará uno nuevo de inmediato y se reaparecerá en otro lugar del bosque. La población de leñadores nunca puede caer por debajo de 1.
Hora:
La simulación ocurre durante 4800 meses (400 años), o hasta que no existan árboles jóvenes, árboles o árboles mayores.
Salida:
Cada mes imprimirá un mapa del bosque, tal vez usando un mapa ASCII, o usando gráficos y colores.
Extras opcionales
- Puede generar las poblaciones de árboles, leñadores y osos en cada garrapata.
- Puede generar resultados cada vez que se produce un evento (por ejemplo: "Un oso mutilado a un leñador").
Puntuación
Este es un concurso de popularidad, ¡así que la mayoría de los votos positivos gana!
EDITAR: la gente ha señalado una serie de fallas en mis reglas, y aunque puede sentirse libre de hacerme preguntas, también está bien modificar un poco las reglas para que se adapten a su propio programa o interpretación del programa.
fuente
Note that you will never reduce your Lumberjack labor force below 0
en la sección de leñador, elemento de la lista 3. ¿quizás cambie esto a 1 para estar en línea con lo que menciona en la sección de osos?Respuestas:
Javascript + HTML - pruébalo
Actualizado según solicitud popular
Comportamiento general
El programa ahora es algo interactivo.
El código fuente está completamente parametrizado, por lo que puede modificar algunos parámetros internos más con su editor de texto favorito.
Puedes cambiar el tamaño del bosque.
Se requiere un mínimo de 2 para tener suficiente espacio para colocar un árbol, un leñador y un oso en 3 puntos diferentes, y el máximo se fija arbitrariamente a 100 (lo que hará que su computadora promedio se arrastre).
También puede cambiar la velocidad de simulación.
La pantalla se actualiza cada 20 ms, por lo que un mayor paso de tiempo producirá animaciones más finas.
Los botones permiten detener / iniciar la simulación, o ejecutarla durante un mes o un año.
El movimiento de los habitantes del bosque ahora está algo animado. También se calculan eventos de corte y corte de árboles.
También se muestra un registro de algunos eventos. Hay algunos mensajes más disponibles si cambia el nivel de verbosidad, pero eso lo inundaría con notificaciones de "Bob corta otro árbol".
Preferiría no hacerlo si fuera tú, pero no lo soy, así que ...
Al lado del patio de recreo, se dibuja un conjunto de gráficos a escala automática:
La leyenda también muestra las cantidades actuales de cada artículo.
Estabilidad del sistema
Los gráficos muestran que las condiciones iniciales no se escalan tan bien. Si el bosque es demasiado grande, demasiados osos diezman la población de leñadores hasta que suficientes amantes de los panqueques hayan sido puestos tras las rejas. Esto provoca una explosión inicial de árboles de saúco, que a su vez ayuda a la población de leñadores a recuperarse.
Parece que 15 es el tamaño mínimo para que el bosque sobreviva. Un bosque de tamaño 10 generalmente será arrasado después de unos pocos cientos de años. Cualquier tamaño superior a 30 producirá un mapa casi lleno de árboles. Entre 15 y 30, puede ver la población de árboles oscilando significativamente.
Algunos puntos de reglas discutibles
En los comentarios de la publicación original, parece que varios bípedos no deberían ocupar el mismo lugar. Esto contradice de alguna manera la regla sobre un redneck vagando en un panqueque amateur.
En cualquier caso, no seguí esa directriz. Cualquier celda forestal puede contener cualquier número de habitantes (y exactamente cero o un árbol). Esto podría tener algunas consecuencias en la eficiencia del leñador: sospecho que les permite cavar en un grupo de árboles de saúco más fácilmente. En cuanto a los osos, no espero que esto haga mucha diferencia.
También opté por tener siempre al menos un leñador en el bosque, a pesar del punto que indica que la población de redneck podría llegar a cero (disparar el último leñador en el mapa si la cosecha era realmente pobre, lo que nunca sucederá de todos modos a menos que el bosque haya sido picado hasta la extinción).
Afinando
Para lograr la estabilidad, agregué dos parámetros de ajuste:
1) tasa de crecimiento de los leñadores
Un coeficiente aplicado a la fórmula que da el número de leñadores adicionales contratados cuando hay suficiente madera. Establecido en 1 para volver a la definición original, pero encontré un valor de aproximadamente .5 permitió que el bosque (especialmente los árboles de saúco) se desarrollara mejor.
2) criterio de remoción de osos
Un coeficiente que define el porcentaje mínimo de leñadores mutilados para enviar un oso al zoológico. Se establece en 0 para volver a la definición original, pero esta eliminación drástica del oso básicamente limitará la población a un ciclo de oscilación de 0-1. Lo configuré en .15 (es decir, un oso se elimina solo si el 15% o más de los leñadores han sido mutilados este año). Esto permite una población moderada de osos, suficiente para evitar que los sureños limpien el área, pero aún así permite cortar una parte considerable del bosque.
Como nota al margen, la simulación nunca se detiene (incluso después de los 400 años requeridos). Podría hacerlo fácilmente, pero no lo hace.
El código
El código está completamente contenido en una sola página HTML.
Se debe ser UTF-8 codificado para mostrar los símbolos Unicode adecuados para osos y leñadores.
Para los sistemas con problemas Unicode (por ejemplo, Ubuntu): busque las siguientes líneas:
y cambiar los pictogramas de los caracteres más fácil de la pantalla (
#
,*
, lo que sea)¿Qué sigue?
Aún más comentarios son bienvenidos.
NB: Soy consciente de que el recuento de árboles jóvenes / maduros / ancianos sigue siendo un poco desordenado, pero al diablo con eso.
Además, encuentro document.getElementById más legible que $, por lo que no es necesario quejarse de la falta de jQueryisms. Es jQuery gratis a propósito. A cada uno lo suyo, ¿verdad?
fuente
AngularJS
Aquí está mi versión , que todavía es un trabajo en progreso: el código es un poco ... bueno ... feo. Y bastante lento. También planeo agregar más opciones para parametrizar la evolución y analizar el estado del bosque. ¡Comentarios y propuestas de mejora son bienvenidos!
Demostración
fuente
getEntitiesAt
parece ser un cerdo de la CPU! Ejecutar el sistema con una cuadrícula de 50x50 toma más de un segundo por mes en mi PC. También hay un caso en el que todos los árboles se cortan, luego se disparan todos los leñadores y el mapa se llena lentamente de osos :). Pruebe con un tamaño pequeño (10 o menos) para ver que suceda.Forest.tick()
, siForest.lumberjackList.length == 0
, entoncesLumberjack.create(<number>, <number>)
.Javascript
Creo que esto funciona principalmente. Hay un comportamiento inestable en el que engendro todos los nuevos osos / leñadores sincronizados y uno al lado del otro debido a la pereza en las inserciones.
Esta implementación no permite que los leñadores se paren en los árboles jóvenes, porque ya sabes, pisotear los árboles jóvenes es malo. Fiddle art usa rectángulos de colores por defecto, cambia la segunda línea a falso para usar letras para dibujar.
violín
HTML:
Js:
fuente
n = 50
, por ejemplo).Pitón
Nada sofisticado. Seguí agregando cosas, por lo que la refactorización podría estar en orden. (Y no hice unitest por lo que los errores aún podrían estar presentes).
Le di nombres aleatorios a leñadores y osos. Los árboles son
i
, entoncesI
, entonces#
, los leñadores sonx
, los osos sono
Algunas salidas:
Fin de año
Fin del juego
fuente