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检查指定文件是否存在的方法
Jul 06 Python
python实现计算倒数的方法
Jul 11 Python
浅析AST抽象语法树及Python代码实现
Jun 06 Python
详解python的数字类型变量与其方法
Nov 20 Python
unittest+coverage单元测试代码覆盖操作实例详解
Apr 04 Python
python3 requests库文件上传与下载实现详解
Aug 22 Python
将python2.7添加进64位系统的注册表方式
Nov 20 Python
python爬虫实现POST request payload形式的请求
Apr 30 Python
基于Python pyecharts实现多种图例代码解析
Aug 10 Python
利用Python将图片中扭曲矩形的复原
Sep 07 Python
python playwright 自动等待和断言详解
Nov 27 Python
python基础之//、/与%的区别详解
Jun 10 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 在5.1.* 和5.2.*之间 PDO数据库操作中的不同之处小结
2012/03/07 PHP
合并ThinkPHP配置文件以消除代码冗余的实现方法
2014/07/22 PHP
php通过前序遍历树实现无需递归的无限极分类
2015/07/10 PHP
Zend Framework教程之配置文件application.ini解析
2016/03/10 PHP
基于jQuery的图片左右无缝滚动插件
2012/05/23 Javascript
jQuery筛选器children()案例详解(图文)
2013/02/17 Javascript
js获取新浪天气接口的实现代码
2016/06/06 Javascript
AngularJS 指令详细介绍
2016/07/27 Javascript
COM组件中调用JavaScript函数详解及实例
2017/02/23 Javascript
详解nodejs爬虫程序解决gbk等中文编码问题
2017/04/06 NodeJs
jQuery中的deferred对象和extend方法详解
2017/05/08 jQuery
JS库之Waypoints的用法详解
2017/09/13 Javascript
深入理解Vue生命周期、手动挂载及挂载子组件
2017/09/27 Javascript
JS实现的透明度渐变动画效果示例
2018/04/28 Javascript
Vue2.0点击切换类名改变样式的方法
2018/08/22 Javascript
vue router 源码概览案例分析
2018/10/09 Javascript
vue打包之后生成一个配置文件修改接口的方法
2018/12/09 Javascript
通过扫小程序码实现网站登陆功能
2019/08/22 Javascript
Vue 数组和对象更新,但是页面没有刷新的解决方式
2019/11/09 Javascript
JavaScript 变量,数据类型基础实例详解【变量、字符串、数组、对象等】
2020/01/04 Javascript
微信小程序实现canvas分享朋友圈海报
2020/06/21 Javascript
[03:10]2014DOTA2 TI马来劲旅Titan首战告捷目标只是8强
2014/07/10 DOTA
Python程序设计入门(1)基本语法简介
2014/06/13 Python
python中MySQLdb模块用法实例
2014/11/10 Python
详解Python绘图Turtle库
2019/10/12 Python
纽约的奢华内衣店:Journelle
2016/07/29 全球购物
Free People中国官网:波西米亚风格女装服饰
2016/08/30 全球购物
英语专业毕业生自荐信
2013/10/28 职场文书
高中美术教学反思
2014/01/19 职场文书
服装设计师职业生涯规划范文
2014/02/28 职场文书
解除劳动合同协议书范本
2014/04/14 职场文书
敬老院院长事迹材料
2014/05/21 职场文书
学校安全防火方案
2014/06/07 职场文书
乡镇干部个人整改措施思想汇报
2014/10/10 职场文书
Python 中random 库的详细使用
2021/06/03 Python
Redis实现主从复制方式(Master&Slave)
2022/06/21 Redis