Pull to refresh

Comments 57

Было бы интересно увидеть ссылку на бинарник, для тех, у кого есть jre, но нет jdk. :)

интересно что будет если добавить такое ограничение:
породить нового зайца можно будет только после 20 съеденных трав, а волка после 5 съеденных зайцев. Тогда они не будут самопорождаться без еды. А с учетом старения будут участками вымирать, давая траве (и зайцам) возможность вырасти и накормить тех, кто не сидит на месте.
А я бы сделал так, что зайцы и волки могли бы порождать потомство только если сытость выше определённого уровня (например, 50 из 100), а после размножения сытость снижается (например, на 30).
Примерно так и происходит. Размножение разрешено, только если «сытости» у существа больше половины.
Тут суть в том, что после размножения сытость уменьшается и существу нужно идти есть.

"закон сохранения" должен быть. При рождении потомства сумма сытости матери и потомков не меняется.

Мысль интересная, спасибо.
На данный момент с этой задачей хорошо справляется «взрослость». Она показатель того, что что-то было съедено, в противном случае существо бы просто не дожило до взрослой стадии. Более того, поведение существ нужно будет менять под новые правила, иначе действовать они будут неэффективно.
Ну да, а в природе все как-то само-собой организовалось. Бывают же случайности!

В природе всё отлаживалось миллиард лет. И случайность ту ни при чём.

мне кажется, что случайность была одной из частей этой многомиллиардной отладки :)

Случайность — не часть отладки. Она нужна для зашумления кода, чтобы было что отлаживать.

может быть, но она явно дала свой эффект и даёт до сих пор.

Отладки не получится, если вся популяция вымрет. Чтобы все "само отлаживалось", надо, чтобы организмы приспосабливались быстрее, чем вымирают. В модели автора это явно не так.

Логично. В природе вымерла далеко не одна популяция.

Это сложно назвать отладкой

UFO just landed and posted this here
Случайностей нет, если помнить, что 99% всех живущих видов вымерло
в природе многие виды проходят периоды почти полного вымирания (а то и полного), как раз потому, что само собой не организовалось. Предки человека тоже проходили через это — эффект бутылочного горлышка, т.е. критическое уменьшение численности
UFO just landed and posted this here
Ваш основательный подход напомнил мне игру «Dwarf Fortress». :))
Спасибо, но, боюсь, это сильно упрощенная модель по сравнению с «Dwarf Fortress».
Если встретятся два волка с достаточным желанием размножаться и волчица со схожим интересом, то между волками происходит сражение. Волк, у которого больше здоровья, с некоторой вероятностью побеждает (хотя может и проиграть), нанося урон проигравшему, но сам тоже теряет силы. Победителю достается волчица, проигравший уходит.
Еще нужно, чтобы можно было грабить корованы
Остаётся добавить наследуемую генетическую информацию, например:
— дальность зрения, за счёт постоянного небольшого увеличения энергозатрат;
— скорость бега, за счёт постоянного небольшого увеличения энергозатрат и увеличения энергозатрат на передвижение;
— масса тела, больше накапливаемый запас энергии, за счёт увеличения энергозатрат на передвижение…
Не забыть сделать рецессивные и доминантные признаки и их наследование по простейшим правилам.
UFO just landed and posted this here
А если добавить что при размножение забирается сытость?
Ну теперь надо к каждому волку и к каждому зайцу подключить нейросеть, которая в рамках заложенных правил могла бы заменить случайный выбор. При размножении — копировать ее в новое существо. По идее, должен запуститься «естественный отбор» нейросетей: неудачные гибнут, удачные размножаются.

Забавно. Как знакомо…
Сам такие задачи делал в рамках лабораторных (даже не курсовая..)
Правда не просто так, а в рамках изучения классов и наследования C++.
Базовый класс животное… наследуемые классы зверей со своими свойствами и поведением.
И общий цикл тайминга, передающий в цикле управления объектам классов.
(вариант с многонитевой средой — отдельная лаба..)


А в этом решении от понятия объектное программирование отказались вообще.
На мой взгляд, зря. Классическая задача придуманная как будто специально под это.


Хотя… может быть и нет. по описанию и кусочку кода судить сложно.

А в этом решении от понятия объектное программирование отказались вообще.
На мой взгляд, зря. Классическая задача придуманная как будто специально под это.

Я бы поспорил. Взгляните на остальной код — ссылка на репозиторий указана.

Ага… слишком бегло глянул.
теперь вижу.


   newRabbits.forEach(newRabbit -> drawableRabbits.add(drawableZooFactory.wrap(newRabbit)));

Спасибо за статью.
Интересно было посмотреть как и чему сейчас учат...

Если волк и заяц оказываются в одном квадрате, волк съедает кролика
Кролик у волка с собой? :)
Обожаю подобные статьи.

Помню после публикации вот этой в 10-м году: geektimes.ru/post/90571 тоже стал делать подобное…

У меня не было клеток, было свободное поле. Были деревья (ну или трава, не знаю как назвать верно), которые росли со временем, и раскидывали семена в заданном радиусе. И были существа (по аналогии с вдохновившей меня статьей назывались флексы), которые жрали травку, ну и сделал так же вероятность каннибализма в случае голода (опять же под впечатлением статьи). Размножение, смерть от старости — все это тоже было. ДНК как таковой не было, но в потомстве учитывалась скорость родителей, радиус зрения, уровень хищничества и тп параметры.

ИИ был примерно такой — были потребность есть, потребность двигаться (чтобы шарились по карте), потребность размножется. Все это складывалось и по вероятности выбиралось действие. (Например если только поел — то потребность есть = 0, со временем повышается, если давно не размножался — то потребность размножаться =10, потребность двигаться всегда была = 5, генерится число от 0 до 15, если 0-10 — то выбираем размножаться, если 10-15 — то шаримся по карте). В случае если перс хищник надо было еще догнать жертву. Был стек действий, чтобы можно было запланировать несколько действий и выполнять их, если еще актуальны. Хотя сейчас я бы делал это на основе GOAP (очень похоже на то что я реализовал тогда, только GOAP круче).

Делал огонь и тп, чтобы персы теряли энергию, после этого они они запоминали идентификатор объекта и те которые обожглись уже не лезли в огонь. Могли при встрече обмениваться идентификаторами опасностей и ништяков, как будто язык такой у них был (один обжегся, рассказал при встрече другому — другой уже не полезет в огонь).

Баланс — да, сложно было добиться устойчивой системы. И быстродействие, у меня было все в риалтайме и без клеток (еще и в 3Д, хотя и плоскими спрайтами :)), через некоторое время начинало жутко тормозить. Ну и времени все это отнимало кучу.

Сча прямо ностальгия, после прочтения статьи.
Классическая задача хишник и жертва, просто модифицированная. Баланс находится решением диф.уров., она также показывает ограниченность десятичной дроби, тем самым теоретически бесконечный баланс на практике не достигается, но внушительное количество итераций можно пройти. Данную задачу делал еще в Школе, немного в другой формулировке, но впечатления от нее остались до сих пор.

получаются весёлые картинки, если волк с зайцем в одной клетке

Основное — почему роды бесплатны? Роды должны: понижать сытость самок, и при этом существенно (как минимум на объём прибавки у потомства). Новорожденные/молодые не должны иметь полной сытости после рождения.
Супер! Я точно такое же начинал делать, только в браузере, с WebSocket.
И я хотел сделать с рыбками: хищными и не хищными. Так же хотел добавить объекты вроде камней, островов, потом хотел растянуть карту динамически, потом хотел чтобы они двигались попиксельно, а не большими квадратами, потом, чтобы объединялись в группы, потом, чтобы группы двигались определенными маршрутами, потом меняли маршрут, чтобы можно было управлять группами или даже каждой рыбкой в отдельности, посылать команды ей, сохранять текущее состояние игры, чтобы продолжить потом с сохраненного места, потом чтобы это были не только рыбки, а все что угодно.
Потом испытал слишком сильную эйфорию от своей идеи и понял, что это потянет на огромное количество кода и времени и к тому же не был уверен, что моя идея правильная и осуществима, и что я верно продумал все, так что оставил не на долго, чтобы подумать, в итоге уже год не могу вернуться и начать заново. Не могу придумать какие технологии лучше задействовать.
Но вы меня вдохновили.
Запустил я программу и обнаружил, что баланс в популяции есть, но потолка у нее, как будто, нет. Как зайцы, так и волки упорно плодятся. Не хватает ограничения в числе особей на клетку.
В дографическую эпоху было нечто подобное, игра «жизнь».
https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life

Кстати, тем кто изучает программирование это направление — это огромное количество забавных игровых задач для практики.

Есть хорошая книжка по теме:
Математическое моделирование и исследование устойчивости биологических сообществ


Можно без постановки экспериментов проанализировать к чему сойдутся популяции при всевозможных начальных условиях.

В детстве я читал такую статью в журнале «В мире науки» за февраль 1985 года.
Статья «Акулы и рыбы ведут экологическую войну на тороидальной планете Аква-Тор»
В мире науки, 1985 №2. По этой статье несколько раз делал программки для освоения разных языков программирования. Пару раз сам проводил занятия, используя этот материал для обучения. Кравивая модель.
Следующий ход: перевести траву с питания солнечной энергией на трупы волков и зайцев, и/или заставить их удобрять травку через n ходов после еды.
Надеюсь, на седьмой-то день отдохнете?
Что можно было бы добавить:
  • возможность задавать различное поведение для разных участников
  • возможность передавать свой код потомству
На 3м курсе писал подобное. Лаба называлась зайцы и лисы :)
И точно так же зацепило.
В итоге появились, камни, трава, лисы, оградки, лисы имели область видимости зайцы то же. Лисы искали зайцев или лис, зайцы искали траву или лис. Так же умели искать путь в лабиринтах оградок. Но система так и не стала стабильной. были параметры при которой она становилась стабильной, но… Сделать беременность лисам и зайцам я тогда не додумался :)
Решал такую задачу в школе, потом уже в более сознательном возрасте. Оба раза в условии был заложен интерес волков к волчицам: если поблизости нет зайцев, волк начинал охотиться за волчицей. Так же, как у вас, это привело к экспоненциальному размножению волков на одной клетке.

Решил эту проблему путем введения «полового голода» — волк начинал интересоваться самками только когда соответствующий счетчик достигал какого-то значения. При рождении он выставлялся на ноль, после спаривания также обнулялся.

Правда, устойчивой в долгосрочной перспективе модели у меня не получилось, а дальше усложнять модель я уже не стал, так как изначальная цель была просто вспомнить питон.
Запустил бинарник. Заметил 120 волков в одной клетке. По-хорошему надо бы добавить ещё «вместимость» квадрата.
Sign up to leave a comment.

Articles