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脚本抓取网络小说来制作自己的阅读器
Aug 20 Python
Python中easy_install 和 pip 的安装及使用
Jun 05 Python
Python输出由1,2,3,4组成的互不相同且无重复的三位数
Feb 01 Python
Python使用progressbar模块实现的显示进度条功能
May 31 Python
python使用matplotlib库生成随机漫步图
Aug 27 Python
对Python3中bytes和HexStr之间的转换详解
Dec 04 Python
Python3.5基础之变量、数据结构、条件和循环语句、break与continue语句实例详解
Apr 26 Python
解决在pycharm运行代码,调用CMD窗口的命令运行显示乱码问题
Aug 23 Python
Pandas实现一列数据分隔为两列
May 18 Python
Python学习开发之图形用户界面详解
Aug 23 Python
Python实现GIF动图以及视频卡通化详解
Dec 06 Python
Pytorch中使用ImageFolder读取数据集时忽略特定文件
Mar 23 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实现根据设备类型自动跳转相应页面的方法
2014/07/24 PHP
PHP简单处理表单输入的特殊字符的方法
2016/02/03 PHP
thinkPHP商城公告功能开发问题分析
2016/12/01 PHP
Javascript中暂停功能的实现代码
2007/03/04 Javascript
JS去除右边逗号的简单方法
2013/07/03 Javascript
JavaScript代码复用模式详解
2014/11/07 Javascript
JS交换变量的方法
2015/01/21 Javascript
zepto.js中tap事件阻止冒泡的实现方法
2015/02/12 Javascript
ichart.js绘制虚线、平均分虚线效果的实现代码
2016/05/05 Javascript
js 原型对象和原型链理解
2017/02/09 Javascript
关于jQuery中fade(),show()起始位置的一点小发现
2017/04/25 jQuery
js变量声明var使用与不使用的区别详解
2019/01/21 Javascript
原生js实现获取form表单数据代码实例
2019/03/27 Javascript
Vue中使用create-keyframe-animation与动画钩子完成复杂动画
2019/04/09 Javascript
在mpvue框架中使用Vant WeappUI组件库的注意事项【推进】
2019/06/09 Javascript
[01:14:19]NAVI vs Mineski 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
35个Python编程小技巧
2014/04/01 Python
python插入数据到列表的方法
2015/04/30 Python
Python字符串详细介绍
2015/05/09 Python
利用python实现简易版的贪吃蛇游戏(面向python小白)
2018/12/30 Python
Python面向对象之继承原理与用法案例分析
2019/12/31 Python
selenium WebDriverWait类等待机制的实现
2020/03/18 Python
Pycharm如何导入python文件及解决报错问题
2020/05/10 Python
keras打印loss对权重的导数方式
2020/06/10 Python
Python爬虫UA伪装爬取的实例讲解
2021/02/19 Python
香港唯港荟酒店预订:Hotel ICON
2018/03/27 全球购物
加拿大服装和鞋类零售商:Mark’s
2021/01/04 全球购物
招商业务员岗位职责
2013/12/16 职场文书
大专生自我评价
2014/01/28 职场文书
2014法制宣传日活动总结
2014/07/09 职场文书
学生通报表扬范文
2015/05/04 职场文书
教师研修随笔感言
2015/11/18 职场文书
怎样评估创业计划书是否有可行性?
2019/08/07 职场文书
golang 实现菜单树的生成方式
2021/04/28 Golang
为什么MySQL分页用limit会越来越慢
2021/07/25 MySQL
Go语言入门exec的基本使用
2022/05/20 Golang