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 相关文章推荐
py中的目录与文件判别代码
Jul 16 Python
Python探索之SocketServer详解
Oct 28 Python
python检测空间储存剩余大小和指定文件夹内存占用的实例
Jun 11 Python
Python查找第n个子串的技巧分享
Jun 27 Python
对python中词典的values值的修改或新增KEY详解
Jan 20 Python
django之静态文件 django 2.0 在网页中显示图片的例子
Jul 28 Python
pytorch 共享参数的示例
Aug 17 Python
python生成器用法实例详解
Nov 22 Python
Python之Class&amp;Object用法详解
Dec 25 Python
tensorflow没有output结点,存储成pb文件的例子
Jan 04 Python
PyCharm+Pipenv虚拟环境开发和依赖管理的教程详解
Apr 16 Python
python源文件的字符编码知识点详解
Mar 04 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操作mysql执行数据库查询的一些常用操作汇总
2013/06/24 PHP
浅谈PHP中output_buffering
2015/07/13 PHP
js ondocumentready onmouseover onclick onmouseout 样式
2010/07/22 Javascript
解析jquery获取父窗口的元素
2013/06/26 Javascript
转义字符(\)对JavaScript中JSON.parse的影响概述
2013/07/17 Javascript
jQuery中append()方法用法实例
2015/01/08 Javascript
JS实现的简洁纵向滑动菜单(滑动门)效果
2015/10/19 Javascript
解析JavaScript面向对象概念中的Object类型与作用域
2016/05/10 Javascript
JavaScript数组实现数据结构中的队列与堆栈
2016/05/26 Javascript
JavaScript通过filereader接口读取文件
2017/05/10 Javascript
angular.js指令中的controller、compile与link函数的不同之处
2017/05/10 Javascript
Vue.js手风琴菜单组件开发实例
2017/05/16 Javascript
微信小程序 转发功能的实现
2017/08/04 Javascript
使用jQuery 操作table 完成单元格合并的实例
2017/12/27 jQuery
vue 自定义全局方法,在组件里面的使用介绍
2018/02/28 Javascript
vue 实现通过手机发送短信验证码注册功能
2018/04/19 Javascript
NodeJs项目中关闭ESLint的方法
2018/08/09 NodeJs
vue2.0$nextTick监听数据渲染完成之后的回调函数方法
2018/09/11 Javascript
解决ng-repeat产生的ng-model中取不到值的问题
2018/10/02 Javascript
vue axios重复点击取消上一次请求封装的方法
2019/06/19 Javascript
vue插槽slot的简单理解与用法实例分析
2020/03/14 Javascript
Webpack中SplitChunksPlugin 配置参数详解
2020/03/24 Javascript
Python 的 with 语句详解
2014/06/13 Python
利用Python中的mock库对Python代码进行模拟测试
2015/04/16 Python
详解在Python的Django框架中创建模板库的方法
2015/07/20 Python
利用Python为iOS10生成图标和截屏
2016/09/24 Python
Python微信库:itchat的用法详解
2017/08/14 Python
Python使用Selenium+BeautifulSoup爬取淘宝搜索页
2018/02/24 Python
Python实现的基于优先等级分配糖果问题算法示例
2018/04/25 Python
详解将Pandas中的DataFrame类型转换成Numpy中array类型的三种方法
2019/07/06 Python
使用pandas实现连续数据的离散化处理方式(分箱操作)
2019/11/22 Python
国税会议欢迎词
2014/01/16 职场文书
后备干部考察材料
2014/02/12 职场文书
个人房屋转让协议书范本
2014/10/26 职场文书
浅谈react useEffect闭包的坑
2021/06/08 Javascript
一文搞懂Golang 时间和日期相关函数
2021/12/06 Golang