Генетические алгоритмы учатся лучше всего соответствовать экспоненциальной функции - PullRequest
0 голосов
/ 31 августа 2018

Итак, у меня есть простая игра, в которой мяч может прыгать, и препятствия встречаются на нем обычным образом, для справки ниже. Мой генетический алгоритм обеспечивает 100 случайных сетей, 20 кроссоверов (частота мутаций 1%) и 10 «размытых» сетей (по сути, вынужденные мутации со скоростью около 20%). enter image description here Теперь, если у меня есть базовая немасштабирующая скорость движения для моих периодических препятствий, мой генетический алгоритм учится побеждать в игре (просто не проиграет и будет продолжаться вечно) примерно за 1-2 поколения, поскольку это простое отображение x-> y этого следовало ожидать.

Однако, если я решу изменить свое масштабирование скорости (для скорости прыжка / препятствия), скажу

speed = speed * (1 + points/1000) #Where 1 point is passing 1 obstacle

То, что я получаю, - это большое количество сетей, которые не могут оптимизировать вывод в любом режиме реального времени. Я обязательно передаю все зависимые данные как мои входные узлы; ball.y (так как шар не движется по оси x), mechancle.x, tactcle.speed, ball.jumpspeed, а на выходе получается один узел для 1 / прыжка, 0 / ничего не делать.

Вот пример выходных данных некоторых поколений, данных фитнесом

Generation 1    HIGH: 0.425    LOW: 0.000    AVG:0.1724547451001511
Generation 2    HIGH: 0.425    LOW: 0.165    AVG:0.17874677670683908
Generation 3    HIGH: 1.396    LOW: 0.165    AVG:0.19673599387987226
Generation 4    HIGH: 2.549    LOW: 0.165    AVG:0.2383717001862799
Generation 5    HIGH: 2.549    LOW: 0.166    AVG:0.236279356056333
Generation 6    HIGH: 2.549    LOW: 0.166    AVG:0.2173996155501196
Generation 7    HIGH: 2.549    LOW: 0.167    AVG:0.20148711858181925
Generation 8    HIGH: 2.549    LOW: 0.167    AVG:0.1985246675827307
 ...
Generation 69    HIGH: 2.549    LOW: 0.167    AVG:0.31935190938788394
Generation 70    HIGH: 2.549    LOW: 0.167    AVG:0.22603314425367058
Generation 71    HIGH: 2.549    LOW: 0.167    AVG:0.21650311863741362
Generation 72    HIGH: 2.549    LOW: 0.166    AVG:0.2258790184428012

Я понимаю, что генетические алгоритмы, по сути, полагаются на случайные улучшения, но я хотел бы знать, нормально ли для больших периодов застоя возникать по такой «простой» проблеме? Возможно, я просто прыгаю из пистолета, я написал всю сеть / игру с нуля, и я почти уверен, что она работает как есть, но я немного не убежден результатами, кто-нибудь с большим опытом в подобных вещах думает что мои результаты довольно стандартны?

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

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

Generation 83    HIGH: 2.549    LOW: 0.841    AVG:0.908536733716079
Generation 84    HIGH: 2.549    LOW: 0.839    AVG:0.9262430139422534
Generation 85    HIGH: 8.784    LOW: 0.842    AVG:0.9670151588313797

EDIT : Здесь приведена ссылка на базовую версию, размещенную на github. В загруженной мной версии, если вы прочитаете testdata.txt, вы увидите, что входные данные представляют собой двоичные строки, которые просто пытаются получить умножить на 2 как ожидаемый результат. Я не понимаю, почему в настоящее время он не в состоянии выяснить, каким должен быть точный вывод, и быть предупрежденным, что код невероятно безобразен, когда вы приступаете к реальному тестированию, все должно быть реструктурировано. https://github.com/TylerJohnson44/PyNN

Если кто-нибудь может показать мне, где мой код не является надлежащим NN с соответствующим приложенным GA, я был бы признателен.

...