1

У меня есть простой генетический алгоритм, который должен достичь оптимальной точки функции ловушки, которая определяется следующим образом:Генетический алгоритм

def R(x): 
    n = len(x) 
    m = int(math.ceil(n/3)) 
    s = sum(x) 

    if (s==n): 
     return 2*n*n, 
    elif (s<(n-m)): 
     return n*s-B(x), 
    else: 
     return 0, 

def B(x): 
    i = 0 
    n = len(x) 
    mbs = 0 

    # loops over all the variables 
    while (i<n): 

     k = i 
     while (k<n and x[k]==0): 
      k = k + 1 

     #print("k="+str(k)) 

     j = k 
     while (j<n and x[j]==1): 
      j = j + 1 

     if (j-k>mbs): 
      mbs = j-k 

     #print("j="+str(j)) 

     i = j 

    return mbs 

Я думал, чтобы увеличить намного размер поп и «надежда» генерировать с random.seed() оптимальным индивидуумом в первом поколении, а затем просто распространять количество его копий. Для этого я просто рассмотрю выбор турнира с «большим» окном для турнира.

Это решение работает только с 5 и 10 атрибутами, но не работает с 30. Дело в том, что я не знаю, как решить случай с 30 атрибутами. Надеясь, что кто-то может мне помочь.

+0

Несколько вещей, которые могли бы помочь прояснить ваш вопрос здесь. 1. Не могли бы вы описать, что такое x? Это похоже на массив целых чисел для меня, основываясь на том, как вы его используете, правильно ли? 2. Что такое B (x)? 3. Если вы надеетесь создать оптимального человека в одном поколении, почему вы пытаетесь использовать генетический алгоритм? Это поражает точку использования генетического алгоритма в первую очередь –

+0

Я обновляю сообщение с помощью определения B (x). Человек является вектором двоичных генов. Оптимальное решение дается всеми, но функция пригодности позволяет GA идти в таком направлении, только если вектор как минимум 2/3 значений, равных единице. В противном случае это приведет вас к локальной оптимальной точке.Я не знаю, как избежать такого локального оптимального. – LeoCella

ответ

1

Функции ловушки и тому подобное являются просто проблемой для GA.

Возможным обходным решением может быть использование многоцелевого эволюционного алгоритма (МЭА), например. NSGA-II, и добавить вторую цель, которая была бы «уникальностью» человека, например. среднее расстояние от других людей в популяции или а. Это заставит (вид) эволюцию исследовать другие области поискового пространства.

Посмотрите на novelty search. Речь идет о полном отказе от цели (для эволюции, но вы все еще используете ее, чтобы найти лучшее решение) и используя только «уникальность» (называемую) новинкой, чтобы вести поиск.

+0

Я могу использовать только простой GA с некоторой элитизмом ... теперь я пытаюсь использовать действительно большой размер населения около 10000 для каждого человека с 30 атрибутами. – LeoCella

2

я могу использовать только простую GA с некоторой элитарности ...

Учитывая это ограничение можно увеличить размер популяции без использования элитарность, но это не очень хорошо масштабируется.

Идея использования zegkljan для поиска новинок выглядит лучше и может быть выполнена без изменения поисковой системы.

Просто измените функцию приспособленности:

score(i) = (1 − ρ) · fit(i) + ρ · nov(i) 

fit(i) ваша R функция нормирована:

fit(i) = (R(i) - Rmin)/(Rmax - Rmin) 

и nov(i) нормированная новизна функции (вы должны держать архив уже видели лиц, но это не влечет за собой изменений в «двигателе»).

ρ ∈ [0,1] контролирует относительную важность пригодности и новизны.

Для получения более подробной информации об этой технике: When Novelty is not Enough (Giuseppe Cuccu, Фаустино Гомес)

+0

Теперь я попробую! Заранее спасибо за помощь! – LeoCella

Смежные вопросы