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 ...
随机推荐
- 大小写字符转换【Sql Server和C#两种写法】
案例:Var Str = "abdCnd" 如何将Str = "ABDCND"? Sql Server写法:upper(Str) ==> Lower ...
- NetBeans的一些快捷键
Alt + Insert getter 覆盖toString方法 Shift+ F6 运行当前文件 F6 运行当前项目 Tab 完成代码片段 ctrl+\ 代码补全 Alt + Shift + F格式 ...
- C++内存分配Arena,指的是提前分配的一大块连续内存空间
参考: https://stackoverflow.com/questions/12825148/what-is-the-meaning-of-the-term-arena-in-relation-t ...
- RayLink远程控制软件:叮~你收到一份年度关键词报告
叮~~~ 今天是12月31日,2022年的最后一天.今天过后,明天就是2023年啦!R君提前恭祝大家新年快乐,温情满满的跨年之际,RayLink感恩2022遇见大家,2023还请大家多多关照~ 202 ...
- 你对USB了解吗?--USB 协议分析之 HID 设备
1. 简述 USB HID类是USB设备的一个标准设备类,包括的设备非常多.HID类设备定义它属于人机交互操作的设备,用于控制计算机操作的一些方面,如USB鼠标.USB键盘.USB游戏操纵杆等.但HI ...
- libmodbus 源码分析转
记录一下,这位大神分析的很到位,值得膜拜! < libmodbus协议栈1--Linux下详细移植步骤(配置.生成) > < libmodbus协议栈2-- Linux下 modbu ...
- CORE8051-APB总线
1 APB总线 core8051s内核支持APB3总线,APB writebuffer 为{XWB3, XWB2, XWB1, ACC}; 写访问 对FC00以上地址写值,即表示APB写操作,值为(X ...
- Webservice或WebAPi Post类型传参,类对象格式转换
有类: public class ImgInfo { public int fs { get; set; } public string FileName { get; set; } public s ...
- 洛谷P4802 [CCO 2015]路短最
题目 https://www.luogu.com.cn/problem/P4802 思路 数据范围 \(n\leq 18\),义眼丁真,鉴定为状压. 好,那我们来思考一下状态的构建.其实是很套路的东西 ...
- java第六周学习情况
这个星期接到了要开学的消息,心情是非常慌张的,毕竟还没有学到多少东西.但确实是要开学了.心中说不出激动还是紧张,那就带着这种奇妙的情绪记录这次的学习吧 首先必然还是看了相关的程序,记没记下来是另外一说 ...