Я написал довольно много этих общих алгоритмов, до того момента, как я создал фреймворк, чтобы избежать повторного написания того же кода.
Для пула спаривания это зависит от типа людей, которых вы ищете, от решений, которые вы ищете, и если у вас есть способ объединить людей таким образом, что у них будет больше шансов, что они будут производить лучшего человека.
Вы можете использовать случайное спаривание, но это даст вам «худшие» решения - хуже, потому что вы понятия не имеете, производят ли они лучшего человека или нет. Это все равно будет хорошим решением, и когда я начал писать эти алгоритмы, я всегда использовал случайное спаривание, но сразу после получения нового человека из двух старых я сравнивал производительность 3 и отбрасывал худшее, заканчивая 2 родителя иногда (и отбрасывание 1-го-старого ребенка), или в конечном итоге с 1 родителем и 1 ребенком.
Но если вы знаете, как объединить людей так, чтобы они дали лучшее решение (и это может быть очень сложно), вы можете использовать функцию сродства, которая принимает двух человек и возвращает сродство между ними. Трудная часть заключается в определении близости. В зависимости от проблемы, это может быть совсем иначе. Например, если я беру проблему коммивояжера, у меня есть лучшие решения, когда вы спариваете человека с меньшим сходством. Таким образом, моя функция близости возвращает 1 - сходство.
Таким образом, я мог бы уменьшить количество итераций на 80% и получить очень хорошие решения.
Но имейте в виду, что чем больше ваш пул, тем дольше будет выполняться функция близости, функции близости могут быть O (n²) или даже O (n³), в каких случаях это может быть узким местом вашего алгоритма. В этом случае лучше использовать случайное спаривание.
В заключение, случайное спаривание хорошее - в конце концов, мы можем сказать, что это работает в реальной жизни, но если вы знаете, как вычислить близость между двумя людьми, вы можете использовать его для уменьшения числа итераций вам нужно будет получить хорошее решение. Имейте в виду, что сродство к вычислению может быть очень сложным (и я даже предполагаю, что вычисление наилучших аффинностей для данного пула NP-Complete).
+1 для создания каркаса. Я сделал один в колледже, когда был влюблен в GA и написал много алгоритмов. К сожалению, у меня не было времени, чтобы продолжить его после колледжа. :( –