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抓取京东价格分析京东商品价格走势
Jan 09 Python
在Python中处理列表之reverse()方法的使用教程
May 21 Python
Python 闭包的使用方法
Sep 07 Python
PyQt5打开文件对话框QFileDialog实例代码
Feb 07 Python
python保存二维数组到txt文件中的方法
Nov 15 Python
python解析xml简单示例
Jun 21 Python
关于 Python opencv 使用中的 ValueError: too many values to unpack
Jun 28 Python
如何基于Python实现电子邮件的发送
Dec 16 Python
在django中使用post方法时,需要增加csrftoken的例子
Mar 13 Python
python使用matplotlib绘制折线图的示例代码
Sep 22 Python
如何利用pycharm进行代码更新比较
Nov 04 Python
python爬虫智能翻页批量下载文件的实例详解
Feb 02 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
谈谈新手如何学习PHP
2006/12/23 PHP
php中DOMElement操作xml文档实例演示
2013/03/26 PHP
PHPStorm+XDebug进行调试图文教程
2016/06/13 PHP
php版微信发红包接口用法示例
2016/09/23 PHP
PHP实现的链式队列结构示例
2017/09/15 PHP
PHP中的访问修饰符简单比较
2019/02/02 PHP
PHP面向对象程序设计中的self、static、parent关键字用法分析
2019/08/14 PHP
mac pecl 安装php7.1扩展教程
2019/10/17 PHP
javascript开发技术大全-第3章 js数据类型
2011/07/03 Javascript
jQuery ui插件的使用方法代码实例
2013/05/08 Javascript
兼容IE和FF的图片上传前预览js代码
2013/05/28 Javascript
js模仿windows桌面图标排列算法具体实现(附图)
2013/06/16 Javascript
js中的push和join方法使用介绍
2013/10/08 Javascript
javascript中apply和call方法的作用及区别说明
2014/02/14 Javascript
关于JavaScript命名空间的一些心得
2014/06/07 Javascript
jquery通过load获取文件的内容并跳到锚点的方法
2015/01/29 Javascript
javascript实现链接单选效果的方法
2015/05/13 Javascript
Jquery Ajax Error 调试错误的技巧
2015/11/20 Javascript
ThinkPHP+jquery实现“加载更多”功能代码
2017/03/11 Javascript
VUE使用vuex解决模块间传值问题的方法
2017/06/01 Javascript
分分钟学会vue中vuex的应用(入门教程)
2017/09/14 Javascript
浅谈Webpack 持久化缓存实践
2018/03/22 Javascript
原生JS+HTML5实现跟随鼠标一起流动的粒子动画效果
2018/05/03 Javascript
解决Mac node版本升级失败的问题
2018/05/16 Javascript
Javascript读写cookie的实例源码
2019/03/16 Javascript
vue路由拦截器和请求拦截器知识点总结
2019/11/08 Javascript
解决vue-router 切换tab标签关闭时缓存问题
2020/07/22 Javascript
python的socket编程入门
2018/01/29 Python
jupyter 中文乱码设置编码格式 避免控制台输出的解决
2020/04/20 Python
python和c语言哪个更适合初学者
2020/06/22 Python
人事助理岗位职责
2013/11/18 职场文书
大学生个人实习的自我评价
2014/02/15 职场文书
会计专业毕业生求职信
2014/07/04 职场文书
婚庆司仪开场白
2015/05/29 职场文书
2016基督教会圣诞节开幕词
2016/03/04 职场文书
CSS实现单选折叠菜单功能
2021/11/01 HTML / CSS