НОТА
Эта проблема была взята из этой ветки reddit (оповещение о спойлере!), И я настроил ее так, чтобы она соответствовала формату этого сайта. Весь кредит переходит к пользователю Reddit "Coder_d00d".
В этой задаче мы будем моделировать лес.
Для этого смоделированного леса мы будем иметь дело с 3 аспектами.
- Деревья, которые могут быть Саженцем, Древом или Старшим Деревом.
- Дровосеки (он рубит деревья, обедает и идет на лаву)
- Медведи (он травит дровосеков, которые пахнут блинами)
Предупреждение: эти правила, скорее всего, не идеальны. Рассматривайте их как ориентир, и если вам нужно немного подправить что-нибудь хорошее (нерестовые потоки были указаны как проблема, см. Ответ kuroi neko как пример этого).
Цикл времени:
Симуляция будет симулировать по месяцам. Вы будете продвигаться вперед во времени с «галочкой». Каждый «тик» представляет месяц. Каждые 12 «галочек» представляют год. Наш лес изменится и будет постоянно меняться. Мы запишем прогресс нашего леса и проанализируем, что с ним происходит.
Лес:
Лес будет двухмерным лесом. Нам потребуется ввод N для представления размера леса в сетке размером N x N. В каждом месте вы можете держать деревья, медведи или дровосеки. Они могут занимать одно и то же место, но часто события происходят, когда они занимают одно и то же место.
Наш лес будет порожден случайным образом в зависимости от размера. Например, если ваше значение N = 10. У вас будет 10 на 10 лесов и 100 мест.
- 10% леса проведут дровосека в 10 случайных местах. (используя наш 100 точечный лес это должно быть 10 лесорубов)
- 50% леса будут содержать деревья (деревья могут быть одного из 3-х видов и начинаются как середина дерева) в случайных местах.
- 2% леса будут содержать медведей.
Как вы получите размер леса, зависит от вас (читайте из стандартного файла, файла или жестко запишите его). Я бы порекомендовал оставить N как 5 или выше. Небольшие леса не очень весело.
События:
Во время симуляции будут происходить события. События происходят на основе некоторой логики, которую я объясню ниже. Я опишу события ниже в каждом описании 3 элементов нашего леса.
События следуют за порядком деревьев сначала, лесорубами вторыми и медведями последними.
Деревья:
Каждый месяц у Дерева есть 10% шанс порождать новый «Саженец». В случайном открытом пространстве рядом с деревом у вас есть 10% шанс создать «Саженец».
Например, у дерева посреди леса вокруг него есть еще 8 пятен. Один из них (если они пусты) станет «Саженцем».
После 12 месяцев существования «Саженец» будет обновлен до «Дерева». «Саженец» не может порождать другие деревья, пока не превратится в «Дерево».
Как только "Саженец" становится деревом, он может порождать другие новые "Саженцы".
Когда «Дерево» существует в течение 120 месяцев (10 лет), оно становится «Древним деревом».
У Старших Деревьев с вероятностью 20% появляется новый «Саженец» вместо 10%.
Если рядом с деревом или старшим деревом нет открытых соседних мест, новые деревья не появятся.
Лесорубы:
Дровосеки рубят деревья, они прыгают и прыгают, им нравится давить полевые цветы.
Каждый месяц дровосеки будут бродить. Они будут перемещаться до 3 раз в случайно выбранную точку, смежную в любом направлении. Так, например, у Дровосека в середине вашей сетки есть 8 мест для перемещения. Он будет бродить в случайном месте. Тогда снова. И, наконец, в третий раз. NB: Это может быть любое место (так что они могут ходить в медведей, в результате чего мол).
Когда дровосек перемещается, если он встречает Дерево (не саженец), он останавливается, и его странствия на этот месяц заканчиваются. Затем он соберет дерево для пиломатериалов. Удалить дерево. Получите 1 кусок пиломатериалов.
Дровосеки не будут собирать «Саженцы».
Lumberacks также собирают Древние Деревья. Древние деревья стоят 2 штуки.
Отслеживание пиломатериалов:
Каждые 12 месяцев количество заготовленной древесины сравнивается с количеством лесорубов в лесу.
Если количество собранных пиломатериалов равно или превышает количество лесорубов в лесу, то ряд новых лесорубов нанимаются и случайным образом появляются в лесу.
Определите количество лесорубов, которые можно взять на прокат:
floor(lumber_collected / number_of_lumberjacks)
Однако, если после 12-месячного промежутка количество собранных пиломатериалов меньше количества лесорубов, то лесоруб отпускают, чтобы сэкономить деньги, и 1 случайный лесоруб удаляется из леса. Обратите внимание, что вы никогда не будете снижать свою рабочую силу дровосека ниже 0.
Медведи:
Медведи бродят по лесу, как дровосек. Однако вместо 3 пробелов Медведь будет бродить до 5 пробелов.
Если медведь встретит дровосека, он прекратит свое блуждание на месяц. (Например, после 2 ходов медведь приземляется на место с дровосеком, он не будет делать больше ходов в этом месяце)
Дровосеки пахнут блинами. Медведи любят блины. Поэтому Медведь, к сожалению, будет травмировать и повредить дровосека. Дровосека уберут из леса (по средам он будет ходить домой и делать покупки, а чай с маслом намазать маслом).
Мы будем отслеживать это как несчастный случай "Мол".
Обратите внимание, что популяция дровосека никогда не может опуститься ниже 1 - поэтому, если последний дровосек был размазан, просто возьмите другого.
Отслеживание Мол:
В течение 12 месяцев, если будет 0 несчастных случаев, связанных с «Молом», популяция медведей увеличится на 1. В случае несчастных случаев, связанных с «Молом», лесорубы наймут зоопарк, чтобы поймать и забрать медведя. Удалить 1 случайного медведя. Обратите внимание, что если ваша популяция медведей достигнет 0 медведей, то в следующем году не произойдет несчастных случаев "Мол", поэтому в следующем году вы получите 1 нового медведя.
Если в лесу есть только один лесоруб, и он получает Мол, он будет отправлен домой, но новый будет немедленно нанят и найден где-то еще в лесу. Популяция дровосека никогда не может опуститься ниже 1.
Время:
Моделирование происходит в течение 4800 месяцев (400 лет) или до тех пор, пока не появятся Саженцы, Деревья или Старшие Деревья.
Выход:
Каждый месяц вы будете распечатывать карту леса - возможно, используя карту ASCII или используя графику и цвета.
Дополнительные опции
- Вы можете выводить популяции деревьев, дровосеков и медведей каждый тик.
- Вы можете выводить всякий раз, когда происходит событие (например: «Медведь испортил дровосека».)
счет
Это конкурс популярности, поэтому большинство побед выигрывает!
РЕДАКТИРОВАТЬ - Люди указали на ряд недостатков в моих правилах, и, хотя вы можете свободно задавать мне вопросы, также можно немного изменить правила в соответствии с вашей собственной программой или ее интерпретацией.
источник
Note that you will never reduce your Lumberjack labor force below 0
в пункте 3 списка разделов дровосека, возможно, измените его на 1, чтобы соответствовать тому, что вы упоминаете в разделе медведя?Ответы:
Javascript + HTML - попробуйте
Обновлено в соответствии с популярным запросом
Общее поведение
Программа теперь несколько интерактивная.
Исходный код полностью параметризован, поэтому вы можете настроить еще несколько внутренних параметров в своем любимом текстовом редакторе.
Вы можете изменить размер леса.
Минимум 2 требуется, чтобы иметь достаточно места для размещения дерева, дровосека и медведя в 3 разных местах, а максимальное значение произвольно устанавливается равным 100 (что приведет к ползанию вашего среднего компьютера).
Вы также можете изменить скорость симуляции.
Дисплей обновляется каждые 20 мс, поэтому больший шаг по времени приведет к более точной анимации.
Кнопки позволяют остановить / запустить симуляцию или запустить ее в течение месяца или года.
Движение жителей леса теперь несколько оживлено. Также вырисовываются события рубки и вырубки деревьев.
Журнал некоторых событий также отображается. Еще несколько сообщений доступны, если вы измените уровень многословия, но это затопит вас уведомлениями «Боб режет еще одно дерево».
Я бы предпочел не делать этого на твоем месте, но я не так, так что ...
Рядом с игровой площадкой нарисован набор автоматически масштабируемой графики:
Легенда также отображает текущее количество каждого товара.
Стабильность системы
Графики показывают, что начальные условия не масштабируются так изящно. Если лес слишком велик, слишком много медведей уничтожают популяцию дровосеков, пока достаточное количество любителей блин не окажется за решеткой. Это вызывает первоначальный взрыв старших деревьев, что, в свою очередь, помогает вырастить популяции лесорубов.
Кажется, 15 - это минимальный размер для выживания леса. Лес размером 10 обычно разрушается через несколько сотен лет. Любой размер выше 30 создаст карту, почти полную деревьев. Между 15 и 30 вы можете видеть, что популяция деревьев значительно колеблется.
Некоторые дискуссионные правила
В комментариях к оригинальному сообщению кажется, что разные двуногие не должны занимать одно и то же место. Это как-то противоречит правилу о том, как быдло бродит в блин-любитель.
Во всяком случае, я не следовал этому руководству. Любая лесная клетка может содержать любое количество ингибиторов (и ровно ноль или одно дерево). Это может иметь некоторые последствия для эффективности дровосека: я подозреваю, что это позволяет им легче копаться в пучине старших деревьев. Что касается медведей, я не ожидаю, что это будет иметь большое значение.
Я также предпочел, чтобы в лесу всегда был хотя бы один лесоруб, несмотря на мысль о том, что популяция быдла может достичь нуля (запуск последнего лесоруба на карте, если урожай был действительно плохим, что никогда не произойдет, если лес не будет рубить до исчезновения).
доводка
Чтобы добиться стабильности, я добавил два параметра настройки:
1) темпы роста лесорубов
коэффициент, применяемый к формуле, который дает количество дополнительных лесорубов, нанятых при наличии достаточного количества древесины. Установите значение 1, чтобы вернуться к исходному определению, но я обнаружил, что значение около 0,5 позволяет лесу (особенно старшим деревьям) развиваться лучше.
2) критерий удаления медведя
коэффициент, определяющий минимальный процент разбитых дровосеков, чтобы отправить медведя в зоопарк. Установите 0, чтобы вернуться к исходному определению, но это радикальное устранение медведя в основном ограничит популяцию циклом колебаний 0-1. Я установил его на .15 (то есть медведь удаляется, только если в этом году было продано 15% или более лесорубов). Это учитывает умеренную популяцию медведей, достаточную для того, чтобы предотвратить быструю вытирание области чистыми местами, но в то же время позволяет рубить значительную часть леса.
В качестве примечания, симуляция никогда не останавливается (даже по прошествии 400 лет) Это легко можно сделать, но это не так.
Код
Код полностью содержится в одной HTML-странице.
Он должен быть в кодировке UTF-8 для отображения правильных символов Юникода для медведей и дровосеков.
Для систем с юникодом (например, Ubuntu): найдите следующие строки:
и изменить пиктограммы для символов легче дисплея (
#
,*
, что угодно)Что дальше?
Другие замечания все еще приветствуются.
NB: Я знаю, что количество саженцев / зрелых / старших деревьев все еще немного грязное, но черт с ним.
Кроме того, я считаю document.getElementById более читабельным, чем $, поэтому не нужно жаловаться на отсутствие jQueryisms. Это бесплатно для jQuery. Каждому свое, верно?
источник
AngularJS
Вот моя версия , которая все еще находится в стадии разработки: код немного ... ну ... некрасиво. И довольно медленно. Я также планирую добавить дополнительные параметры для параметризации эволюции и анализа состояния леса. Комментарии и предложения по улучшению приветствуются!
демонстрация
источник
getEntitiesAt
похоже на процессорную свинью! запуск системы с сеткой 50x50 занимает более одной секунды в месяц на моем ПК. Также есть случай, когда все деревья рубятся, тогда все лесорубы запускаются и карта медленно заполняется медведями :). Попробуйте маленький размер (10 или меньше), чтобы увидеть, как это происходит.Forest.tick()
, еслиForest.lumberjackList.length == 0
, тогдаLumberjack.create(<number>, <number>)
.Javascript
Я думаю, что это в основном работает. Есть некое странное поведение, когда я порождаю всех новых медведей / дровосеков синхронно и рядом друг с другом из-за лени во вставках.
Эта реализация не позволяет лесорубам стоять на саженцах, потому что вы знаете, вытаптывать саженцы плохо. Fiddle art использует цветные прямоугольники по умолчанию, измените вторую строку на false, чтобы использовать буквы для рисования.
играть на скрипке
HTML:
Js:
источник
n = 50
).питон
Ничего фантастического. Я продолжал добавлять вещи, так что рефакторинг может быть в порядке. (И я не делал unitest, поэтому ошибки все еще могут присутствовать).
Я дал случайные имена лесорубам и медведям. Деревья
i
, затемI
, затем#
, Лесорубы являютсяx
, медведиo
Некоторые выводы:
Конец года
Конец игры
источник