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 ...
随机推荐
- mblink study111
mblink study https://gitee.com/dotnetchina/NanUIhttps://blog.csdn.net/u012814856/article/details/70 ...
- android系统源码编译报错问题分析处理--持续更新
一.build/make/core/base_rules.mk:232: error: packages/services/Car/service: LOCAL_BUILT_MODULE and LO ...
- 由Restart()想到的
官方文档: Application.Restart Method (System.Windows.Forms) | Microsoft Docs 目录 Restart 探索 结论 启示 Restart ...
- tool script to convert back slash
Back slash is used in windows, which makes so many headache for me. Then an idea came to my mind. It ...
- thinkphp6+composer+无集成工具 配置php项目环境
安装composer 下载地址:https://getcomposer.org/Composer-Setup.exe 安装步骤 点击finish完成即可. 打开cmd输入composer查看是否安装成 ...
- 生产环境自动备份win服务器所有web项目(IIS+项目代码)
@echo offrem 功能:每月自动备份本服务器所有web项目rem 日期:2022.3.10rem 制作人:zl rem 定义变量Y为备份时间:YYYYMMset y=%date:~0,4%%d ...
- python代码规范PEP8
1.引言 本文档给出了 Python 编码规约,主要 Python 发行版中的标准库即遵守该规约.对于 C 代码风格的 Python 程序,请参阅配套的 C 代码风格指南. 本文档和 PEP 257( ...
- pgsql 自定义函数
CREATE OR REPLACE FUNCTION test1(id INTEGER,id1 INTEGER) RETURNS INTEGER LANGUAGE plpgsql AS $$ decl ...
- 搭建webssh和nginx反向代理
0.前置条件,centos主机安装了python3和nginx 1.安装webssh pip3 install webssh 2.添加自定义服务 systemctl cat webssh # ...
- maven 通用pom.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http:// ...