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 相关文章推荐
浅谈function(函数)中的动态参数
Apr 30 Python
python实现八大排序算法(2)
Sep 14 Python
Python编程之黑板上排列组合,你舍得解开吗
Oct 30 Python
python安装numpy&amp;安装matplotlib&amp; scipy的教程
Nov 02 Python
python中利用h5py模块读取h5文件中的主键方法
Jun 05 Python
基于scrapy的redis安装和配置方法
Jun 13 Python
python 默认参数相关知识详解
Sep 18 Python
django 读取图片到页面实例
Mar 27 Python
keras slice layer 层实现方式
Jun 11 Python
基于python实现MQTT发布订阅过程原理解析
Jul 27 Python
Python实现像awk一样分割字符串
Sep 15 Python
Python+腾讯云服务器实现每日自动健康打卡
Dec 06 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
Php连接及读取和写入mysql数据库的常用代码
2014/08/11 PHP
php中cookie实现二级域名可访问操作的方法
2014/11/11 PHP
PHP命令行执行整合pathinfo模拟定时任务实例
2016/08/12 PHP
mac os快速切换多个PHP版本的方法
2017/03/07 PHP
PHP手机短信验证码实现流程详解
2018/05/17 PHP
thinkPHP框架实现类似java过滤器的简单方法示例
2018/09/05 PHP
Yii2框架加载css和js文件的方法分析
2019/05/25 PHP
js原生态函数中使用jQuery中的 $(this)无效的解决方法
2011/05/25 Javascript
JavaScript的递归之递归与循环示例介绍
2013/08/05 Javascript
基于Bootstrap+jQuery.validate实现Form表单验证
2014/12/16 Javascript
jQuery中:password选择器用法实例
2015/01/03 Javascript
AngularJS控制器controller正确的通信的方法
2016/01/25 Javascript
微信小程序 image组件binderror使用例子与js中的onerror区别
2017/02/15 Javascript
微信小程序开发之实现自定义Toast弹框
2017/06/08 Javascript
JS实现闭包中的沙箱模式示例
2017/09/07 Javascript
Vue-cli创建项目从单页面到多页面的方法
2017/09/20 Javascript
JS随机排序数组实现方法分析
2017/10/11 Javascript
详解使用create-react-app添加css modules、sasss和antd
2018/07/31 Javascript
JavaScript刷新页面的几种方法总结
2019/03/28 Javascript
JavaScript检测是否开启了控制台(F12调试工具)
2020/10/02 Javascript
[00:06]Yes,it worked!小卡尔成功穿越时空加入战场!
2019/07/20 DOTA
Php多进程实现代码
2018/05/07 Python
使用APScheduler3.0.1 实现定时任务的方法
2019/07/22 Python
python psutil模块使用方法解析
2019/08/01 Python
python自动化办公操作PPT的实现
2021/02/05 Python
床上用品全球在线购物:BeddingInn
2016/12/18 全球购物
什么是符号链接,什么是硬链接?符号链接与硬链接的区别是什么?
2013/05/03 面试题
有针对性的求职自荐信
2013/11/14 职场文书
参观监狱心得体会
2014/01/02 职场文书
公司办公室岗位职责
2014/03/19 职场文书
二年级班级文化建设方案
2014/05/10 职场文书
实习协议书
2015/01/27 职场文书
幼儿园语言教学反思
2016/02/23 职场文书
《孙子兵法》:欲成大事者,需读懂这些致胜策略
2019/08/23 职场文书
浅谈Redis主从复制以及主从复制原理
2021/05/29 Redis
create-react-app开发常用配置教程
2022/06/25 Javascript