Python实现遗传算法(二进制编码)求函数最优值方式


Posted in Python onFebruary 11, 2020

目标函数

Python实现遗传算法(二进制编码)求函数最优值方式

编码方式

本程序采用的是二进制编码精确到小数点后五位,经过计算可知对于 Python实现遗传算法(二进制编码)求函数最优值方式 其编码长度为18,对于 Python实现遗传算法(二进制编码)求函数最优值方式 其编码长度为15,因此每个基于的长度为33。

参数设置

Python实现遗传算法(二进制编码)求函数最优值方式

算法步骤

设计的程序主要分为以下步骤:1、参数设置;2、种群初始化;3、用轮盘赌方法选择其中一半较好的个体作为父代;4、交叉和变异;5、更新最优解;6、对最有个体进行自学习操作;7结果输出。其算法流程图为:

Python实现遗传算法(二进制编码)求函数最优值方式

算法结果

由程序输出可知其最终优化结果为38.85029, Python实现遗传算法(二进制编码)求函数最优值方式

输出基因编码为[1 1 0 0 1 0 1 1 1 1 1 1 1 0 1 1 1 1 0 1 0 1 1 0 1 0 0 1 0 1 1 1 1]。

代码

import numpy as np
import random
import math
import copy

class Ind():
 def __init__(self):
  self.fitness = 0
  self.x = np.zeros(33)
  self.place = 0
  self.x1 = 0
  self.x2 = 0

def Cal_fit(x, upper, lower): #计算适应度值函数
 Temp1 = 0
 for i in range(18):
  Temp1 += x[i] * math.pow(2, i)
 Temp2 = 0
 for i in range(18, 33, 1):
  Temp2 += math.pow(2, i - 18) * x[i]
 x1 = lower[0] + Temp1 * (upper[0] - lower[0])/(math.pow(2, 18) - 1)
 x2 = lower[1] + Temp2 * (upper[1] - lower[1])/(math.pow(2, 15) - 1)
 if x1 > upper[0]:
  x1 = random.uniform(lower[0], upper[0])
 if x2 > upper[1]:
  x2 = random.uniform(lower[1], upper[1])
 return 21.5 + x1 * math.sin(4 * math.pi * (x1)) + x2 * math.sin(20 * math.pi * x2)
def Init(G, upper, lower, Pop): #初始化函数
 for i in range(Pop):
  for j in range(33):
   G[i].x[j] = random.randint(0, 1)
  G[i].fitness = Cal_fit(G[i].x, upper, lower)
  G[i].place = i
def Find_Best(G, Pop):
 Temp = copy.deepcopy(G[0])
 for i in range(1, Pop, 1):
  if G[i].fitness > Temp.fitness:
   Temp = copy.deepcopy(G[i])
 return Temp

def Selection(G, Gparent, Pop, Ppool): #选择函数
 fit_sum = np.zeros(Pop)
 fit_sum[0] = G[0].fitness
 for i in range(1, Pop, 1):
  fit_sum[i] = G[i].fitness + fit_sum[i - 1]
 fit_sum = fit_sum/fit_sum.max()
 for i in range(Ppool):
  rate = random.random()
  Gparent[i] = copy.deepcopy(G[np.where(fit_sum > rate)[0][0]])

def Cross_and_Mutation(Gparent, Gchild, Pc, Pm, upper, lower, Pop, Ppool): #交叉和变异
 for i in range(Ppool):
  place = random.sample([_ for _ in range(Ppool)], 2)
  parent1 = copy.deepcopy(Gparent[place[0]])
  parent2 = copy.deepcopy(Gparent[place[1]])
  parent3 = copy.deepcopy(parent2)
  if random.random() < Pc:
   num = random.sample([_ for _ in range(1, 32, 1)], 2)
   num.sort()
   if random.random() < 0.5:
    for j in range(num[0], num[1], 1):
     parent2.x[j] = parent1.x[j]
   else:
    for j in range(0, num[0], 1):
     parent2.x[j] = parent1.x[j]
    for j in range(num[1], 33, 1):
     parent2.x[j] = parent1.x[j]
   num = random.sample([_ for _ in range(1, 32, 1)], 2)
   num.sort()
   num.sort()
   if random.random() < 0.5:
    for j in range(num[0], num[1], 1):
     parent1.x[j] = parent3.x[j]
   else:
    for j in range(0, num[0], 1):
     parent1.x[j] = parent3.x[j]
    for j in range(num[1], 33, 1):
     parent1.x[j] = parent3.x[j]
  for j in range(33):
   if random.random() < Pm:
    parent1.x[j] = (parent1.x[j] + 1) % 2
   if random.random() < Pm:
    parent2.x[j] = (parent2.x[j] + 1) % 2

  parent1.fitness = Cal_fit(parent1.x, upper, lower)
  parent2.fitness = Cal_fit(parent2.x, upper, lower)
  Gchild[2 * i] = copy.deepcopy(parent1)
  Gchild[2 * i + 1] = copy.deepcopy(parent2)

def Choose_next(G, Gchild, Gsum, Pop): #选择下一代函数
 for i in range(Pop):
  Gsum[i] = copy.deepcopy(G[i])
  Gsum[2 * i + 1] = copy.deepcopy(Gchild[i])
 Gsum = sorted(Gsum, key = lambda x: x.fitness, reverse = True)
 for i in range(Pop):
  G[i] = copy.deepcopy(Gsum[i])
  G[i].place = i

def Decode(x):   #解码函数
 Temp1 = 0
 for i in range(18):
  Temp1 += x[i] * math.pow(2, i)
 Temp2 = 0
 for i in range(18, 33, 1):
  Temp2 += math.pow(2, i - 18) * x[i]
 x1 = lower[0] + Temp1 * (upper[0] - lower[0]) / (math.pow(2, 18) - 1)
 x2 = lower[1] + Temp2 * (upper[1] - lower[1]) / (math.pow(2, 15) - 1)
 if x1 > upper[0]:
  x1 = random.uniform(lower[0], upper[0])
 if x2 > upper[1]:
  x2 = random.uniform(lower[1], upper[1])
 return x1, x2

def Self_Learn(Best, upper, lower, sPm, sLearn): #自学习操作
 num = 0
 Temp = copy.deepcopy(Best)
 while True:
  num += 1
  for j in range(33):
   if random.random() < sPm:
    Temp.x[j] = (Temp.x[j] + 1)%2
  Temp.fitness = Cal_fit(Temp.x, upper, lower)
  if Temp.fitness > Best.fitness:
   Best = copy.deepcopy(Temp)
   num = 0
  if num > sLearn:
   break
 return Best

if __name__ == '__main__':
 upper = [12.1, 5.8]
 lower = [-3, 4.1]
 Pop = 100
 Ppool = 50
 G_max = 300
 Pc = 0.8
 Pm = 0.1
 sPm = 0.05
 sLearn = 20
 G = np.array([Ind() for _ in range(Pop)])
 Gparent = np.array([Ind() for _ in range(Ppool)])
 Gchild = np.array([Ind() for _ in range(Pop)])
 Gsum = np.array([Ind() for _ in range(Pop * 2)])
 Init(G, upper, lower, Pop)  #初始化
 Best = Find_Best(G, Pop)
 for k in range(G_max):
  Selection(G, Gparent, Pop, Ppool)  #使用轮盘赌方法选择其中50%为父代
  Cross_and_Mutation(Gparent, Gchild, Pc, Pm, upper, lower, Pop, Ppool) #交叉和变异生成子代
  Choose_next(G, Gchild, Gsum, Pop)  #选择出父代和子代中较优秀的个体
  Cbest = Find_Best(G, Pop)
  if Best.fitness < Cbest.fitness:
   Best = copy.deepcopy(Cbest)  #跟新最优解
  else:
   G[Cbest.place] = copy.deepcopy(Best)
  Best = Self_Learn(Best, upper, lower, sPm, sLearn)
  print(Best.fitness)
 x1, x2 = Decode(Best.x)
 print(Best.x)
 print([x1, x2])

以上这篇Python实现遗传算法(二进制编码)求函数最优值方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
小结Python用fork来创建子进程注意事项
Jul 03 Python
在Python的Django框架中编写错误提示页面
Jul 22 Python
python PyTorch预训练示例
Feb 11 Python
python pandas 如何替换某列的一个值
Jun 09 Python
Python简单过滤字母和数字的方法小结
Jan 09 Python
对python中的控制条件、循环和跳出详解
Jun 24 Python
PyQt5下拉式复选框QComboCheckBox的实例
Jun 25 Python
django 类视图的使用方法详解
Jul 24 Python
python sklearn常用分类算法模型的调用
Oct 16 Python
Python中使用gflags实例及原理解析
Dec 13 Python
python如何处理程序无法打开
Jun 16 Python
python 爬取百度文库并下载(免费文章限定)
Dec 04 Python
python加密解密库cryptography使用openSSL生成的密匙加密解密
Feb 11 #Python
如何通过python实现全排列
Feb 11 #Python
Python3加密解密库Crypto的RSA加解密和签名/验签实现方法实例
Feb 11 #Python
python 遗传算法求函数极值的实现代码
Feb 11 #Python
在django中使用apscheduler 执行计划任务的实现方法
Feb 11 #Python
django在保存图像的同时压缩图像示例代码详解
Feb 11 #Python
Python中包的用法及安装
Feb 11 #Python
You might like
Sony CFR 320 修复改造
2020/03/14 无线电
PHP中动态显示签名和ip原理
2007/03/28 PHP
从PHP的源码中深入了解stdClass类
2014/04/18 PHP
PDO::errorCode讲解
2019/01/28 PHP
运用Windows XP附带的Msicuu.exe、Msizap.exe来彻底卸载顽固程序
2007/04/21 Javascript
jquery放大镜效果超漂亮噢
2013/11/15 Javascript
Jquery通过Ajax访问XML数据的小例子
2013/11/18 Javascript
JS获取URL中的参数数据
2013/12/05 Javascript
Node.js安装教程和NPM包管理器使用详解
2014/08/16 Javascript
Javascript MVC框架Backbone.js详解
2014/09/18 Javascript
JavaScript对象反射用法实例
2015/04/17 Javascript
Jquery中$.post和$.ajax的用法小结
2015/04/28 Javascript
JavaScript中利用Array和Object实现Map的方法
2015/07/27 Javascript
浅谈javascript的Array.prototype.slice.call
2015/08/31 Javascript
JavaScript实现的SHA-1加密算法完整实例
2016/02/02 Javascript
vue写一个组件
2018/04/09 Javascript
vue实现中部导航栏布局功能
2019/07/30 Javascript
浅谈vue限制文本框输入数字的正确姿势
2019/09/02 Javascript
vue 自定指令生成uuid滚动监听达到tab表格吸顶效果的代码
2020/09/16 Javascript
Python的加密模块md5、sha、crypt使用实例
2014/09/28 Python
详解Python编程中time模块的使用
2015/11/20 Python
Python操作mysql数据库实现增删查改功能的方法
2018/01/15 Python
Python3爬虫之urllib携带cookie爬取网页的方法
2018/12/28 Python
Python一个简单的通信程序(客户端 服务器)
2019/03/06 Python
Python3.5文件读与写操作经典实例详解
2019/05/01 Python
xadmin使用formfield_for_dbfield函数过滤下拉表单实例
2020/04/07 Python
如何基于python把文字图片写入word文档
2020/07/31 Python
理货员的岗位职责
2013/11/23 职场文书
优秀教师的感人事迹
2014/02/04 职场文书
一句话工作感言
2014/03/01 职场文书
工程索赔意向书
2014/08/30 职场文书
弘扬焦裕禄精神走群众路线思想汇报
2014/09/12 职场文书
纪念9.18事变演讲稿
2014/09/14 职场文书
科学发展观标语
2014/10/08 职场文书
文明上网主题班会
2015/08/14 职场文书
golang 实现两个结构体复制字段
2021/04/28 Golang