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原始字符串(raw strings)用法实例
Oct 13 Python
Python常见异常分类与处理方法
Jun 04 Python
pyqt5自定义信号实例解析
Jan 31 Python
Python数据分析之双色球统计单个红和蓝球哪个比例高的方法
Feb 03 Python
Python合并多个Excel数据的方法
Jul 16 Python
PyCharm-错误-找不到指定文件python.exe的解决方法
Jul 01 Python
python实现图像全景拼接
Mar 27 Python
python openCV实现摄像头获取人脸图片
Aug 20 Python
利用Python实现朋友圈中的九宫格图片效果
Sep 03 Python
python定时截屏实现
Nov 02 Python
Python爬虫之爬取二手房信息
Apr 27 Python
Python基础数据类型tuple元组的概念与用法
Aug 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
教你如何快捷的使用cmd访问mysql小技巧
2014/05/26 PHP
PHP数学运算函数大汇总(经典值得收藏)
2016/04/01 PHP
Swoole4.4协程抢占式调度器详解
2019/05/23 PHP
Ext grid 添加右击菜单
2009/11/26 Javascript
一个简单的js鼠标划过切换效果
2010/06/30 Javascript
jQuery实现表格展开与折叠的方法
2015/05/04 Javascript
JS实用的动画弹出层效果实例
2015/05/05 Javascript
Javascript通过overflow控制列表闭合与展开的方法
2015/05/15 Javascript
浏览器兼容的JS写法总结
2016/04/27 Javascript
jQuery图片左右滚动代码 有左右按钮实例
2016/06/20 Javascript
jQuery获取元素父节点的方法
2016/06/21 Javascript
vue如何实现observer和watcher源码解析
2017/03/09 Javascript
Node.js中 __dirname 的使用介绍
2017/06/19 Javascript
JavaScript实现随机数生成器(去重)
2017/10/13 Javascript
jQuery实现的简单获取索引功能示例
2018/06/04 jQuery
详解性能更优越的小程序图片懒加载方式
2018/07/18 Javascript
完美解决vue 中多个echarts图表自适应的问题
2020/07/19 Javascript
Bootstrap FileInput实现图片上传功能
2021/01/28 Javascript
[04:12]第二届DOTA2亚洲邀请赛选手传记-Newbee.Sccc
2017/04/03 DOTA
Python 编码Basic Auth使用方法简单实例
2017/05/25 Python
Python信息抽取之乱码解决办法
2017/06/29 Python
Python使用selenium实现网页用户名 密码 验证码自动登录功能
2018/05/16 Python
matplotlib subplots 调整子图间矩的实例
2018/05/25 Python
Pycharm设置去除显示的波浪线方法
2018/10/28 Python
Python线程池模块ThreadPoolExecutor用法分析
2018/12/28 Python
python自动发微信监控报警
2019/09/06 Python
Python要求O(n)复杂度求无序列表中第K的大元素实例
2020/04/02 Python
python drf各类组件的用法和作用
2021/01/12 Python
W Hamond官网:始于1979年的钻石专家
2020/07/20 全球购物
应届生英语教师求职信
2013/11/05 职场文书
简单的大学生自我鉴定
2014/02/18 职场文书
付款委托书范本
2014/04/04 职场文书
城市规划应届毕业生自荐信
2014/07/04 职场文书
自愿离婚协议书范本
2014/09/13 职场文书
故意伤害辩护词
2015/05/21 职场文书
预防职务犯罪警示教育心得体会
2016/01/15 职场文书