Рекомбинация в генетическом алгоритме?

Я пишу приложение с использованием генетического алгоритма, где я использую два гена человека - действительные числа (двойные, поскольку я пишу его на 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  )

Но я не очень доволен результатом, который дает мне это решение. Вроде бы дети не всегда лучше родителей, но они должны основываться на основной концепции генетического алгоритма.

Так что я был бы признателен, если бы кто-нибудь мог дать мне другую идею или подсказку.

«Кажется, что дети не всегда лучше родителей, но они должны основываться на основной концепции генетического алгоритма» - гарантия того, что потомство, созданное промежуточной рекомбинацией, определенно лучше, чем оба родителя, дается только в определенных конкретных ситуациях, например. если минимизируемая функция f: R² -> R строго квазивыпуклая и f (p1) = f (p2). В общем случае нет никакой гарантии, но в среднем есть хороший шанс, что потомство лучше.
Keiwan 27.10.2018 00:20

Когда вы так определяете своих детей, вы получаете только «среднее» из факторов, полученных от родителей. Вместо получения «лучшего» значения двух родительских факторов вы просто получаете некоторое значение между заданными значениями, в основном это (a+b)/2 с некоторыми вариациями. Если у вас есть сильная характеристика значения a у одного из родителей, вы потеряете его для следующего поколения. У вас нет конкуренции ваших генов, поэтому нет «победителя». Каковы ваши ценности x и y и как вы определяете, хороший или плохой результат? Как вы определяете «лучше» в вашем случае?

Progman 27.10.2018 00:30

@Progman x и y обозначают скорость и угол, под которым пушка стреляет по мячу. Лучше мяч, который падает ближе к центру ямы в земле. Есть ли у вас какие-либо другие предложения, как мне подойти к этому?

ivaa14 27.10.2018 09:48

@ ivaa14 На основе en.wikipedia.org/wiki/Crossover_(genetic_algorithm) вы можете использовать скорость родительского p1 и угол родительского p2 и наоборот.

Progman 27.10.2018 11:32

@Progman: да, это была моя первая идея использовать одноточечный кроссовер, но это казалось слишком простым

ivaa14 27.10.2018 11:43
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
5
141
0

Другие вопросы по теме