Я не уверен, что использование битовой строки - лучшая идея, я бы предпочел представлять хотя бы веса с реальными значениями. Тем не менее, битовые строки также могут работать.
Если у вас фиксированная топология, то и кроссовер, и мутация довольно просты (при условии, что вы изменяете только веса сети):
Кроссовер: взять некоторые веса у одного родителя, остальные - у другого, можно очень легко сделать, если вы представите веса в виде массива или списка. Для получения дополнительных сведений или альтернатив см. 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
02.07.2010