前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >遗传算法helloworld级别的python实现(结果可视化)

遗传算法helloworld级别的python实现(结果可视化)

作者头像
kalifa_lau
发布2019-04-01 11:16:00
1K0
发布2019-04-01 11:16:00
举报
文章被收录于专栏:kalifaの日々
问题描述:

用遗传算法求使得F(X)最大的X,问题来源:莫烦的python教程之遗传算法

最终效果:

population进化的过程.gif

代码语言:javascript
复制
import numpy as np
import matplotlib.pyplot as plt


DNA_SIZE = 10
POP_SIZE = 100
CROSS_RATE = 0.8
N_GENERATIONS = 400
X_BOUND = [0,5]
MUTATE_RATE = 0.003

def F(x) : return np.sin(10*x)*x + 2*np.cos(x)

def translateDNA(pop):
    return pop.dot(2  ** np.arange(DNA_SIZE)[::-1]) /  float(2**DNA_SIZE-1) * X_BOUND[1]


def mutate(child):
    for point in range(DNA_SIZE):
        if np.random.rand() < MUTATE_RATE :
            #注意三目运算符的写法
        
            child[point] = 0 if child[point] == 1 else 1
    return child

def crossover(parent,pop):
    if np.random.rand()<CROSS_RATE:
        #选一个随机下标
        index =np.random.randint(0,POP_SIZE,size=1)
        cross_points = np.random.randint(0,2,size=DNA_SIZE).astype(np.bool)
        parent[cross_points] = pop[index,cross_points]
    return parent
    
def select(pop,fitness):
    idx = np.random.choice(np.arange(POP_SIZE),size = POP_SIZE,replace = True,p=fitness / fitness.sum())
    return pop[idx]    

def getFitness(pred):
    return pred - np.min(pred) + 1e-3

pop = np.random.randint(0,2,(1,DNA_SIZE)).repeat(POP_SIZE,axis=0)

plt.ion()       # something about plotting
x = np.linspace(*X_BOUND, 200)
plt.plot(x, F(x))

for _ in range(N_GENERATIONS):
    F_values = F(translateDNA(pop))
    
    
    if 'sca' in globals(): sca.remove()
    sca = plt.scatter(translateDNA(pop), F_values, s=200, lw=0, c='red', alpha=0.5); plt.pause(0.1)
    
    fitness = getFitness(F_values)
    print("Most fitted DNA: ", pop[np.argmax(fitness), :])
    print("current pop size is : ",len(pop))
    
    
    pop = select(pop,fitness)
    pop_copy = pop.copy()
    for parent in pop:
        child = crossover(parent,pop)
        child = mutate(child)
        #表示parent从头到尾用child赋值
        parent[:] = child
plt.ioff(); plt.show()
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.03.28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题描述:
  • 最终效果:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档