展开全部

一、遗传算e68a84e8a2ad3231313335323631343130323136353331333363386232法介绍

遗传算法是通过模拟大自然中生物进化的历程,来解决问题的。大自然中一个种群经历过若干代的自然选择后,剩下的种群必定是适应环境的。把一个问题所有的解看做一个种群,经历过若干次的自然选择以后,剩下的解中是有问题的最优解的。当然,只能说有最优解的概率很大。这里,我们用遗传算法求一个函数的最大值。

f(x) = 10 * sin( 5x ) + 7 * cos( 4x ), 0 <= x <= 10

1、将自变量x进行编码

取基因片段的长度为10, 则10位二进制位可以表示的范围是0到1023。基因与自变量转变的公式是x = b2d(individual) * 10 / 1023。构造初始的种群pop。每个个体的基因初始值是[0, 1, 0, 1, 0, 1, 0, 1, 0, 1]

2、计算目标函数值

根据自变量与基因的转化关系式,求出每个个体的基因对应的自变量,然后将自变量代入函数f(x),求出每个个体的目标函数值。

3、适应度函数

适应度函数是用来评估个体适应环境的能力,是进行自然选择的依据。本题的适应度函数直接将目标函数值中的负值变成0. 因为我们求的是最大值,所以要使目标函数值是负数的个体不适应环境,使其繁殖后代的能力为0.适应度函数的作用将在自然选择中体现。

4、自然选择

自然选择的思想不再赘述,操作使用轮盘赌算法。其具体步骤:

假设种群中共5个个体,适应度函数计算出来的个体适应性列表是fitvalue = [1 ,3, 0, 2, 4] ,totalvalue = 10 , 如果将fitvalue画到圆盘上,值的大小表示在圆盘上的面积。在转动轮盘的过程中,单个模块的面积越大则被选中的概率越大。选择的方法是将fitvalue转化为[1 , 4 ,4 , 6 ,10], fitvalue / totalvalue = [0.1 , 0.4 , 0.4 , 0.6 , 1.0] . 然后产生5个0-1之间的随机数,将随机数从小到大排序,假如是[0.05 , 0.2 , 0.7 , 0.8 ,0.9],则将0号个体、1号个体、4号个体、4号个体、4号个体拷贝到新种群中。自然选择的结果使种群更符合条件了。

5、繁殖

假设个体a、b的基因是

a = [1, 0, 0, 0, 0, 1, 1, 1, 0, 0]

b = [0, 0, 0, 1, 1, 0, 1, 1, 1, 1]

这两个个体发生基因交换的概率pc = 0.6.如果要发生基因交换,则产生一个随机数point表示基因交换的位置,假设point = 4,则:

a = [1, 0, 0, 0, 0, 1, 1, 1, 0, 0]

b = [0, 0, 0, 1, 1, 0, 1, 1, 1, 1]

交换后为:

a = [1, 0, 0, 0, 1, 0, 1, 1, 1, 1]

b = [0, 0, 0, 1, 0, 1, 1, 1, 0, 0]

6、突变

遍历每一个个体,基因的每一位发生突变(0变为1,1变为0)的概率为0.001.突变可以增加解空间

二、代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

def b2d(b): #将二进制转化为十进制 x∈[0,10]t = 0for j in range(len(b)):t += b[j] * (math.pow(2, j))t = t * 10 / 1023return tpopsize = 50 #种群的大小#用遗传算法求函数最大值:#f(x)=10*sin(5x)+7*cos(4x) x∈[0,10]chromlength = 10 #基因片段的长度pc = 0.6 #两个个体交叉的概率pm = 0.001; #基因突变的概率results = [[]]bestindividual = []bestfit = 0fitvalue = []tempop = [[]]pop = [[0, 1, 0, 1, 0, 1, 0, 1, 0, 1] for i in range(popsize)]for i in range(100): #繁殖100代objvalue = calobjvalue(pop) #计算目标函数值fitvalue = calfitvalue(objvalue); #计算个体的适应值[bestindividual, bestfit] = best(pop, fitvalue) #选出最好的个体和最好的函数值results.append([bestfit,b2d(bestindividual)]) #每次繁殖,将最好的结果记录下来selection(pop, fitvalue) #自然选择,淘汰掉一部分适应性低的个体crossover(pop, pc) #交叉繁殖mutation(pop, pc) #基因突变results.sort()print(results[-1]) #打印函数最大值和对应的

来自CODE的代码片

GA.py

1

2

3

4

5

6

7

8

9

def best(pop, fitvalue): #找出适应函数值中最大值,和对应的个体px = len(pop)bestindividual = []bestfit = fitvalue[0]for i in range(1,px):if(fitvalue[i] > bestfit):bestfit = fitvalue[i]bestindividual = pop[i]return [bestindividual, bestfit]

来自CODE的代码片

best.py

1

2

3

4

5

6

7

8

9

10

11

def calfitvalue(objvalue):#转化为适应值,目标函数值越大越好,负值淘汰。 fitvalue = [] temp = 0.0 Cmin = 0; for i in range(len(objvalue)): if(objvalue[i] + Cmin > 0): temp = Cmin + objvalue[i] else: temp = 0.0 fitvalue.append(temp) return fitvalue

来自CODE的代码片

calfitvalue.py

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

import mathdef decodechrom(pop): #将种群的二进制基因转化为十进制(0,1023) temp = []; for i in range(len(pop)): t = 0; for j in range(10): t += pop[i][j] * (math.pow(2, j)) temp.append(t) return tempdef calobjvalue(pop): #计算目标函数值 temp1 = []; objvalue = []; temp1 = decodechrom(pop) for i in range(len(temp1)): x = temp1[i] * 10 / 1023 #(0,1023)转化为 (0,10) objvalue.append(10 * math.sin(5 * x) + 7 * math.cos(4 * x)) return objvalue #目标函数值objvalue[m] 与个体基因 pop[m] 对应

来自CODE的代码片

calobjvalue.py

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

import randomdef crossover(pop, pc): #个体间交叉,实现基因交换 poplen = len(pop) for i in range(poplen - 1): if(random.random() < pc): cpoint = random.randint(0,len(pop[0])) temp1 = [] temp2 = [] temp1.extend(pop[i][0 : cpoint]) temp1.extend(pop[i+1][cpoint : len(pop[i])]) temp2.extend(pop[i+1][0 : cpoint]) temp2.extend(pop[i][cpoint : len(pop[i])]) pop[i] = temp1 pop[i+1] = temp2

来自CODE的代码片

crossover.py

1

2

3

4

5

6

7

8

9

10

11

12

13

import randomdef mutation(pop, pm): #基因突变 px = len(pop) py = len(pop[0]) for i in range(px): if(random.random() < pm): mpoint = random.randint(0,py-1) if(pop[i][mpoint] == 1): pop[i][mpoint] = 0 else: pop[i][mpoint] = 1

来自CODE的代码片

mutation.py

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

import randomdef sum(fitvalue): total = 0 for i in range(len(fitvalue)): total += fitvalue[i] return totaldef cumsum(fitvalue): for i in range(len(fitvalue)): t = 0; j = 0; while(j <= i): t += fitvalue[j] j = j + 1 fitvalue[i] = t;def selection(pop, fitvalue): #自然选择(轮盘赌算法)newfitvalue = []totalfit = sum(fitvalue)for i in range(len(fitvalue)):newfitvalue.append(fitvalue[i] / totalfit)cumsum(newfitvalue)ms = [];poplen = len(pop)for i in range(poplen):ms.append(random.random()) #random float list msms.sort()fitin = 0newin = 0newpop = popwhile newin < poplen:if(ms[newin] < newfitvalue[fitin]):newpop[newin] = pop[fitin]newin = newin + 1else:fitin = fitin + 1pop = newpop

已赞过

已踩过<

你对这个回答的评价是?

评论

收起

python目标函数_python遗传算法目标函数怎么编相关推荐

  1. 遗传算法python实现_Python遗传算法代码实例讲解

    目录 实例: 求解函数的最大值y=xsin(10x)+xsin(2x),自变量取值:0--5,用Python画出的图像如下 (注:此代码好像有一些感觉不对的地方,首先:没有保留那些适应度低的个体 po ...

  2. python画代码-Python教程_Python画Mandelbrot集 代码

    Python教程_Python画Mandelbrot集 代码 作者:Comet 来源: 课课家 www.kokojia.com点击数:278发布时间:2015-06-19 11:17:19 曼德勃罗集 ...

  3. Python 下JSON的两种编解码方式实例解析

    概念 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写.在日常的工作中,应用范围极其广泛.这里就介绍python下它的两种编解码方法: 使 ...

  4. python遗传算法_带有Python的AI –遗传算法

    python遗传算法 带有Python的AI –遗传算法 (AI with Python – Genetic Algorithms) This chapter discusses Genetic Al ...

  5. python 渗透率_python达

    很久没有挖一个坑转身离去之后,坑边的群众久久驻足不愿离去,不停的冲着黑漆漆的坑底喊话「啥时回来啊~~」.行走江湖,讲究一个信字.Python这一篇,来了. 我和 Python 我接触 Python并不 ...

  6. c语言实现爬虫功能,用C/C 扩展Python语言_python 调用c语言 python实现简单爬虫功能_python实现简单爬虫...

    用C/C 扩展Python语言 Python是一门功能强大的脚本语言,它的强大不仅表现在功能上,还表现在其扩展性上.她提供大量的API以方便程序员利用C/C++对Python进行扩展.因为执行速度慢几 ...

  7. python矩阵计算_python计算矩阵

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 鉴于最近复习线性代数计算量较大,且1800答案常常忽略一些逆阵.行列式的计算答案 ...

  8. python分布_python 伯努利分布详解

    伯努利分布 是一种离散分布,有两种可能的结果.1表示成功,出现的概率为p(其中0 概率分布有两种类型:离散(discrete)概率分布和连续(continuous)概率分布. 离散概率分布也称为概率质 ...

  9. python编程语言_python编程语言的简要历史

    python编程语言 The Python programming language is a general-purpose programming language that has carved ...

  10. 2019最新Python学习教程(Python视频教程_Python学习教程_Python学习路线):你心目中编程界的MVP是谁?

    2019最新Python学习教程(Python视频教程_Python学习教程_Python学习路线):你心目中编程界的MVP是谁?编程界的王者是渐落寞的Java还是大火的Python? 是不是你们也喜 ...

最新文章

  1. 最新版本的Silverlight Tools For Silverlight 2 RTW正式版
  2. 本地目录+Eclipse+Webstorm当SVN配置库服务器更换-客户端设置方式
  3. python格式文件大小_在Python中调整NVSS FITS格式文件的大小并对其进行操作
  4. java多维数组的指针_Java基础之二维数组
  5. Linux 服务器集群系统实现方案详解
  6. 通过案例对SparkStreaming透彻理解-3
  7. usb serial port 驱动_tty初探 — uart驱动框架分析
  8. 小米笔试题:无序数组中最小的k个数
  9. 智慧医疗实现信息多跑人少跑
  10. 跨浏览器(IE/FF/OPERA)JS代码小结
  11. 【Django 2021年最新版教程36】 python django runserver 后台运行
  12. 高等数学 下册 第九章 偏导数 笔记
  13. c语言词法分析程序实验报告,词法分析器实验报告
  14. c语言字符串把小写转换大写字母,C语言把一个字符串里所有的大写字母换成小写字母,小写字母换成大写字母.其他字符保持...
  15. Mac 清理垃圾工具 Clean My Mac破解版
  16. 程序员如何才能写出一篇好的技术文章
  17. 机器学习之中文处理:文言文还是白话文
  18. 安装Nvidia显卡驱动和CUDA
  19. python绘图坐横坐标轴显示
  20. 大数据促进移动社交电商发展

热门文章

  1. XPS数据分析问题收集及解答
  2. 第五课 基本数据类型
  3. 怎样把ue4官方文档下载下来_ue4官方文档下载及翻译
  4. php 删除前后空格,php怎么去除前面空格
  5. 单片机计算机课程设计报告,单片机课程设计报告(简易计算机).doc
  6. MATLABr2006a序列号
  7. Delphi基础教程图文版之数组
  8. 细述 wxWindows
  9. flv 视频 文件 下载
  10. 单片机C 语言程序设计教程,基于51单片机的C语言程序设计教程.doc