python 遗传算法求函数极值的实现代码


Posted in Python onFebruary 11, 2020

废话不多说,大家直接看代码吧!

"""遗传算法实现求函数极大值—Zjh"""
import numpy as np
import random
import matplotlib.pyplot as plt
class Ga():
 """求出二进制编码的长度"""
 def __init__(self):
  self.boundsbegin = -2
  self.boundsend = 3
  precision = 0.0001 # 运算精确度
  self.Bitlength = int(np.log2((self.boundsend - self.boundsbegin)/precision))+1#%染色体长度
  self.popsize = 50# 初始种群大小
  self.Generationmax = 12# 最大进化代数
  self.pcrossover = 0.90# 交叉概率
  self.pmutation = 0.2# 变异概率
  self.population=np.random.randint(0,2,size=(self.popsize,self.Bitlength))
 
 """计算出适应度"""
 def fitness(self,population):
  Fitvalue=[]
  cumsump = []
  for i in population:
   x=self.transform2to10(i)#二进制对应的十进制
   xx=self.boundsbegin + x * (self.boundsend - self.boundsbegin) / (pow(2,self.Bitlength)-1)
   s=self.targetfun(xx)
   Fitvalue.append(s)
  fsum=sum(Fitvalue)
  everypopulation=[x/fsum for x in Fitvalue]
  cumsump.append(everypopulation[0])
  everypopulation.remove(everypopulation[0])
  for j in everypopulation:
   p=cumsump[-1]+j
   cumsump.append(p)
  return Fitvalue,cumsump
 """选择两个基因,准备交叉"""
 def select(self,cumsump):
  seln=[]
  for i in range(2):
   j = 1
   r=np.random.uniform(0,1)
   prand =[x-r for x in cumsump]
   while prand[j] < 0:
    j = j + 1
   seln.append(j)
  return seln
 """交叉"""
 def crossover(self, seln, pc):
  d=self.population[seln[1]].copy()
  f=self.population[seln[0]].copy()
  r=np.random.uniform()
  if r<pc:
   print('yes')
   c=np.random.randint(1,self.Bitlength-1)
   print(c)
   a=self.population[seln[1]][c:]
   b=self.population[seln[0]][c:]
   d[c:]=b
   f[c:]=a
   print(d)
   print(f)
   g=d
   h=f
  else:
   g=self.population[seln[1]]
   h=self.population[seln[0]]
  return g,h
 """变异操作"""
 def mutation(self,scnew,pmutation):
  r=np.random.uniform(0, 1)
  if r < pmutation:
   v=np.random.randint(0,self.Bitlength)
   scnew[v]=abs(scnew[v]-1)
  else:
   scnew=scnew
  return scnew
 
 """二进制转换为十进制"""
 def transform2to10(self,population):
  #x=population[-1] #最后一位的值
  x=0
  #n=len(population)
  n=self.Bitlength
  p=population.copy()
  p=p.tolist()
  p.reverse()
  for j in range(n):
   x=x+p[j]*pow(2,j)
  return x #返回十进制的数
 """目标函数"""
 def targetfun(self,x):
  #y = x∗(np.sin(10∗(np.pi)∗x))+ 2
  y=x*(np.sin(10*np.pi*x))+2
  return y
 
if __name__ == '__main__':
 Generationmax=12
 gg=Ga()
 scnew=[]
 ymax=[]
 #print(gg.population)
 Fitvalue, cumsump=gg.fitness(gg.population)
 Generation = 1
 while Generation < Generationmax +1:
  Fitvalue, cumsump = gg.fitness(gg.population)
  for j in range(0,gg.popsize,2):
   seln = gg.select( cumsump) #返回选中的2个个体的序号
   scro = gg.crossover(seln, gg.pcrossover) #返回两条染色体
   s1=gg.mutation(scro[0],gg.pmutation)
   s2=gg.mutation(scro[1],gg.pmutation)
   scnew.append(s1)
   scnew.append(s2)
  gg.population = scnew
  Fitvalue, cumsump = gg.fitness(gg.population)
  fmax=max(Fitvalue)
  d=Fitvalue.index(fmax)
  ymax.append(fmax)
  x = gg.transform2to10(gg.population[d])
  xx = gg.boundsbegin + x * (gg.boundsend - gg.boundsbegin) / (pow(2, gg.Bitlength) - 1)
  Generation = Generation + 1
 Bestpopulation = xx
 Targetmax = gg.targetfun(xx)
 print(xx)
 print(Targetmax)
 
x=np.linspace(-2,3,30)
y=x*(np.sin(10*np.pi*x))+2
plt.scatter(2.65,4.65,c='red')
plt.xlim(0,5)
plt.ylim(0,6)
plt.plot(x,y)
plt.annotate('local max', xy=(2.7,4.8), xytext=(3.6, 5.2),arrowprops=dict(facecolor='black', shrink=0.05))
plt.show()

一个函数求极值的仿真的作业,参考了别人的matlab代码,用python复现了一遍,加深印象!

以上这篇python 遗传算法求函数极值的实现代码就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python编写的com组件发生R6034错误的原因与解决办法
Apr 01 Python
在Python的框架中为MySQL实现restful接口的教程
Apr 08 Python
Python中random模块生成随机数详解
Mar 10 Python
Python ldap实现登录实例代码
Sep 30 Python
Python中with及contextlib的用法详解
Jun 08 Python
详解Python最长公共子串和最长公共子序列的实现
Jul 07 Python
Python开发最牛逼的IDE——pycharm
Aug 01 Python
Django Admin中增加导出Excel功能过程解析
Sep 04 Python
python2.7使用scapy发送syn实例
May 05 Python
python实现批量转换图片为黑白
Jun 16 Python
如何表示python中的相对路径
Jul 08 Python
详解用selenium来下载小姐姐图片并保存
Jan 26 Python
在django中使用apscheduler 执行计划任务的实现方法
Feb 11 #Python
django在保存图像的同时压缩图像示例代码详解
Feb 11 #Python
Python中包的用法及安装
Feb 11 #Python
使用Python实现牛顿法求极值
Feb 10 #Python
关于TensorFlow新旧版本函数接口变化详解
Feb 10 #Python
TensorFlow 多元函数的极值实例
Feb 10 #Python
给 TensorFlow 变量进行赋值的方式
Feb 10 #Python
You might like
《DOTA3》开发工作已经开始 《DOTA3》将代替《DOTA2》
2021/03/06 DOTA
PHP循环遍历数组的3种方法list()、each()和while总结
2014/11/19 PHP
PHP脚本自动识别验证码查询汽车违章
2016/12/20 PHP
PHP读取Excel类文件
2017/05/15 PHP
js同时按下两个方向键
2007/12/01 Javascript
jQuery 全选效果实现代码
2009/03/23 Javascript
一个JS小玩意 几个属性相加不能超过一个特定值.
2009/09/29 Javascript
javascript控制frame,iframe的src属性代码
2009/12/31 Javascript
js清空表单数据的两种方式(遍历+reset)
2014/07/18 Javascript
JavaScript限定图片显示大小的方法
2015/03/11 Javascript
JavaScript转换与解析JSON方法实例详解
2015/11/24 Javascript
Vue.js实现无限加载与分页功能开发
2016/11/03 Javascript
bootstrap fileinput实现文件上传功能
2017/08/23 Javascript
JQuery判断radio单选框是否选中并获取值的方法
2019/01/17 jQuery
Node.js 的 GC 机制详解
2019/06/03 Javascript
javascript Canvas动态粒子连线
2020/01/01 Javascript
可拖拽组件slider.js使用方法详解
2020/12/04 Javascript
JavaScript中展开运算符及应用的实例代码
2021/01/14 Javascript
[01:21]2018DOTA2亚洲邀请赛4.5采访 打DOTA2也能有女朋友?
2018/04/06 DOTA
Python牛刀小试密码爆破
2011/02/03 Python
Python下的Mysql模块MySQLdb安装详解
2014/04/09 Python
Python用Pillow(PIL)进行简单的图像操作方法
2017/07/07 Python
Python数据类型之Number数字操作实例详解
2019/05/08 Python
python绘图模块matplotlib示例详解
2019/07/26 Python
Pytorch Tensor基本数学运算详解
2019/12/30 Python
python pptx复制指定页的ppt教程
2020/02/14 Python
python基于exchange函数发送邮件过程详解
2020/11/06 Python
HTML5制作酷炫音频播放器插件图文教程
2014/12/30 HTML / CSS
详解WebSocket跨域问题解决
2018/08/06 HTML / CSS
乐天旅游香港网站:日本饭店预订
2017/11/29 全球购物
Tea Collection官网:一家位于旧金山的童装公司
2020/08/07 全球购物
给海归自荐信的建议
2013/12/13 职场文书
社区交通安全实施方案
2014/03/22 职场文书
干部个人考察材料
2014/12/24 职场文书
廉政承诺书范文
2015/04/28 职场文书
纯html+css实现奥运五环的示例代码
2021/08/02 HTML / CSS