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实现删除Android工程中的冗余字符串
Jan 19 Python
python数字图像处理之骨架提取与分水岭算法
Apr 27 Python
Python实现绘制双柱状图并显示数值功能示例
Jun 23 Python
对numpy中二进制格式的数据存储与读取方法详解
Nov 01 Python
想学python 这5本书籍你必看!
Dec 11 Python
对python中url参数编码与解码的实例详解
Jul 25 Python
pandas DataFrame创建方法的方式
Aug 02 Python
Python+OpenCv制作证件图片生成器的操作方法
Aug 21 Python
Python enumerate内置库用法解析
Feb 24 Python
基于Python和C++实现删除链表的节点
Jul 06 Python
PyQt5多线程防卡死和多窗口用法的实现
Sep 15 Python
pycharm配置安装autopep8自动规范代码的实现
Mar 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
在Windows版的PHP中使用ADO
2006/10/09 PHP
解析PHP提交后跳转
2013/06/23 PHP
php配合jquery实现增删操作具体实例
2013/12/12 PHP
ThinkPHP实现支付宝接口功能实例
2014/12/02 PHP
php安装扩展mysqli的实现步骤及报错解决办法
2017/09/23 PHP
JavaScript是否可实现多线程  深入理解JavaScript定时机制
2009/12/22 Javascript
js制作的鼠标悬浮时产生的下拉框效果
2012/10/27 Javascript
用js将内容复制到剪贴板兼容浏览器
2014/03/18 Javascript
运用JQuery的toggle实现网页加载完成自动弹窗
2014/03/18 Javascript
浅谈Javascript如何实现匀速运动
2014/12/19 Javascript
javascript中call apply 与 bind方法详解
2016/03/10 Javascript
nodeJs爬虫获取数据简单实现代码
2016/03/29 NodeJs
Bootstrap table两种分页示例
2016/12/23 Javascript
获取当前按钮或者html的ID名称实例(推荐)
2017/06/23 Javascript
微信小程序 腾讯地图SDK 获取当前地址实现解析
2019/08/12 Javascript
node.js中stream流中可读流和可写流的实现与使用方法实例分析
2020/02/13 Javascript
javaScript 实现重复输出给定的字符串的常用方法小结
2020/02/20 Javascript
在Python的setuptools框架下生成egg的教程
2015/04/13 Python
用Python写冒泡排序代码
2016/04/12 Python
关于python2 csv写入空白行的问题
2018/06/22 Python
Python线程下使用锁的技巧分享
2018/09/13 Python
Python3 实现减少可调用对象的参数个数
2019/12/20 Python
Python StringIO及BytesIO包使用方法解析
2020/06/15 Python
python输出国际象棋棋盘的实例分享
2020/11/26 Python
python实现定时发送邮件
2020/12/23 Python
HTML5文档结构标签
2017/04/21 HTML / CSS
英国在线女鞋目的地:SIMMI
2018/12/27 全球购物
西班牙购买隐形眼镜、眼镜和太阳镜网站:Lentiamo.es
2020/06/11 全球购物
英国珠宝和手表专家:Pleasance & Harper
2020/10/21 全球购物
工程力学硕士生的自我评价范文
2013/11/16 职场文书
大学系主任推荐信范文
2013/12/24 职场文书
开办饭店创业计划书
2013/12/28 职场文书
小学教师自我评价
2015/03/04 职场文书
2019七夕节祝福语36句,快来收藏吧
2019/08/06 职场文书
Python编程super应用场景及示例解析
2021/10/05 Python
Go调用Rust方法及外部函数接口前置
2022/06/14 Golang