进化算法(四)微生物进化算法
来源:互联网 发布:淘宝神笔我的模块 编辑:程序博客网 时间:2024/04/28 19:56
"""Visualize Microbial Genetic Algorithm to find the maximum point in a graph.Visit my tutorial website for more: https://morvanzhou.github.io/tutorials/"""import numpy as npimport matplotlib.pyplot as pltDNA_SIZE = 10 # DNA lengthPOP_SIZE = 20 # population sizeCROSS_RATE = 0.6 # mating probability (DNA crossover)MUTATION_RATE = 0.01 # mutation probabilityN_GENERATIONS = 200X_BOUND = [0, 5] # x upper and lower boundsdef F(x): return np.sin(10*x)*x + np.cos(2*x)*x # to find the maximum of this functionclass MGA(object): def __init__(self, DNA_size, DNA_bound, cross_rate, mutation_rate, pop_size): self.DNA_size = DNA_size DNA_bound[1] += 1 self.DNA_bound = DNA_bound self.cross_rate = cross_rate self.mutate_rate = mutation_rate self.pop_size = pop_size # initial DNAs for winner and loser self.pop = np.random.randint(*DNA_bound, size=(1, self.DNA_size)).repeat(pop_size, axis=0) def translateDNA(self, pop): # convert binary DNA to decimal and normalize it to a range(0, 5) return pop.dot(2 ** np.arange(self.DNA_size)[::-1]) / (2 ** self.DNA_size - 1) * X_BOUND[1] def get_fitness(self, product): return product # it is OK to use product value as fitness in here def crossover(self, loser_winner): # crossover for loser cross_idx = np.empty((self.DNA_size,)).astype(np.bool) for i in range(self.DNA_size): cross_idx[i] = True if np.random.rand() < self.cross_rate else False # crossover index loser_winner[0, cross_idx] = loser_winner[1, cross_idx] # assign winners genes to loser return loser_winner def mutate(self, loser_winner): # mutation for loser mutation_idx = np.empty((self.DNA_size,)).astype(np.bool) for i in range(self.DNA_size): mutation_idx[i] = True if np.random.rand() < self.mutate_rate else False # mutation index # flip values in mutation points loser_winner[0, mutation_idx] = ~loser_winner[0, mutation_idx].astype(np.bool) return loser_winner def evolve(self, n): # nature selection wrt pop's fitness for _ in range(n): # random pick and compare n times sub_pop_idx = np.random.choice(np.arange(0, self.pop_size), size=2, replace=False) sub_pop = self.pop[sub_pop_idx] # pick 2 from pop product = F(self.translateDNA(sub_pop)) fitness = self.get_fitness(product) loser_winner_idx = np.argsort(fitness) loser_winner = sub_pop[loser_winner_idx] # the first is loser and second is winner loser_winner = self.crossover(loser_winner) loser_winner = self.mutate(loser_winner) self.pop[sub_pop_idx] = loser_winner DNA_prod = self.translateDNA(self.pop) pred = F(DNA_prod) return DNA_prod, predplt.ion() # something about plottingx = np.linspace(*X_BOUND, 200)plt.plot(x, F(x))ga = MGA(DNA_size=DNA_SIZE, DNA_bound=[0, 1], cross_rate=CROSS_RATE, mutation_rate=MUTATION_RATE, pop_size=POP_SIZE)for _ in range(N_GENERATIONS): # 100 generations DNA_prod, pred = ga.evolve(5) # natural selection, crossover and mutation # something about plotting if 'sca' in globals(): sca.remove() sca = plt.scatter(DNA_prod, pred, s=200, lw=0, c='red', alpha=0.5); plt.pause(0.05)plt.ioff();plt.show()
阅读全文
0 0
- 进化算法(四)微生物进化算法
- 进化算法(EP)
- 进化算法
- 进化算法
- [进化算法] 进化算法之标准进化规划(EP)
- 算法笔记(XIII) 对话进化算法
- 多目标进化算法
- 差分进化算法
- 进化规划算法
- 差分进化算法
- 差分进化算法
- 差分进化算法
- 差分进化算法
- moead多目标进化算法(matlab)
- 差分进化算法(Differential Evolution)
- 进化算法之粒子群(PSO)
- 标准差分进化算法(DE)
- 差分进化算法(Differential Evolution)
- 3d动画结合路由跳转使用
- 重建二叉树
- 28. Implement strStr()
- Python中传递参数给程序
- 笔记test
- 进化算法(四)微生物进化算法
- redis在centos7下的安装以及自启动
- 判断网络
- 二叉树前序、中序、后序遍历相互求法
- SQlite数据库之安装
- Codevs 2452 扫雷
- proto和prototype联系以及原型链
- Java虚拟机结构(内存,类加载器,执行引擎)
- MySQL与Oracle的区别