DE 算法的变体python实现
上演化计算课的时候老师讲了一种DE算法的改进算法CoDE,于是看了下CoDE的论文中的算法步骤:

算法中使用的三种交叉策略:

根据不同的交叉策略采取不同的变异策略:

超参数的三种不同组合(一一对应):


python代码实现
import numpy as np
import random
import math class Population:
def __init__(self, min_range, max_range, dim, rounds, size, object_func):
self.min_range = min_range
self.max_range = max_range
self.dimension = dim
self.rounds = rounds
self.size = size
self.cur_round = 1
self.get_object_function_value = object_func
# 初始化种群
self.individuality = [np.array([random.uniform(self.min_range, self.max_range) for s in range(self.dimension)])
for tmp in range(size)]
self.object_function_values = [self.get_object_function_value(v) for v in self.individuality]
self.mutant1 = None
self.mutant2 = None
self.mutant3 = None
#变异 def mutate1(self): #使用rand/1进行变异
self.mutant1 = []
factor = 1.0
for i in range(self.size):
r0, r1, r2 = 0, 0, 0
#随机查找变异父代
while r0 == r1 or r1 == r2 or r0 == r2 or r0 == i:
r0 = random.randint(0, self.size - 1)
r1 = random.randint(0, self.size - 1)
r2 = random.randint(0, self.size - 1)
#变异向量
tmp = self.individuality[r0] + (self.individuality[r1] - self.individuality[r2]) * factor
for t in range(self.dimension):
if tmp[t] > self.max_range or tmp[t] < self.min_range:
tmp[t] = random.uniform(self.min_range, self.max_range)
self.mutant1.append(tmp) def mutate2(self): #使用rand/2进行变异
self.mutant2 = []
factor = 1.0
for i in range(self.size):
r0, r1, r2 , r3, r4= 0, 0, 0, 0, 0
#随机查找变异父代
while r0 == r1 or r1 == r2 or r2 == r3 or r3 == r4 or r4 == r0 \
or r0 == r2 or r0 == r3 or r0 == r4 or r1 == r3 or r1 == r4 \
or r2 == r4 or r0 == i:
r0 = random.randint(0, self.size - 1)
r1 = random.randint(0, self.size - 1)
r2 = random.randint(0, self.size - 1)
r3 = random.randint(0, self.size - 1)
r4 = random.randint(0, self.size - 1)
#变异向量
tmp = self.individuality[r0] + (self.individuality[r1] - self.individuality[r2]) * factor\
+ (self.individuality[r3] - self.individuality[r4]) * factor
for t in range(self.dimension):
if tmp[t] > self.max_range or tmp[t] < self.min_range:
tmp[t] = random.uniform(self.min_range, self.max_range)
self.mutant2.append(tmp) def mutate3(self): #使用current-to-rand/1进行变异
self.mutant3 = []
factor = 0.8
for i in range(self.size):
r0, r1, r2 = 0, 0, 0
# 随机查找变异父代
while r0 == r1 or r1 == r2 or r0 == r2 or r0 == i:
r0 = random.randint(0, self.size - 1)
r1 = random.randint(0, self.size - 1)
r2 = random.randint(0, self.size - 1)
# 变异向量
tmp = self.individuality[i] + (self.individuality[r0] - self.individuality[i]) * factor \
+ (self.individuality[r1] - self.individuality[r2]) * factor
for t in range(self.dimension):
if tmp[t] > self.max_range or tmp[t] < self.min_range:
tmp[t] = random.uniform(self.min_range, self.max_range)
self.mutant3.append(tmp) #交叉
def crossover(self,mutant,CR):
for i in range(self.size):
Jrand = random.randint(0, self.dimension)
for j in range(self.dimension):
if random.random() > CR and j != Jrand:
mutant[i][j] = self.individuality[i][j]
return mutant #选择
def select(self,u1,u2,u3):
for i in range(self.size):
tmp1 = self.get_object_function_value(u1[i])
tmp2 = self.get_object_function_value(u2[i])
tmp3 = self.get_object_function_value(u3[i])
if tmp1 < tmp2 and tmp1 < tmp3 and tmp1 < self.object_function_values[i]:
self.individuality[i] = u1[i]
self.object_function_values[i] = tmp1
elif tmp2 < tmp1 and tmp2 < tmp3 and tmp2 < self.object_function_values[i]:
self.individuality[i] = u2[i]
self.object_function_values[i] = tmp2
elif tmp3 < tmp1 and tmp3 < tmp2 and tmp3 < self.object_function_values[i]:
self.individuality[i] = u3[i]
self.object_function_values[i] = tmp3 def print_best(self):
m = min(self.object_function_values)
i = self.object_function_values.index(m)
print("轮数:" + str(self.cur_round))
print("最佳个体:" + str(self.individuality[i]))
print("目标函数值:" + str(m)) def evolution(self):
while self.cur_round < self.rounds:
self.mutate1()
self.mutate2()
self.mutate3()
u1 = self.crossover(self.mutant1,CR=0.1)
u2 = self.crossover(self.mutant2,CR=0.9)
u3 = self.mutant3
self.select(u1,u2,u3)
self.print_best()
self.cur_round = self.cur_round + 1 # 测试部分
if __name__ == "__main__":
def f(x):
return x**2
p = Population(min_range=-3, max_range=3, dim=1, rounds=100, size=30, object_func=f)
p.evolution()
---***如有不对欢迎指正***---
DE 算法的变体python实现的更多相关文章
- 道长的算法笔记:KMP算法及其各种变体
(一)如何优化暴力算法 Waiting... (二)KMP模板 KMP 算法的精髓在于 \(next\) 数组,\(next[i]=j\) 代表 \(p[1,j]=p[i-j+1,i]\),\(nex ...
- 模拟退火算法SA原理及python、java、php、c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径
模拟退火算法SA原理及python.java.php.c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径 模拟退火算法(Simulated Annealing,SA)最早的思 ...
- TensorFlow利用A3C算法训练智能体玩CartPole游戏
本教程讲解如何使用深度强化学习训练一个可以在 CartPole 游戏中获胜的模型.研究人员使用 tf.keras.OpenAI 训练了一个使用「异步优势动作评价」(Asynchronous Advan ...
- DRL 教程 | 如何保持运动小车上的旗杆屹立不倒?TensorFlow利用A3C算法训练智能体玩CartPole游戏
本教程讲解如何使用深度强化学习训练一个可以在 CartPole 游戏中获胜的模型.研究人员使用 tf.keras.OpenAI 训练了一个使用「异步优势动作评价」(Asynchronous Advan ...
- 自然语言19.1_Lemmatizing with NLTK(单词变体还原)
QQ:231469242 欢迎喜欢nltk朋友交流 https://www.pythonprogramming.net/lemmatizing-nltk-tutorial/?completed=/na ...
- Jade——变体的HTML
什么是jade? jade是一个模板引擎,是变体的HTML. 模板引擎就是一个库,用来解释素具渲染视图的框架,也可以叫做HTML的预处理语言. jade是Node.js的一个模板引擎,他的语法借鉴了H ...
- Gradle for Android ( 构建变体 )
链接: http://77blogs.com/?p=38 https://www.cnblogs.com/tangZH/p/10999060.html 有时候我们一个app需要有不同的版本,不同的版本 ...
- RNN及其变体框架
RNN及其变体框架 含RNN推导 LSTM理解 理解LSTM网络 算法细节理解及参考文献
- 【转载】Gradle for Android 第四篇( 构建变体 )
当你在开发一个app,通常你会有几个版本.大多数情况是你需要一个开发版本,用来测试app和弄清它的质量,然后还需要一个生产版本.这些版本通常有不同的设置,例如不同的URL地址.更可能的是你可能需要一个 ...
- 【Visual Lisp】变体与安全数组
(vlax-make-variant) ;;创建一个未初始化的变体 ;;01.整型值变体(setq myvar (vlax-make-variant 10)) ;;创建整型值变体,返回 #<va ...
随机推荐
- aws note
Amazon EC2 Instance Types https://aws.amazon.com/ec2/instance-types/ My courses - AWS Skill Builder ...
- D3简介
(一)D3简介 一.D3是什么 一张图片价值相当于一千个字 D3的全称是 Data-Driven Documents,直译为:数据驱动的文档 D3是一个javaScript的函数库,是用来做数据可视化 ...
- JAVA学习笔记-07
局部内部类不能定义静态成员. 内部类定义在局部时: 1不可以被成员修饰符修饰 2.可以直接访问玩不类中的成员,因为还持有外部类中的引用 但是不可以访问它所在的局部中的变量,只能访问被final修饰的局 ...
- debian安装mate桌面环境的方法(图)
debian安装mate桌面环境的方法(图) 2018年11月11日 | 浏览: 5199 | 来源:www.yangshengliang.com debian安装时是可以选择桌面环 ...
- pip3 install
python3 -m venv tutorial-env source tutorial-env/bin/activatepip3 install *deactivate
- c++ 引用 指针。
一.什么是引用(reference) ?已经存在的对象的另外一个名字. 引用有什么特别的? 1.引用在定义时,以&开头. 2.引用不是对象,只能绑定在对象上.所以必须在初始化的时候,指定引用绑 ...
- 解决ubuntu18环境matplotlib无法正常显示中文
首先看看系统装了中文字体没?命令: fc-list :lang=zh 如果没安装,需要去下载或者从win复制一份到ubuntu, 在/usr/share/fonts文件夹下创建一个chinese文件夹 ...
- import cv2时出现ImportError: DLL load fail:找不到指定模块
- python--线性回归
首先先安装要用到的包:sklearn,顾名思义机器学习包 import matplotlib.pyplot as plt import numpy as np import pandas as pd ...
- vue 鼠标拖拽
<template> <div class="home"> <div id="box" v-drag></div> ...