上演化计算课的时候老师讲了一种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实现的更多相关文章

  1. 道长的算法笔记:KMP算法及其各种变体

    (一)如何优化暴力算法 Waiting... (二)KMP模板 KMP 算法的精髓在于 \(next\) 数组,\(next[i]=j\) 代表 \(p[1,j]=p[i-j+1,i]\),\(nex ...

  2. 模拟退火算法SA原理及python、java、php、c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径

    模拟退火算法SA原理及python.java.php.c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径 模拟退火算法(Simulated Annealing,SA)最早的思 ...

  3. TensorFlow利用A3C算法训练智能体玩CartPole游戏

    本教程讲解如何使用深度强化学习训练一个可以在 CartPole 游戏中获胜的模型.研究人员使用 tf.keras.OpenAI 训练了一个使用「异步优势动作评价」(Asynchronous Advan ...

  4. DRL 教程 | 如何保持运动小车上的旗杆屹立不倒?TensorFlow利用A3C算法训练智能体玩CartPole游戏

    本教程讲解如何使用深度强化学习训练一个可以在 CartPole 游戏中获胜的模型.研究人员使用 tf.keras.OpenAI 训练了一个使用「异步优势动作评价」(Asynchronous Advan ...

  5. 自然语言19.1_Lemmatizing with NLTK(单词变体还原)

    QQ:231469242 欢迎喜欢nltk朋友交流 https://www.pythonprogramming.net/lemmatizing-nltk-tutorial/?completed=/na ...

  6. Jade——变体的HTML

    什么是jade? jade是一个模板引擎,是变体的HTML. 模板引擎就是一个库,用来解释素具渲染视图的框架,也可以叫做HTML的预处理语言. jade是Node.js的一个模板引擎,他的语法借鉴了H ...

  7. Gradle for Android ( 构建变体 )

    链接: http://77blogs.com/?p=38 https://www.cnblogs.com/tangZH/p/10999060.html 有时候我们一个app需要有不同的版本,不同的版本 ...

  8. RNN及其变体框架

    RNN及其变体框架  含RNN推导 LSTM理解 理解LSTM网络  算法细节理解及参考文献  

  9. 【转载】Gradle for Android 第四篇( 构建变体 )

    当你在开发一个app,通常你会有几个版本.大多数情况是你需要一个开发版本,用来测试app和弄清它的质量,然后还需要一个生产版本.这些版本通常有不同的设置,例如不同的URL地址.更可能的是你可能需要一个 ...

  10. 【Visual Lisp】变体与安全数组

    (vlax-make-variant) ;;创建一个未初始化的变体 ;;01.整型值变体(setq myvar (vlax-make-variant 10)) ;;创建整型值变体,返回 #<va ...

随机推荐

  1. vue初始化data数据

    初始化data this.$data = this.$options.data() 初始化data中form this.$data.form = this.$options.data().form

  2. QT管理网络状态和网络连接

    参考:http://www.cleartechfei.com/2020/07/qt%E4%BD%BF%E7%94%A8http%E5%8D%8F%E8%AE%AE/ 1. 用Qt框架进行应用开发的过程 ...

  3. C++ primer 5th 第二章 变量和基本类型 阅读笔记

    第二章 变量和基本类型 第一节 基本内置类型 C++标准规定了算术类型尺寸的最小值,同时允许编译器赋予这些类型更大的尺寸. 比如: 类型 含义 最小尺寸 bool 布尔类型 未定义 wchar_t 宽 ...

  4. LVM分区扩容

    LVM分区扩容 用户需求:  将根分区有50G扩容到300G,以满足dmdb 集群用户后期增加需求 1. 查看当前硬盘分区情况,看到当前根分区只有50G 2.  vgs  查看逻辑卷情况,发现root ...

  5. springboot 集成poi导出word(一)

    使用ruoyi-前后端分离版本,根据word模板导出,包含表格和图片. 一.创建模板 列表使用{{}},文本使用[] 二.引入依赖 <!-- excel工具 --> <depende ...

  6. SpannableString 设置文字中的颜色 链接

    SpannableString spannableString = new SpannableString(matchResult); int index = matchResult.indexOf( ...

  7. mysql redis 开启远程访问

    springboot 加载外部yml nohup java -jar warehouse-0.0.1-SNAPSHOT.jar --Dspring.config.location=/root/www/ ...

  8. 用dig或nslookup命令查询txt解析记录

    这几天想把HTTPS装上,阿里云的免费证书需要在域名解析的地方添加TXT记录.文档里用的是dig命令,我本地装了nslookup.试验下如何用咯. dig命令 dig用法很多,这里只使用dig txt ...

  9. Jmeter性能测试入门到项目实战03

    Jmeter性能测试入门到项目实战03 P35 项目业务介绍 1,之前已经对Jmeter所有的知识点做了一个介绍,主要的业务模式是币币交易,就像b2c 2, 3, 4,主要是把登陆和交易这一块做一个并 ...

  10. matplotlib 中文乱码的解决方法

    关于报错信息 Glyph 26426 missing from current font. 这个错误的原因是:本地没有可支持中文字体显示的配置文件,所以第一步需要先去下载相关的配置文件. 下载链接 h ...