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 文件读写操作实例详解
Mar 12 Python
Python使用arrow库优雅地处理时间数据详解
Oct 10 Python
Python将list中的string批量转化成int/float的方法
Jun 26 Python
python 将列表中的字符串连接成一个长路径的方法
Oct 23 Python
python 实现12bit灰度图像映射到8bit显示的方法
Jul 08 Python
python实现树的深度优先遍历与广度优先遍历详解
Oct 26 Python
python根据文本生成词云图代码实例
Nov 15 Python
Python3操作读写CSV文件使用包过程解析
Apr 10 Python
Python openpyxl模块实现excel读写操作
Jun 30 Python
Python实现冒泡排序算法的完整实例
Nov 04 Python
Python 虚拟环境工作原理解析
Dec 24 Python
浅谈Python实现opencv之图片色素的数值运算和逻辑运算
Jun 23 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
ajax 的post方法实例(带循环)
2011/07/04 PHP
php数组添加与删除单元的常用函数实例分析
2015/02/16 PHP
php二维数组合并及去重复的方法
2015/03/04 PHP
PHP+MySQL实现的简单投票系统实例
2016/02/24 PHP
js调用打印机打印网页字体总是缩小一号的解决方法
2014/01/24 Javascript
js匿名函数的调用示例(形式多种多样)
2014/08/20 Javascript
jquery代码实现多选、不同分享功能
2015/07/31 Javascript
理解javascript中的with关键字
2016/02/15 Javascript
基于Turn.js 实现翻书效果实例解析
2016/06/20 Javascript
Linux使用Node.js建立访问静态网页的服务实例详解
2017/03/21 Javascript
解决OneThink中无法异步提交kindeditor文本框中修改后的内容方法
2017/05/05 Javascript
JS表单提交验证、input(type=number) 去三角 刷新验证码
2017/06/21 Javascript
vue页面使用阿里oss上传功能的实例(二)
2017/08/09 Javascript
基于AngularJS的简单使用详解
2017/09/10 Javascript
基于vue2.x的电商图片放大镜插件的使用
2018/01/22 Javascript
jQuery实现鼠标移到某个对象时弹出显示层功能
2018/08/23 jQuery
关于JS解构的5种有趣用法
2019/09/05 Javascript
LayUI数据接口返回实体封装的例子
2019/09/12 Javascript
vue.js click点击事件获取当前元素对象的操作
2020/08/07 Javascript
vue等两个接口都返回结果再执行下一步的实例
2020/09/08 Javascript
vue开发chrome插件,实现获取界面数据和保存到数据库功能
2020/12/01 Vue.js
python创建线程示例
2014/05/06 Python
Python3中常用的处理时间和实现定时任务的方法的介绍
2015/04/07 Python
python中使用正则表达式的连接符示例代码
2017/10/10 Python
VScode编写第一个Python程序HelloWorld步骤
2018/04/06 Python
Python判断一个文件夹内哪些文件是图片的实例
2018/12/07 Python
浅谈python3.x pool.map()方法的实质
2019/01/16 Python
pyqt5利用pyqtDesigner实现登录界面
2019/03/28 Python
在keras里面实现计算f1-score的代码
2020/06/15 Python
pytorch判断是否cuda 判断变量类型方式
2020/06/23 Python
eBay德国站:eBay.de
2017/09/14 全球购物
七匹狼男装广告词
2014/03/21 职场文书
办理信用卡收入证明范例
2014/09/13 职场文书
2014年村官工作总结
2014/11/24 职场文书
2014年高一班主任工作总结
2014/12/05 职场文书
配置Kubernetes外网访问集群
2022/03/31 Servers