1 #遗传算法特征: 自由空间, 定长编码

2 #选择: 择优选择

3 #交叉: 全空间可遍历

4 #变异: 增强全空间的搜索能力

5

6 importnumpy7 importmatplotlib.pyplot as plt8

9 #目标函数1

10 defmyfunc1(x):11 return (x ** 2 - 5 * x) * numpy.sin(x ** 2) * -1

12

13 #目标函数2

14 #def myfunc2(x1, x2):

15 #return (1 - x1) ** 2 + 100 * (x2 - x1 ** 2) ** 2

16

17

18 #遗传算法: 选择, 交叉, 变异

19 classGA(object):20

21 def __init__(self, func, lbounds, ubounds, population_size=300, maxIter=500, pm=0.01, speed=3, cf=0.1):22 self.func = func #目标函数

23 self.lbounds = lbounds #搜寻下界

24 self.ubounds = ubounds #搜寻上界

25 self.population_size = population_size #种群规模

26 self.maxIter = maxIter #最大迭代次数

27 self.pm = pm #变异概率(0, 1)

28 self.speed=speed #种群收敛速度[1, +∞)

29 self.cf = cf #交叉因子(0, 1)

30

31 self.size = len(lbounds) #搜索空间的维度

32 self.best_chrom_fitness = list() #最优染色体(染色体, 适应度)迭代记录列表

33 self.__record_fitness = list() #种群适应度迭代记录列表

34

35 defsolve(self):36 #种群随机初始化

37 population = self.__init_population()38 #记录种群最优染色体信息

39 self.__add_best(population)40

41 for i inrange(self.maxIter):42 #种群更新

43 population = self.__selection(population)44 population = self.__crossover(population)45 population = self.__mutation(population)46

47 #上一代最优个体无条件保留至下一代

48 population[0] = self.best_chrom_fitness[-1][0]49 #记录种群最优个体

50 self.__add_best(population)51

52 self.solution = self.best_chrom_fitness[-1]53

54 #选择: 轮盘赌方法

55 def __selection(self, population):56 #适应度排序

57 fitness = self.__cal_fitness(population)58 new_fitness = sorted(list((ele, idx) for idx, ele in enumerate(fitness)), key=lambda item: item[0], reverse=True)59 #轮盘区间计算 -> 采用多项式函数对收敛速度进行调整

60 roulette_interval = self.__cal_interval()61 #随机飞镖排序

62 random_dart =sorted(numpy.random.random(self.population_size))63

64 new_population =list()65 idx_interval = idx_dart =066 while idx_dart <67 if random_dart>roulette_interval[idx_interval]:68 idx_interval += 167>

69 else:70 new_population.append(population[new_fitness[idx_interval][1]])71 idx_dart += 1

72

73 #顺序打乱

74 numpy.random.shuffle(new_population)75 returnnew_population76

77 #交叉: 对称凸组合

78 def __crossover(self, population):79 #交叉随机数 -> 采用交叉因子提高计算精度

80 alpha = numpy.random.random(self.population_size - 1) *self.cf81

82 for idx in range(self.population_size - 1):83 new_chrom1 = alpha[idx] * population[idx] + (1 - alpha[idx]) * population[idx + 1]84 new_chrom2 = alpha[idx] * population[idx + 1] + (1 - alpha[idx]) *population[idx]85 population[idx] =new_chrom186 population[idx + 1] =new_chrom287

88 returnpopulation89

90 #变异: 全空间变异

91 def __mutation(self, population):92 #变异概率随机数

93 mutation_prob =numpy.random.random(self.population_size)94

95 for idx, prob inenumerate(mutation_prob):96 if prob <=self.pm:97 #变异幅度随机数

98 mutation_amplitude = numpy.random.uniform(-1, 1, self.size)99 for idx_dim, ampli inenumerate(mutation_amplitude):100 if ampli >= 0: #正向变异

101 population[idx][idx_dim] += ampli * (self.ubounds[idx_dim] -population[idx][idx_dim])102 else: #负向变异

103 population[idx][idx_dim] += ampli * (population[idx][idx_dim] -self.lbounds[idx_dim])104

105 returnpopulation106

107 #种群随机初始化

108 def __init_population(self):109 population =list()110

111 for i inrange(self.population_size):112 chrom =list()113 for j inrange(self.size):114 chrom.append(numpy.random.uniform(self.lbounds[j], self.ubounds[j]))115 population.append(numpy.array(chrom))116

117 returnpopulation118

119 #种群适应度计算

120 def __cal_fitness(self, population):121 fitness = list(self.func(*chrom) for chrom inpopulation)122 returnfitness123

124 #记录种群最优染色体信息

125 def __add_best(self, population):126 fitness = self.__cal_fitness(population)127 self.__record_fitness.append(fitness)128 min_idx =numpy.argmin(fitness)129 self.best_chrom_fitness.append((population[min_idx], fitness[min_idx]))130

131 #轮盘区间计算

132 def __cal_interval(self, speed=2):133 tmp = (numpy.arange(self.population_size) + 1) /self.population_size134 tmp_normalize = tmp / (self.population_size + 1) * 2

135

136 roulette_interval =list()137 curr_sum =0138 for item intmp_normalize:139 curr_sum +=item140 roulette_interval.append(curr_sum)141

142 roulette_interval = numpy.array(roulette_interval) **self.speed143 returnroulette_interval144

145 #求解过程可视化展示

146 defdisplay(self):147 fig = plt.figure(figsize=(8, 5))148 axes =plt.subplot()149 axes.plot(self.__record_fitness, 'g.')150 axes.plot(numpy.array(self.__record_fitness).sum(axis=1) / self.population_size, 'r-', label='$meanVal$')151 axes.set(xlim=(-1, self.maxIter+1), xlabel='$iterCnt$', ylabel='$fitness$')152 axes.set(title = 'solution = {}'.format(self.solution))153 axes.legend()154 fig.savefig('myGA.png', dpi=500)155 plt.show()156 plt.close()157

158

159 if __name__ == '__main__':160 ins = GA(myfunc1, [-9], [5], population_size=100, maxIter=1000, pm=0.01, speed=1, cf=0.1)161 #ins = GA(myfunc2, [-10, -10], [10, 10], population_size=100, maxIter=500, pm=0.3, speed=1, cf=0.1)

162 ins.solve()163 ins.display()

python 遗传算法书籍推荐_遗传算法(1) - Python实现相关推荐

  1. python国内书籍推荐_这些都是Python官方推荐的最好的书籍

    转行学Python有前途吗?这个答案是肯定的,AI课程都已经进入小学教材了,未来Python趋势无疑是光明的,但是如何学习Python,很多Python小白都来问小编有什么适合的Python入门书籍推 ...

  2. 新手学python书籍推荐_新手学python看哪本书

    对于零基础入门的人来说,对于Python的学习还是有点懵懵懂懂的,如果有一些书籍先看看来引导,学起来难度也会减低很多!所以,学python倒是向大家推荐这些书籍! 1.<PYTHON基础教程(第 ...

  3. python高分书籍推荐_如果只能推荐一本 Python 书,我一定 Pick 它

    前段时间,我偶然看到了一条推特: <流畅的Python>一书的作者发布了一条激动人心的消息:他正在写作第二版! 如果要票选最佳的 Python 进阶类书目,这本书肯定会是得票率最高的书籍之 ...

  4. python高分书籍推荐_如果只推荐一本 Python 书,我要 Pick 它!

    今年二月初,我偶然看到了一条推特: <流畅的Python>一书的作者发布了一条激动人心的消息:他正在写作第二版! 如果要票选最佳的 Python 进阶类书目,这本书肯定会是得票率最高的书籍 ...

  5. python国内书籍推荐_久等了,你要的 Python 书籍推荐,来了!

    前言 时不时有小伙伴私信问我有什么好一些的 Python 书籍推荐,想要学习学习. 那么今天就来给大伙说道说道,我会划分为以下几个分类,让不同阶段的朋友可以根据自身的情况,选择适合自己当下学习的 Py ...

  6. python高分书籍推荐_史上最全的Python书排行榜|你想知道的都在这里

    原标题:史上最全的Python书排行榜|你想知道的都在这里 感谢关注天善智能,走好数据之路↑↑↑ 欢迎关注天善智能,我们是专注于商业智能BI,大数据,数据分析领域的垂直社区,学习,问答.求职一站式搞定 ...

  7. python软件测试书籍推荐_自学软件测试看什么书入门比较好呢?

    截止到2019年10月底,本回答已经更新3126字,分不同阶段推荐了13本经典书籍,关注我,持续更新! ----------///分割线///---------- 原回答: 书不在多,关键是精! 入门 ...

  8. python统计学书籍推荐_推荐 | 统计数据分析挖掘书单呈现

    给大家推荐一些统计.分析.挖掘书籍,推荐语包括购买地址后面慢慢在补充.大家有好的书籍也可以推荐,持续连载中..封面这个本书也非常给力,31位作者合力写的,到时候也给大家推荐下. 统计学 <看穿一 ...

  9. python统计学书籍推荐_一位90后统计学硕士的深悟:统计其实有门道!AI还能这样学!(精荐40本书+20视频资源...

    答:曾经,在经管之家有三个帖子刷新了我的计量观,了解到光明学术下计量实证的"潜规则".所以,在这介绍的是"黑科技","正义凛然"的看客请绕行 ...

  10. python自学书籍推荐豆瓣-想学python,请问有没好的书籍推荐?

    很多人在问,学习Python读什么书,这其实是一个非常通用的问题,学习分为三种方式:看书.上课.培训,而读书学习是最实惠也是最高效的一种,下面我们推荐6本高分书籍给大家,希望大家学习愉快: 1.Pyt ...

最新文章

  1. 模拟实现请求分页虚存页面替换算法_模拟卷二解答
  2. linux的变量用法
  3. c# webrequest 自动登入网站
  4. 关于量子计算机 (3)
  5. 【学习笔记】7、标准数据类型—字符串
  6. es6 语法 (Decorator)
  7. ubuntu编译mysql源码
  8. php无限次执行函数,php-PHP一个方法根据传递值怎么执行多次?
  9. 全国计算机基础知识考试题型,盘点 | 全国计算机等级考试一般考哪些内容?
  10. 什么,容器太多操作不过来?我选择Docker Compose梭哈
  11. init是一个自定义方法名
  12. centos6.5 yum安装php5.5,mysql5.5.46 ,aphche 2.2.15
  13. C++fseek函数
  14. 1110_win10专业版官方原版镜像64位
  15. 世界芯中国芯RISC-V相关资源及进展
  16. 比特率和波特率的关系
  17. fastadmin 多表关联查询
  18. 笔记本电脑计算机里面怎么管理,笔记本电脑如何分区,详细教您笔记本电脑怎么分区...
  19. Joint Extraction of Entities and Relations Based on a Novel Tagging Scheme阅读总结
  20. Xposed获取微信个人信息

热门文章

  1. AMD and CMD are dead之KMDjs内核之依赖分析
  2. [轉]让PHP支持像jQuery那样的链式操作
  3. SpringBoot自动装配原理与自己写一个starter
  4. excel、doc等office文件转pdf方法总结
  5. Docker入门之运行原理及常用命令
  6. JavaScript 大小转化B KB MB GB等的转化
  7. 【前端基础进阶】JS原型、原型链、对象详解
  8. 中国金融出版社出版的2016版《综合》
  9. zepto在整个屏幕中左滑动右滑动
  10. 情人节那点事,Power BI告诉你