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 字典(Dictionary)操作详解
Mar 11 Python
Python常用模块用法分析
Sep 08 Python
python通过yield实现数组全排列的方法
Mar 18 Python
在Python中使用SQLite的简单教程
Apr 29 Python
Python中is与==判断的区别
Mar 28 Python
Python编程实现使用线性回归预测数据
Dec 07 Python
浅谈django model postgres的json字段编码问题
Jan 05 Python
python进行文件对比的方法
Dec 24 Python
Python检测数据类型的方法总结
May 20 Python
Python调用Windows API函数编写录音机和音乐播放器功能
Jan 05 Python
keras slice layer 层实现方式
Jun 11 Python
使用qt quick-ListView仿微信好友列表和聊天列表的示例代码
Jun 13 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结合jQuery.autocomplete插件实现输入自动完成提示的功能
2015/04/27 PHP
laravel框架实现敏感词汇过滤功能示例
2020/02/15 PHP
JavaScript中void(0)的具体含义解释
2007/02/27 Javascript
用js实现上传图片前的预览(TX的面试题)
2007/08/14 Javascript
一个js封装的不错的选项卡效果代码
2008/02/15 Javascript
js日期时间补零的小例子
2013/03/05 Javascript
HTML上传控件取消选择
2013/03/06 Javascript
使用js实现雪花飘落效果
2013/08/26 Javascript
JS实现带提示的星级评分效果完整实例
2015/10/30 Javascript
JavaScript编程学习技巧汇总
2016/02/21 Javascript
深入理解jQuery之防止冒泡事件
2016/05/24 Javascript
js的各种排序算法实现(总结)
2016/07/23 Javascript
简单理解vue中Props属性
2016/10/27 Javascript
微信小程序实战之顶部导航栏(选项卡)(1)
2020/06/19 Javascript
JS中的三个循环小结
2017/06/20 Javascript
javascript 开发之网页兼容各种浏览器
2017/09/28 Javascript
Vue使用vue-area-linkage实现地址三级联动效果的示例
2018/06/27 Javascript
详解处理bootstrap4不支持远程静态框问题
2018/07/20 Javascript
JavaScript设计模式之装饰者模式实例详解
2019/01/17 Javascript
解析Python中的二进制位运算符
2015/05/13 Python
python 检查是否为中文字符串的方法
2018/12/28 Python
python远程连接MySQL数据库
2019/04/19 Python
python自动化测试之DDT数据驱动的实现代码
2019/07/23 Python
Django对接支付宝实现支付宝充值金币功能示例
2019/12/17 Python
django列表筛选功能的实现代码
2020/03/27 Python
基于python SMTP实现自动发送邮件教程解析
2020/06/02 Python
sklearn和keras的数据切分与交叉验证的实例详解
2020/06/19 Python
HTML5之SVG 2D入门8—文档结构及相关元素总结
2013/01/30 HTML / CSS
初一地理教学反思
2014/01/16 职场文书
班级德育工作实施方案
2014/02/21 职场文书
社区服务活动小结
2014/07/08 职场文书
故宫英文导游词
2015/01/31 职场文书
大二学年个人总结
2015/03/03 职场文书
2015年学校办公室工作总结
2015/05/26 职场文书
2016年万圣节家长开放日活动总结
2016/04/05 职场文书
阿里云ECS云服务器快照的概念以及如何使用
2022/04/21 Servers