首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >不同形式的遗传算法

不同形式的遗传算法
EN

Stack Overflow用户
提问于 2018-06-01 09:22:57
回答 1查看 68关注 0票数 1

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

代码语言:javascript
复制
f(x) = 15x - x^2

该函数在7.5时达到最大值,因此代码输出应该是7或8,因为总体是整数。当我运行代码10次时,我得到了大约7或8次,其中3次10次。我应该做什么修改来进一步改进算法,以及不同类型的遗传算法是什么?

代码如下:

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

发布于 2018-06-02 05:20:47

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

举个例子,最近我为Santa Fe Trail problem实现了一个GP/GE solver,它展示了30%或更少的成功率。

如何提高成功率

基于有限的经验,对这个问题的个人解释如下。

当进化算法收敛于局部最优解或陷入大平台时,它无法找到接近全局最优解,并且其种群中没有足够的多样性来通过找到更好的区域来摆脱这种陷阱。

您可以尝试通过增加种群大小来为您的算法提供更多的多样性。或者你可以研究像novelty searchquality diversity这样的技术。

顺便说一句,这里有一个非常好的新奇搜索与健身搜索的交互式演示:http://eplex.cs.ucf.edu/noveltysearch/userspage/demo.html

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50634857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档