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接收Gmail新邮件并发送到gtalk的方法
Mar 10 Python
Python实现定时任务
Feb 08 Python
浅谈python数据类型及类型转换
Dec 18 Python
Python绘制七段数码管实例代码
Dec 20 Python
从0开始的Python学习016异常
Apr 08 Python
Django框架设置cookies与获取cookies操作详解
May 27 Python
python and or用法详解
Jun 26 Python
python flask搭建web应用教程
Nov 19 Python
Keras 切换后端方式(Theano和TensorFlow)
Jun 19 Python
Python 解析简单的XML数据
Jul 24 Python
用python写爬虫简单吗
Jul 28 Python
解析目标检测之IoU
Jun 26 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
德劲1104的电路分析与改良
2021/03/01 无线电
用PHP调用Oracle存储过程的方法
2008/09/12 PHP
Windows PHP5和Apache的安装与配置
2009/06/08 PHP
php命名空间学习详解
2014/02/27 PHP
PHP连接MySQL的2种方法小结以及防止乱码
2014/03/11 PHP
WordPress中用于获取及自定义头像图片的PHP脚本详解
2015/12/17 PHP
php基于openssl的rsa加密解密示例
2016/07/11 PHP
Yii+upload实现AJAX上传图片的方法
2016/07/13 PHP
php常用数组函数实例小结
2016/12/29 PHP
php实现网页上一页下一页翻页过程详解
2019/06/28 PHP
Jquery ajax不能解析json对象,报Invalid JSON错误的原因和解决方法
2010/03/27 Javascript
javascript获取选中的文本的方法代码
2013/10/30 Javascript
js实现背景图片感应鼠标变化的方法
2015/02/28 Javascript
JS实现横向与竖向两个选项卡Tab联动的方法
2015/09/27 Javascript
jquery Deferred 快速解决异步回调的问题
2016/04/05 Javascript
JS 获取HTML标签内的子节点的方法
2016/09/21 Javascript
文本溢出插件jquery.dotdotdot.js使用方法详解
2017/06/22 jQuery
在CMD命令行中运行python脚本的方法
2018/05/12 Python
Python3.5基础之变量、数据结构、条件和循环语句、break与continue语句实例详解
2019/04/26 Python
Python3多目标赋值及共享引用注意事项
2019/05/27 Python
Python空间数据处理之GDAL读写遥感图像
2019/08/01 Python
Python基本语法之运算符功能与用法详解
2019/10/22 Python
在win64上使用bypy进行百度网盘文件上传功能
2020/01/02 Python
Python结合Window计划任务监测邮件的示例代码
2020/08/05 Python
HTML5中语义化 b 和 i 标签
2008/10/17 HTML / CSS
欧洲高端品牌直销店:Fashionesta
2016/08/31 全球购物
匡威意大利官方商店 :Converse意大利
2018/11/27 全球购物
商务英语专业毕业生自荐信
2013/11/05 职场文书
办公室文员自荐书
2014/02/03 职场文书
责任书范本
2014/08/25 职场文书
电力培训心得体会
2014/09/02 职场文书
群众路线党员自我评议范文2014
2014/09/24 职场文书
2015年司法局工作总结
2015/05/22 职场文书
离婚答辩状怎么写
2015/05/22 职场文书
先进党支部事迹材料2016
2016/02/26 职场文书
MySQL创建管理RANGE分区
2022/04/13 MySQL