Я пишу приложение с использованием генетического алгоритма, где я использую два гена человека - действительные числа (двойные, поскольку я пишу его на Java). Поэтому мне было интересно, как лучше всего провести рекомбинацию, используя действительные числа, а не биты.
Я пробовал сделать это так:
Если бы p1 = (x1, y1) и p2 = (x2, y2) были родителями, а r было случайным числом от 0 до 1, то я бы получил таких детей:
c1 = ( r*x1 + (1-r)*x2 , r*y1 + (1-r)*y2)
c2 = ((1-r)*x1 + r*x2 , (1-r)*y1 + r*y2 )
Но я не очень доволен результатом, который дает мне это решение. Вроде бы дети не всегда лучше родителей, но они должны основываться на основной концепции генетического алгоритма.
Так что я был бы признателен, если бы кто-нибудь мог дать мне другую идею или подсказку.
Когда вы так определяете своих детей, вы получаете только «среднее» из факторов, полученных от родителей. Вместо получения «лучшего» значения двух родительских факторов вы просто получаете некоторое значение между заданными значениями, в основном это (a+b)/2 с некоторыми вариациями. Если у вас есть сильная характеристика значения a у одного из родителей, вы потеряете его для следующего поколения. У вас нет конкуренции ваших генов, поэтому нет «победителя». Каковы ваши ценности x и y и как вы определяете, хороший или плохой результат? Как вы определяете «лучше» в вашем случае?
@Progman x и y обозначают скорость и угол, под которым пушка стреляет по мячу. Лучше мяч, который падает ближе к центру ямы в земле. Есть ли у вас какие-либо другие предложения, как мне подойти к этому?
@ ivaa14 На основе en.wikipedia.org/wiki/Crossover_(genetic_algorithm) вы можете использовать скорость родительского p1 и угол родительского p2 и наоборот.
@Progman: да, это была моя первая идея использовать одноточечный кроссовер, но это казалось слишком простым



