不同形式的遗传算法

时间:2018-06-01 01:22:57

标签: python genetic-algorithm

我编写了一个实现简单遗传算法的代码来最大化:

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 :(得分:0)

这是进化算法的一种非常典型的情况。成功率是一个非常常见的指标,30%是一个不错的结果。

举个例子,最近我为GP/GE solver实施了Santa Fe Trail problem,并证明成功率为30%或更低。

如何提高成功率

根据有限的经验对问题进行个人解释。

当进化算法收敛于局部最优或陷入一个很大的高原时,它无法找到接近全局最优解的方法,并且其人口中没有足够的多样性来通过寻找更好的区域来逃避这个陷阱。 p>

您可以尝试通过增加人口规模来为您的算法提供更多样化。或者您可以查看novelty searchquality diversity等技术。

顺便说一下,这是一个非常好的新颖搜索与健身搜索的互动演示:http://eplex.cs.ucf.edu/noveltysearch/userspage/demo.html