Я не уверен, что если использовать цепочку битов - это лучшая идея, я бы предпочел представить хотя бы веса с реальными значениями. Тем не менее цепочки битов также могут работать.
Если у вас фиксированная топология, то и кроссовер, и мутация довольно просты (при условии, что вы только меняете вес сети):
Кроссовер: взять некоторые веса от одного родителя, остальные от другого, очень легко, если вы представите веса в виде массива или списка. Для более подробной информации или альтернатив см. http://en.wikipedia.org/wiki/Crossover_%28genetic_algorithm%29.
Мутация: просто выберите некоторые веса и немного их откорректируйте.
Развитие некоторых других вещей (например, функция активации) очень похоже на это.
Если вы также хотите развить топологию, тогда все станет намного интереснее. Есть довольно много дополнительных возможностей мутации, таких как добавление узла (скорее всего, подключенного к двум уже существующим узлам), разбиение соединения (вместо A-> B есть A-> C-> B), добавление соединения или противоположностей из них.
Но кроссовер не будет слишком простым (по крайней мере, если количество узлов не фиксировано), потому что вы, вероятно, захотите найти «совпадающие» узлы (где сопоставление может быть чем угодно, но, вероятно, связано с аналогичной «ролью» или аналогичное место в сети). Если вы тоже хотите это сделать, я настоятельно рекомендую изучить уже существующие методы. Тот, который я знаю и люблю, называется NEAT. Вы можете найти информацию об этом на
http://en.wikipedia.org/wiki/Neuroevolution_of_augmenting_topologies
http://nn.cs.utexas.edu/?neat
и http://www.cs.ucf.edu/~kstanley/neat.html