Различные формы генетического алгоритма - PullRequest
0 голосов
/ 01 июня 2018

Я написал код, который реализует простой генетический алгоритм для максимизации:

f(x) = 15x - x^2

Функция имеет максимум в 7,5, поэтому вывод кода должен быть 7 или 8, поскольку совокупность - целые числа.Когда я запускаю код 10 раз, я получаю 7 или 8 примерно три раза из 10. Какую модификацию я должен сделать для дальнейшего улучшения алгоритма и каковы различные типы генетических алгоритмов?

Вот код:

from random import *
import numpy as np

#fitness function
def fit(x):
    return 15*x -x**2
#covert binary list to decimal number
def to_dec(x):
    return int("".join(str(e) for e in x), 2)

#picks pairs from the original population
def gen_pairs(populationl, prob):
    pairsl = []
    test = [0, 1, 2, 3, 4, 5]
    for i in range(3):
        pair = []
        for j in range(2):
            temp = np.random.choice(test, p=prob)
            pair.append(populationl[temp].copy())
        pairsl.append(pair)

    return pairsl

#mating function
def cross_over(prs, mp):
    new = []
    for pr in prs:
        if mp[prs.index(pr)] == 1:
            index = np.random.choice([1,2,3], p=[1/3, 1/3, 1/3])
            pr[0][:index], pr[1][:index] = pr[1][:index], pr[0][:index]

    for pr in prs:
        new.append(pr[0])
        new.append(pr[1])

    return new


#mutation
def mutation(x):
    for chromosome in x:
        for gene in chromosome:
            mutation_prob = np.random.choice([0, 1], p=[0.999, .001])
            if mutation_prob == 1:
                #m_index = np.random.choice([0,1,2,3])
                if gene == 0:
                    gene = 1
                else:
                    gene = 0
    #generate initial population
    randlist = lambda n:[randint(0,1) for b in range(1, n+1)]

for j in range(10):
    population = [randlist(4) for i in range(6)]
    for _ in range(20):
        fittness = [fit(to_dec(y)) for y in population]

        s = sum(fittness)
        prob = [e/s for e in fittness]
        pairsg = gen_pairs(population.copy(), prob)

        mating_prob = []
        for i in pairsg:
            mating_prob.append(np.random.choice([0,1], p=[0.4,0.6]))

        new_population = cross_over(pairsg, mating_prob)
        mutated = mutation(new_population)
        decimal_p = [to_dec(i)for i in population]
        decimal_new = [to_dec(i)for i in new_population]
        # print(decimal_p)
        # print(decimal_new)
        population = new_population
    print(decimal_new)

1 Ответ

0 голосов
/ 02 июня 2018

Это очень типичная ситуация с эволюционными алгоритмами.Показатель успешности является довольно распространенным показателем, и 30% - достойный результат.

Просто в качестве примера, недавно я реализовал GP / GE solver для проблемы Санта-Фе Trail , и это демонстрирует уровень успеха 30% или менее.

Как улучшить показатель успеха

Далее следует личная интерпретация проблемы, основанная на ограниченном опыте.

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

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

Кстати, вот очень приятная интерактивная демонстрация поиска новинок против поиска фитнеса: http://eplex.cs.ucf.edu/noveltysearch/userspage/demo.html

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