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 切片和range()用法说明
Mar 24 Python
使用python删除nginx缓存文件示例(python文件操作)
Mar 26 Python
python实现多线程采集的2个代码例子
Jul 07 Python
python中正则表达式的使用方法
Feb 25 Python
用python与文件进行交互的方法
Mar 01 Python
django 修改server端口号的方法
May 14 Python
基于Python实现定时自动给微信好友发送天气预报
Oct 25 Python
python 修改本地网络配置的方法
Aug 14 Python
django中瀑布流写法实例代码
Oct 14 Python
Win10下配置tensorflow-gpu的详细教程(无VS2015/2017)
Jul 14 Python
Python析构函数__del__定义原理解析
Nov 20 Python
python 多态 协议 鸭子类型详解
Nov 27 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图片处理类(水印、等比缩放、固定高宽)分享
2015/06/19 PHP
php开发工具有哪五款
2015/11/09 PHP
数理公式,也可以这么唯美
2021/03/10 无线电
一个挺有意思的Javascript小问题说明
2011/09/26 Javascript
如何使用HTML5地理位置定位功能
2015/04/27 Javascript
D3.js中data(), enter() 和 exit()的问题详解
2015/08/17 Javascript
js实现索引图片切换效果
2015/11/21 Javascript
实例讲解jQuery EasyUI tree中state属性慎用
2016/04/01 Javascript
JavaScript中的各种操作符使用总结
2016/05/26 Javascript
jQuery中的一些常见方法小结(推荐)
2016/06/13 Javascript
JS实现pasteHTML兼容ie,firefox,chrome的方法
2016/06/22 Javascript
Javascript数组循环遍历之forEach详解
2016/11/07 Javascript
Javascript同时声明一连串(多个)变量的方法
2017/01/23 Javascript
React Native预设占位placeholder的使用
2017/09/28 Javascript
angular4 共享服务在多个组件中数据通信的示例
2018/03/30 Javascript
Vue高版本中一些新特性的使用详解
2018/09/25 Javascript
fastadmin中调用js的方法
2019/05/14 Javascript
微信小程序页面传多个参数跳转页面的实现方法
2019/05/17 Javascript
从零学Python之入门(二)基本数据类型
2014/05/25 Python
用十张图详解TensorFlow数据读取机制(附代码)
2018/02/06 Python
详解Python中is和==的区别
2019/03/21 Python
使用Python画股票的K线图的方法步骤
2019/06/28 Python
python格式化输出保留2位小数的实现方法
2019/07/02 Python
处理python中多线程与多进程中的数据共享问题
2019/07/28 Python
解决python明明pip安装成功却找不到包的问题
2019/08/28 Python
python将print输出的信息保留到日志文件中
2019/09/27 Python
Python基于pyjnius库实现访问java类
2020/07/31 Python
纯CSS3实现自定义Tooltip边框涂鸦风格的教程
2014/11/05 HTML / CSS
Electric官网:美国高级眼镜和配件品牌
2020/06/04 全球购物
情侣吵架检讨书
2014/02/05 职场文书
yy婚礼主持词
2014/03/14 职场文书
技术员岗位职责范本
2015/04/11 职场文书
2015年施工员工作总结范文
2015/04/20 职场文书
学困生转化工作总结
2015/08/13 职场文书
SQL Server删除表中的重复数据
2022/05/25 SQL Server
pandas中pd.groupby()的用法详解
2022/06/16 Python