REMARQUE
Ce problème provient de ce fil reddit (alerte spoiler!), Et je l'ai ajusté pour l'adapter au format de ce site. Tout le mérite revient à l'utilisateur reddit "Coder_d00d".
Dans ce problème, nous simulerons une forêt.
Pour cette forêt simulée, nous traiterons de 3 aspects.
- Arbres pouvant être un jeune arbre, un arbre ou un arbre âgé.
- Bûcherons (il abat des arbres, il mange son déjeuner et se rend au lave-essai)
- Ours (Il mutile les bûcherons qui sentent les crêpes)
Un avertissement: ces règles ne sont probablement pas parfaites. Considérez-les comme des lignes directrices, et si vous avez besoin de modifier légèrement quelque chose qui est bien (les taux de ponte ont été signalés comme un problème, voir la réponse de kuroi neko comme exemple.
Cycle de temps:
La simulation simulera par mois. Vous progresserez dans le temps avec un "tick". Chaque "tick" représente un mois. Chaque 12 "ticks" représente un an. Notre forêt changera et sera en constante évolution. Nous enregistrerons les progrès de notre forêt et analyserons ce qui lui arrive.
Forêt:
La forêt sera une forêt à deux dimensions. Nous aurons besoin d'une entrée de N pour représenter la taille de la forêt dans une grille de taille N x N. À chaque emplacement, vous pouvez contenir des arbres, des ours ou des bûcherons. Ils peuvent occuper le même endroit, mais souvent des événements se produisent lorsqu'ils occupent le même endroit.
Notre forêt sera engendrée au hasard en fonction de la taille. Par exemple, si votre valeur de N = 10. Vous aurez une forêt de 10 sur 10 et 100 spots.
- 10% de la forêt détiendra un bûcheron dans 10 endroits aléatoires. (en utilisant notre forêt de 100 spots, cela devrait être 10 bûcherons)
- 50% de la forêt contiendra des arbres (les arbres peuvent être l'un des 3 types et commenceront comme celui du milieu de «l'arbre») dans des endroits aléatoires.
- 2% de la forêt contiendra des ours.
La façon dont vous recevez la taille de la forêt dépend de vous (lisez depuis stdin, un fichier ou codez-le en dur). Je recommanderais de garder N comme 5 ou plus. Les petites forêts ne sont pas très amusantes.
Événements:
Pendant la simulation, il y aura des événements. Les événements se produisent sur la base d'une logique que j'expliquerai ci-dessous. Je décrirai les événements ci-dessous dans chaque description des 3 éléments de notre forêt.
Les événements suivent l'ordre des arbres en premier, les bûcherons en second et les ours en dernier.
Des arbres:
Chaque mois, un arbre a 10% de chances de faire apparaître un nouveau "gaule". Dans un espace ouvert aléatoire adjacent à un arbre, vous avez 10% de chances de créer un "jeune arbre".
Par exemple, un arbre au milieu de la forêt a 8 autres endroits autour. L'un d'eux (s'ils sont vides) deviendra un "Sapling".
Après 12 mois d'existence, un "Sapling" sera mis à niveau vers un "Tree". Un "jeune arbre" ne peut pas engendrer d'autres arbres tant qu'il n'est pas devenu un "arbre".
Une fois qu'un "jeune arbre" devient un arbre, il peut engendrer d'autres nouveaux "jeunes arbres".
Lorsqu'un "arbre" existe depuis 120 mois (10 ans), il devient un "arbre aîné".
Les arbres plus âgés ont 20% de chances de faire apparaître un nouveau "gaule" au lieu de 10%.
S'il n'y a pas de points adjacents ouverts à un arbre ou un arbre ancien, il ne fera pas apparaître de nouveaux arbres.
Bûcherons:
Les bûcherons abattent des arbres, ils sautent et sautent, ils aiment presser les fleurs sauvages.
Chaque mois, des bûcherons erreront. Ils se déplaceront jusqu'à 3 fois vers un endroit choisi au hasard qui est adjacent dans n'importe quelle direction. Ainsi, par exemple, un bûcheron au milieu de votre grille a 8 emplacements vers lesquels se déplacer. Il se promènera à un endroit aléatoire. Là encore. Et enfin pour une troisième fois. NB: Cela peut être n'importe quel endroit (afin qu'ils puissent entrer dans les ours, ce qui entraîne un maul).
Lorsque le bûcheron bouge, s'il rencontre un arbre (pas un jeune arbre), il s'arrêtera et son errance pour ce mois prendra fin. Il récoltera ensuite l'arbre pour le bois. Retirez l'arbre. Gagnez 1 morceau de bois.
Les bûcherons ne récolteront pas de "jeunes plants".
Les bûcherons récoltent également des arbres plus âgés. Les arbres plus âgés valent 2 morceaux de bois.
Suivi du bois:
Tous les 12 mois, la quantité de bois récolté est comparée au nombre de bûcherons dans la forêt.
Si le bois collecté est égal ou supérieur à la quantité de bûcherons dans la forêt, un certain nombre de nouveaux bûcherons sont embauchés et créés au hasard dans la forêt.
Calculez le nombre de bûcherons à embaucher avec:
floor(lumber_collected / number_of_lumberjacks)
Cependant, si après une période de 12 mois, la quantité de bois collectée est inférieure au nombre de bûcherons, un bûcheron est lâché pour économiser de l'argent et 1 bûcheron aléatoire est retiré de la forêt. Notez que vous ne réduirez jamais votre main-d'oeuvre de bûcheron en dessous de 0.
Ours:
Les ours errent dans la forêt comme un bûcheron. Cependant, au lieu de 3 espaces, un Ours parcourra jusqu'à 5 espaces.
Si un ours tombe sur un bûcheron, il arrêtera son errance pour le mois. (Par exemple, après 2 mouvements, l'ours atterrit sur un espace avec un bûcheron, il ne fera plus aucun mouvement pour ce mois)
Les bûcherons sentent comme des crêpes. Les ours adorent les crêpes. Par conséquent, l'ours sera malheureusement mutilé et blessé le bûcheron. Le bûcheron sera retiré de la forêt (il rentrera chez lui et fera ses courses le mercredi et aura des scones beurrés pour le thé).
Nous allons suivre cela comme un accident "Maul".
Notez que la population de bûcherons ne peut jamais descendre en dessous de 1 - donc si le dernier bûcheron est mutilé, il suffit d'en engendrer un autre.
Suivi Maul:
Au cours de 12 mois, s'il n'y a aucun accident "Maul", la population d'ours augmentera de 1. Si toutefois il y a des accidents "Maul", les bûcherons embaucheront un zoo pour piéger et emmener un ours. Retirez 1 ours aléatoire. Notez que si votre population d'Ours atteint 0 ours, il n'y aura pas d'accident de «Maul» au cours de la prochaine année et vous ferez donc apparaître 1 nouvel ours l'année prochaine.
S'il n'y a qu'un seul bûcheron dans la forêt et qu'il se fait Mauled, il sera renvoyé chez lui, mais un nouveau sera immédiatement embauché et réapparu ailleurs dans la forêt. La population de bûcherons ne peut jamais descendre en dessous de 1.
Temps:
La simulation se déroule sur 4800 mois (400 ans) ou jusqu'à ce qu'il n'y ait plus de jeunes arbres, d'arbres ou d'arbres plus âgés.
Production:
Chaque mois, vous imprimerez une carte de la forêt - peut-être en utilisant une carte ASCII ou en utilisant des graphiques et des couleurs.
Suppléments en option
- Vous pouvez produire les populations d'arbres, de bûcherons et d'ours à chaque tique.
- Vous pouvez sortir chaque fois qu'un événement se produit (par exemple: "Un ours a mutilé un bûcheron.")
Notation
Il s'agit d'un concours de popularité, donc la plupart des votes positifs gagnent!
EDIT - Les gens ont souligné un certain nombre de défauts dans mes règles, et bien que vous puissiez vous sentir libre de me poser des questions, il est également correct de modifier les règles un peu en fonction de votre propre programme ou de l'interprétation du programme.
la source
Note that you will never reduce your Lumberjack labor force below 0
dans la section 3. de la section du bûcheron, remplacez-le par 1 pour correspondre à ce que vous mentionnez dans la section ours?Réponses:
Javascript + HTML - essayez-le
Mis à jour selon la demande populaire
Comportement général
Le programme est maintenant quelque peu interactif.
Le code source est entièrement paramétré, vous pouvez donc modifier quelques paramètres internes supplémentaires avec votre éditeur de texte préféré.
Vous pouvez modifier la taille de la forêt.
Un minimum de 2 est requis pour avoir suffisamment de place pour placer un arbre, un bûcheron et un ours sur 3 endroits différents, et le maximum est arbitrairement fixé à 100 (ce qui fera que votre ordinateur moyen rampe).
Vous pouvez également modifier la vitesse de simulation.
L'affichage est mis à jour toutes les 20 ms, donc un pas de temps plus long produira des animations plus fines.
Les boutons permettent d'arrêter / démarrer la simulation, ou de l'exécuter pendant un mois ou un an.
Le mouvement des habitants de la forêt est maintenant quelque peu animé. Les événements de mutilation et d'abattage d'arbres sont également représentés.
Un journal de certains événements est également affiché. D'autres messages sont disponibles si vous modifiez le niveau de verbosité, mais cela vous inonderait de notifications "Bob coupe encore une autre arborescence".
Je préférerais ne pas le faire si j'étais toi, mais je ne le suis pas, alors ...
À côté du terrain de jeu, un ensemble de graphiques à l'échelle automatique sont dessinés:
La légende affiche également les quantités actuelles de chaque article.
Stabilité du système
Les graphiques montrent que les conditions initiales ne sont pas mises à l'échelle de façon aussi élégante. Si la forêt est trop grande, trop d'ours déciment la population de bûcherons jusqu'à ce que suffisamment d'amateurs de crêpes soient mis derrière les barreaux. Cela provoque une explosion initiale d'arbres plus âgés, qui à son tour aide la population de bûcherons à se rétablir.
Il semble que 15 soit la taille minimale pour que la forêt survive. Une forêt de taille 10 sera généralement rasée après quelques centaines d'années. Toute taille supérieure à 30 produira une carte presque pleine d'arbres. Entre 15 et 30, vous pouvez voir la population d'arbres osciller de manière significative.
Quelques points de règle discutables
Dans les commentaires de l'article d'origine, il semble que divers bipèdes ne soient pas censés occuper le même endroit. Cela contredit en quelque sorte la règle concernant un plouc errant dans un amateur de crêpes.
En tout cas, je n'ai pas suivi cette directive. Toute cellule forestière peut contenir n'importe quel nombre d'inhyabitants (et exactement zéro ou un arbre). Cela pourrait avoir des conséquences sur l'efficacité du bûcheron: je soupçonne que cela leur permet de creuser plus facilement dans une touffe d'arbres plus âgés. Quant aux ours, je ne m'attends pas à ce que cela fasse beaucoup de différence.
J'ai également opté pour avoir toujours au moins un bûcheron dans la forêt, malgré le fait que la population de plouc pourrait atteindre zéro (tirer le dernier bûcheron sur la carte si la récolte était vraiment mauvaise, ce qui n'arrivera jamais de toute façon à moins que la forêt n'ait été réduit à l'extinction).
Peaufiner
Afin d'atteindre la stabilité, j'ai ajouté deux paramètres de peaufinage:
1) taux de croissance des bûcherons
un coefficient appliqué à la formule qui donne le nombre de bûcherons supplémentaires embauchés lorsqu'il y a suffisamment de bois. Défini sur 1 pour revenir à la définition d'origine, mais j'ai trouvé qu'une valeur d'environ 0,5 permettait à la forêt (en particulier les arbres plus âgés) de mieux se développer.
2) critère d'élimination des ours
un coefficient qui définit le pourcentage minimal de bûcherons mutilés pour envoyer un ours au zoo. Réglez à 0 pour revenir à la définition d'origine, mais cette élimination drastique de l'ours limitera essentiellement la population à un cycle d'oscillation de 0-1. Je l'ai fixé à 0,15 (c'est-à-dire qu'un ours n'est retiré que si 15% ou plus des bûcherons ont été mutilés cette année). Cela permet une population d'ours modérée, suffisante pour empêcher les ploucs de nettoyer la zone mais tout en permettant de couper une partie importante de la forêt.
En remarque, la simulation ne s'arrête jamais (même au-delà des 400 ans requis). Il pourrait facilement le faire, mais ce n'est pas le cas.
Le code
Le code est entièrement contenu dans une seule page HTML.
Il doit être codé en UTF-8 pour afficher les symboles Unicode appropriés pour les ours et les bûcherons.
Pour les systèmes endommagés Unicode (par exemple Ubuntu): recherchez les lignes suivantes:
et changer les pictogrammes pour les caractères plus facile à l' affichage (
#
,*
, peu importe)Et ensuite?
D'autres remarques sont toujours les bienvenues.
NB: Je suis conscient que le nombre de gaules / arbres matures / aînés est encore un peu compliqué, mais au diable.
De plus, je trouve document.getElementById plus lisible que $, donc pas besoin de se plaindre du manque de jQueryisms. C'est jQuery gratuitement exprès. À chacun le sien, non?
la source
AngularJS
Voici ma version , qui est toujours un Work In Progress: le code est un peu… enfin… laid. Et assez lent. Je prévois également d'ajouter plus d'options pour paramétrer l'évolution et analyser l'état de la forêt. Les commentaires et propositions d'amélioration sont les bienvenus!
Manifestation
la source
getEntitiesAt
semble être un porc de CPU! l'exécution du système avec une grille 50x50 prend plus d'une seconde par mois sur mon PC. Il y a aussi un cas où tous les arbres sont coupés, puis tous les bûcherons sont tirés et la carte se remplit lentement d'ours :). Essayez une petite taille (10 ou moins) pour voir cela se produire.Forest.tick()
, siForest.lumberjackList.length == 0
, alorsLumberjack.create(<number>, <number>)
.Javascript
Je pense que cela fonctionne principalement. Il y a un comportement bancal où je fraye tous les nouveaux ours / bûcherons en synchronisation et juste à côté les uns des autres à cause de la paresse dans les insertions.
Cette mise en œuvre ne permet pas aux bûcherons de se tenir debout sur les gaules, car vous savez, le piétinement des gaules est mauvais. L'art du violon utilise des rectangles colorés par défaut, changez la deuxième ligne en faux pour utiliser des lettres à dessiner.
violon
HTML:
Js:
la source
n = 50
par exemple).Python
Rien d'extraordinaire. J'ai continué à ajouter des trucs, donc la refactorisation pourrait être de mise. (Et je n'ai pas fait d'Unitest donc des bugs peuvent encore être présents).
J'ai donné des noms aléatoires aux bûcherons et aux ours. Les arbres sont
i
, alorsI
, alors#
, Lumberjacks sontx
, ours sonto
Quelques sorties:
La fin de l'année
Fin du jeu
la source