Решён
Как создать свою симуляцию естественного отбора?

Денис Воганов Python
7.9k
6

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

Представляю это так: есть поле, на нем еда и существа. Существа имеют гены (скорость, размер, зрение). Кто дожил до конца раунда и наел достаточно - размножается с мутациями. Кто не наел - умирает.

Знаю Python на базовом уровне (циклы, функции, классы). Pygame немного щупал.

Вопросы:

  1. Какую библиотеку использовать для визуализации?
  2. Как реализовать генетику и мутации?
  3. Нужны ли нейросети или можно проще?
Решение
56
Участник • 3 ответа

Pygame подойдет для начала, его ты уже знаешь. Для более красивой картинки потом можно перейти на Pyglet или даже PyOpenGL, но это усложнение.

Архитектура симуляции:

Каждое существо - объект класса Creature с атрибутами-генами:

class Creature:
    def __init__(self, genes=None):
        if genes:
            self.speed = genes['speed']
            self.size = genes['size']
            self.vision = genes['vision']
        else:
            self.speed = random.uniform(1, 5)
            self.size = random.uniform(5, 20)
            self.vision = random.uniform(50, 200)

        self.energy = 100
        self.x = random.randint(0, WIDTH)
        self.y = random.randint(0, HEIGHT)

    def mutate(self):
        # мутация с вероятностью 10% на каждый ген
        if random.random() < 0.1:
            self.speed += random.uniform(-0.5, 0.5)
        # аналогично для остальных

    def reproduce(self):
        child_genes = {
            'speed': self.speed,
            'size': self.size,
            'vision': self.vision
        }
        child = Creature(child_genes)
        child.mutate()
        return child

Фитнес-функция:

Не нужна явная. Само выживание и есть отбор. Кто набрал energy > 150 к концу раунда - вызываешь reproduce(). Кто ушел в ноль - удаляешь из списка.

Нейросети:

Для твоего описания не нужны. Нейросети добавляют когда хотят чтобы существа УЧИЛИСЬ принимать решения (куда идти, от кого убегать). Это NEAT алгоритм, там отдельная большая тема.

Для начала сделай простую логику: существо видит еду в радиусе vision -> идет к ближайшей. Не видит -> бродит рандомно. Этого хватит чтобы увидеть эволюцию.

Аватар Денис Воганов

Отлично, именно это и хотел услышать. Про NEAT почитаю когда базовая версия заработает.

31
Участник • 4 ответа

Посмотри проект на гитхабе "Evolution Aquarium" и "Primordial Particle System". Там исходники открыты, можно подсмотреть архитектуру. Первый на JS но логика переносится на питон один в один.

43
Участник • 5 ответов

Важный момент который многие упускают: баланс параметров.

Если скорость не имеет цены (не тратит энергию), то через 50 поколений у тебя все существа будут с максимальной скоростью. Эволюция схлопнется в одну точку.

Сделай trade-off: высокая скорость = быстрее расходуется энергия. Большой размер = больше надо есть чтобы выжить. Тогда появятся разные стратегии - быстрые охотники и медленные экономные.

28
Эксперт • 5 ответов

Если pygame будет тормозить на большом количестве существ (100+), переходи на numpy для расчетов позиций и столкновений. Визуализацию оставь на pygame, но всю математику векторизуй.

# вместо цикла по всем существам
positions = np.array([[c.x, c.y] for c in creatures])
food_pos = np.array([[f.x, f.y] for f in food])

# расстояния от каждого существа до каждой еды - одной строкой
distances = np.linalg.norm(positions[:, np.newaxis] - food_pos, axis=2)

Ускорение в 10-50 раз на тысяче объектов.

19
Эксперт • 4 ответа

делал похожее на первом курсе, только на джаве. совет: добавь логирование статистики по поколениям в csv файл. потом красивые графики в matplotlib построишь, как менялась средняя скорость/размер популяции. это самое интересное в таких проектах

15
Участник • 1 ответ

Sebastian Lague на ютубе, канал. У него целая серия про симуляции эволюции с объяснением алгоритмов. На C# но концепции универсальные.

Написать ответ

Премодерация гостей

Вы отвечаете как гость. Ваш ответ будет скрыт до проверки модератором. Чтобы ответ появился сразу и вы получали репутацию — войдите в аккаунт.

Будьте вежливы и соблюдайте правила платформы.