上演化计算课的时候老师讲了一种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. mblink study111

    mblink study  https://gitee.com/dotnetchina/NanUIhttps://blog.csdn.net/u012814856/article/details/70 ...

  2. android系统源码编译报错问题分析处理--持续更新

    一.build/make/core/base_rules.mk:232: error: packages/services/Car/service: LOCAL_BUILT_MODULE and LO ...

  3. 由Restart()想到的

    官方文档: Application.Restart Method (System.Windows.Forms) | Microsoft Docs 目录 Restart 探索 结论 启示 Restart ...

  4. 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 ...

  5. thinkphp6+composer+无集成工具 配置php项目环境

    安装composer 下载地址:https://getcomposer.org/Composer-Setup.exe 安装步骤 点击finish完成即可. 打开cmd输入composer查看是否安装成 ...

  6. 生产环境自动备份win服务器所有web项目(IIS+项目代码)

    @echo offrem 功能:每月自动备份本服务器所有web项目rem 日期:2022.3.10rem 制作人:zl rem 定义变量Y为备份时间:YYYYMMset y=%date:~0,4%%d ...

  7. python代码规范PEP8

    1.引言 本文档给出了 Python 编码规约,主要 Python 发行版中的标准库即遵守该规约.对于 C 代码风格的 Python 程序,请参阅配套的 C 代码风格指南. 本文档和 PEP 257( ...

  8. pgsql 自定义函数

    CREATE OR REPLACE FUNCTION test1(id INTEGER,id1 INTEGER) RETURNS INTEGER LANGUAGE plpgsql AS $$ decl ...

  9. 搭建webssh和nginx反向代理

    0.前置条件,centos主机安装了python3和nginx   1.安装webssh pip3 install webssh   2.添加自定义服务 systemctl cat webssh # ...

  10. maven 通用pom.xml

    1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http:// ...