Можно ли таким образом выбрать `parent`, как` gambling рулетка `? - PullRequest
0 голосов
/ 29 декабря 2018

Мне приходит в голову, что с помощью случайное число для выбора parents, как gambling roulette, может быть, можно работать. Позвольте мне объяснить это, используя пример в find the max value of function. Пример показан ниже:

  • 1. Представьте, что мы уже сгенерировали n random individual и вычислили их function value. Мы назвали индивидуума 'j' Xj, а имя его функции - f(Xj).И мы находим и называем максимальное значение-функции maxValue.
  • 2. Ясно, что fitness of individual j есть f(Xj)/maxValue. Мы можем назвать его g(Xj). И тогда мы вычислим всю пригодностьиндивидуум.
  • 3. Следующим шагом является поиск parents. (Мы отказываемся от индивидуума, у которого значения пригодности меньше 0). Классический способ - gambling roulette. Шанс выбора Xjи Xk равно g(Xj)*g(Xk)/[g(X1)+g(X2)+...+g(Xn)]^2.

Моя идея

  • 1.Выберите два случайных человека Xj и Xk
  • 2.сгенерировать случайное число rn в диапазоне 0 ~ 1.
  • 3.if rn меньше g(Xj) и g(Xk) (fitness из Xj и Xk), то они могут повторнопроизводим. Затем кроссовер и мутируем.
  • 4. судим, достаточно ли мы породили детей, если так, конец.в противном случае повторите 1-3.

Вероятность выбора Xj и Xk равна g(Xj)*g(Xk)/n^2, что аналогично gambling roulette. Учитывайте, что оба знаменателя двух случайных величин являются постоянными, они равны определенным образом.

            double randomNumToJudge=Math.random();//generate a random number to judge with the fitness 
            int randomMother=(int)(Math.random()*1000);
            int randomFather=(int)(Math.random()*1000);//random generate parents
            if((randomNumToJudge<=individualArray[generation][randomFather].fitnessValue)
            &&(randomNumToJudge<=individualArray[generation][randomMother].fitnessValue))
            //if the number is less than both fitness of parents,they are permited to reproduce.
            {
                Individual childIndividual=individualArray[generation][randomFather].crossOverAndMutate(individualArray[generation][randomFather], individualArray[generation][randomMother]);
                //Crossover and mutate and generate child individual
                individualArray[generation+1][counter]=childIndividual;//add childIndividual to tha Array.
                counter++;//the count of individual number in child generation
            }

Я проверяю этот способ в коде Java. Функция - x + 10sin(5x) + 7cos(4x), x∈[0,10). Я генерирую 100 генераций, а индивидуальное число в поколении - 1000.

Его результат верен.

В определенном исполнении, в сотом поколении, я считаю, что лучшим человеком является 7.856744175554171, а лучшим значением функции является 24.855362868957645.Я тестировал 10 раз. Каждый результат с точностью до 10 десятичных знаков в 100-м поколении.

Так можно ли это сделать? Этот способ уже был обдуман другими?

Любые комментарии приветствуются^ @ ^

PS: простите мой плохой английский -_-

1 Ответ

0 голосов
/ 29 декабря 2018

Обратите внимание, что я отредактировал этот ответ.

Начиная с пункта 2, я предполагаю, что ваша целевая пригодность равна 1. Ваш алгоритм, вероятно, никогда не будет полностью сходиться (найдите локальные минимумы).Это связано с тем, что ваш диапазон случайных значений (0 ~> 1) не меняется, даже если ваши характеристики соответствуют.

Обратите внимание, что это не означает, что лучшие значения соответствия не создаются;Они будут.Но произойдет резкое снижение скорости, с которой создаются лучшие приспособления из-за того, что вы проверяете пригодность (случайные 0 ~> 1).

Рассмотрим этот пример, где все пригодности оказались высокими:

[0.95555, 0.98888, 0.92345, 0.92366]

Здесь все значения, скорее всего, удовлетворят randomNumToJudge<=fitness.Это означает, что любые значений одинаково вероятно будут выбраны в качестве родительских.Вы не хотите этого - вы хотите, чтобы значения best имели более высокий шанс выбора.

Ваш алгоритм может быть изменен так, чтобы он сходился правильно, если вы установили для randomNumToJudge значениедиапазон (средняя пригодность в популяции ~> 1), хотя это все еще не оптимально.

Альтернативный метод

Я рекомендую реализовать классическое колесо рулетки метод.

Метод колеса рулетки назначает каждому человеку вероятность быть выбранным в качестве родителя на основании того, насколько они «подходят».По сути, чем выше приспособленность, тем больше будет занимать срез колеса, и тем выше вероятность того, что случайное число выберет эту позицию на колесе.

Пример кода Java для колеса рулеткивыбор

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...