Я сделал маленьких тварей, которые жили в этом маленьком мире. У них был мозг нейронной сети, который получил некоторый вклад от мира, и результат был вектором для движения среди других действий. Их мозги были "генами".
Программа началась со случайной популяции тварей со случайным мозгом. Входные и выходные нейроны были статическими, но промежуточных не было.
Окружающая среда содержала пищу и опасности. Пища увеличивает энергию, и когда у вас достаточно энергии, вы можете спариваться. Опасности уменьшат энергию, и если энергия будет равна 0, они умрут.
В конце концов существа эволюционировали, чтобы перемещаться по миру и находить пищу и избегать опасностей.
Затем я решил сделать небольшой эксперимент. Я дал мозгу существа выходной нейрон под названием «рот» и входной нейрон под названием «ухо». Начал снова и с удивлением обнаружил, что они эволюционировали, чтобы максимизировать пространство, и каждое соответствующее существо останется в своей соответствующей части (еда была размещена случайным образом). Они научились сотрудничать друг с другом и не мешали друг другу. Всегда были исключения.
Тогда я попробовал что-то интересное. Я мертвые существа стали бы едой. Попробуйте угадать, что случилось! Два типа существ эволюционировали: те, которые нападали, как в роях, и те, у которых было большое избегание.
Так какой урок здесь? Общение означает сотрудничество. Как только вы вводите элемент, где причинение вреда другому означает, что вы что-то получаете, сотрудничество разрушается.
Интересно, как это отражается на системе свободных рынков и капитализма. Я имею в виду, что если предприятия могут нанести вред своей конкуренции и сойти с рук , то ясно, что они сделают все возможное, чтобы нанести ущерб конкуренции.
Редактировать:
Я написал это на C ++ без использования фреймворков. Написал свою собственную нейронную сеть и код GA. Эрик, спасибо, что сказал, что это правдоподобно. Люди обычно не верят в силу ГА (хотя ограничения очевидны), пока они не поигрались с ней. GA прост, но не упрощен.
Для сомневающихся было доказано, что нейронные сети способны имитировать любую функцию, если они имеют более одного слоя. GA - довольно простой способ ориентироваться в пространстве решений, находя локальный и потенциально глобальный минимум. Объедините GA с нейронными сетями, и у вас есть довольно хороший способ найти функции, которые находят приблизительные решения для общих проблем. Поскольку мы используем нейронные сети, мы оптимизируем функцию для некоторых входов, а не для некоторых входов в функцию, поскольку другие используют GA
Вот демонстрационный код для примера выживания: http://www.mempko.com/darcs/neural/demos/eaters/
Инструкции по сборке:
- Установите darcs, libboost, liballegro, gcc, cmake, make
darcs clone --lazy http://www.mempko.com/darcs/neural/
cd neural
cmake .
make
cd demos/eaters
./eaters