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