差分进化算法(DE)的C++面向对象方法实现
代码来源于网络,写得非常棒
/*DE_test
*对相应的Matlab程序进行测试
*/ #include <iostream>
#include <cmath>
#include <ctime>
using namespace std; //产生随机数,随机数为(0.0,1.0)
double Rand_Double(void)
{
return static_cast<double>(rand()) / static_cast<double>(RAND_MAX);
} //测试函数Hansen
//参数个数为2
double Hansen(double *p_pars)
{
return (cos(1.0) + 2.0*cos(p_pars[] + 2.0) + 3.0*cos(2.0*p_pars[] + 3.0)
+ 4.0*cos(3.0*p_pars[] + 4.0) + 5.0*cos(4.0*p_pars[] + 5.0))
* (cos(2.0*p_pars[] + 1.0) + 2.0*cos(3.0*p_pars[] + 2.0) +
3.0*cos(4.0*p_pars[] + 3.0) + 4.0*cos(5.0*p_pars[] + 4.0) + 5.0*cos(6.0*p_pars[] + 5.0));
} class CFunction
{
public:
void *m_p_fun;//指向测试函数的指针
int m_pars_num;//参数个数
double m_min;//下限
double m_max;//上限
bool m_pos;//求解最小值还是最大值,如果是最小值则m_pos为false,如果是最大值则m_pos为true
public:
CFunction(void *p_fun, int pars_num, double min, double max, bool pos)
:m_p_fun(p_fun), m_pars_num(pars_num), m_min(min), m_max(max), m_pos(pos)
{
} virtual double Compute(double *p_pars) = ;
}; class CHansen :public CFunction
{
public:
//注册函数
CHansen(void)
:CFunction(Hansen, , -10.0, 10.0, false)
{
} double Compute(double *p_pars)
{
return Hansen(p_pars);
}
}; //个体
class CIndividual
{
public:
double *m_p_DNA;//参数
double m_f;//适应值
int m_DNA_length;//DNA的长度 public:
CIndividual(void)
:m_f(0.0), m_DNA_length(), m_p_DNA(NULL)
{
} ~CIndividual(void)
{
if (m_p_DNA != NULL)
delete[] m_p_DNA;
} //初始化,分配内存空间
void Ini(int pars_num)
{
m_DNA_length = pars_num;
m_p_DNA = new double[m_DNA_length];
} //假定两者分配的内存空间的大小一样
CIndividual& operator=(CIndividual& ind)
{
m_f = ind.m_f;
//m_DNA_length = ind.m_DNA_length;
for (int i = ; i < m_DNA_length; ++i)
{
m_p_DNA[i] = ind.m_p_DNA[i];
}
return *this;
} friend ostream& operator<<(ostream& o, CIndividual& ind)//运算符重载
{
return o << ind.m_f;
}
}; int main()
{
//---------------------------设置随机数------------------------------------
srand((unsigned int)(time(NULL))); //获得参数
int Num, T;
double zoom, cr; cout << "种群大小:";
cin >> Num; cout << "进化代数:";
cin >> T; cout << "缩放因子:";
cin >> zoom; cout << "交叉因子:";
cin >> cr; //----------------------对函数进行操作,注册函数------------------------------
CHansen fun_Hansen; CFunction *p_fun = &fun_Hansen;//为了实现多态
int pars_num = p_fun->m_pars_num;//参数个数
double min = p_fun->m_min;//下限
double max = p_fun->m_max;//上限
bool pos = p_fun->m_pos;//求最大值还是最小值 //----------------------注册种群,并分配内存空间-----------------------------
CIndividual *p_old = new CIndividual[Num];
CIndividual *p_new = new CIndividual[Num];
for (int i = ; i < Num; ++i)
{
p_old[i].Ini(pars_num);
p_new[i].Ini(pars_num);
} //-------------------------产生初始的随机种群--------------------------------
int i;
for (i = ; i < Num; ++i)//对种群进行遍历
{
for (int j = ; j < pars_num; ++j)//对参数列表进行遍历
p_old[i].m_p_DNA[j] = Rand_Double()*(max - min) + min;
p_old[i].m_f = p_fun->Compute(p_old[i].m_p_DNA);
} CIndividual ind_best;
ind_best.Ini(pars_num); for (int t = ; t < T; ++t)//开始一代一代地进化
{
//显示结果
ind_best = p_old[];
for (int i = ; i < Num; ++i)
{
if (pos == true && ind_best.m_f < p_old[i].m_f)//求最大值
ind_best = p_old[i];
else if (pos == false && ind_best.m_f > p_old[i].m_f)//求最小值
ind_best = p_old[i];
}
cout << ind_best << "\n"; //差分变异
for (i = ; i < Num; ++i)//对种群进行遍历
{
//产生三个随机数
int x1, x2, x3;
x1 = rand() % Num;
do
{
x2 = rand() % Num;
} while (x1 == x2);
do
{
x3 = rand() % Num;
} while (x1 == x3 || x2 == x3); for (int j = ; j < pars_num; ++j)//对参数列表进行遍历
{
p_new[i].m_p_DNA[j] = p_old[x1].m_p_DNA[j] + zoom * (p_old[x2].m_p_DNA[j] - p_old[x3].m_p_DNA[j]);
if (p_new[i].m_p_DNA[j]<min || p_new[i].m_p_DNA[j]>max)//越界
p_new[i].m_p_DNA[j] = p_old[i].m_p_DNA[j];
}
} //交叉操作,注意,交叉要对每个实数位进行交叉
for (i = ; i < Num; ++i)//对种群进行遍历
{
for (int j = ; j < pars_num; ++j)
{
if (Rand_Double() > cr)//不交叉
p_new[i].m_p_DNA[j] = p_old[i].m_p_DNA[j];
}
p_new[i].m_f = p_fun->Compute(p_new[i].m_p_DNA);
} //选择操作
for (i = ; i < Num; ++i)//对种群进行遍历
{
if (pos == true && p_new[i].m_f < p_old[i].m_f)//求最大值
p_new[i] = p_old[i];
else if (pos == false && p_new[i].m_f > p_old[i].m_f)//求最小值
p_new[i] = p_old[i];
} //交换
CIndividual *p_tmp;
p_tmp = p_old;
p_old = p_new;
p_new = p_tmp;
//此时,新种群的值被保存到p_old中
} return ;
}
差分进化算法(DE)的C++面向对象方法实现的更多相关文章
- 标准差分进化算法matlab程序实现(转载)
标准差分进化算法matlab程序实现 自适应差分演化算法方面的Matlab和C++代码及论文 差分进化算法 DE-Differential Evolution matlab练习程序(差异演化DE) [ ...
- 差分进化算法 DE-Differential Evolution
差分进化算法 (Differential Evolution) Differential Evolution(DE)是由Storn等人于1995年提出的,和其它演化算法一样,DE是一种模拟生物进化 ...
- 差分进化算法介绍及matlab实现
引言 差分进化算法是基于群体智能理论的优化算法,是通过群体内个体间的合作与竞争而产生的智能优化搜索算法,它保留了基于种群的全局搜索策略,采用实数编码.基于差分的简单变异操作和"一对一&quo ...
- 离散的差分进化Discrete DE
一般的差分算法的变异规则:Xmutation=Xr1+F(Xr2-Xr3),F为缩放因子, 离散差分进化DDE的变异规则:设每个解为K个元素的集合,则Xr2-Xr3:求出Xr2与Xr3有m个共同元素, ...
- 差分进化算法-python实现
DEIndividual.py import numpy as np import ObjFunction class DEIndividual: ''' individual of differen ...
- Python遗传和进化算法框架(一)Geatpy快速入门
https://blog.csdn.net/qq_33353186/article/details/82014986 Geatpy是一个高性能的Python遗传算法库以及开放式进化算法框架,由华南理工 ...
- SBX(Simulated binary crossover)模拟二进制交叉算子和DE(differential evolution)差分进化算子
一起来学演化计算-SBX(Simulated binary crossover)模拟二进制交叉算子和DE(differential evolution)差分进化算子 觉得有用的话,欢迎一起讨论相互学习 ...
- [Evolutionary Algorithm] 进化算法简介
进化算法,也被成为是演化算法(evolutionary algorithms,简称EAs),它不是一个具体的算法,而是一个“算法簇”.进化算法的产生的灵感借鉴了大自然中生物的进化操作,它一般包括基因编 ...
- geatpy - 遗传和进化算法相关算子的库函数(python)
Geatpy The Genetic and Evolutionary Algorithm Toolbox for Python Introduction Website (including doc ...
随机推荐
- Java程序员注意:Tomcat Get请求的巨坑!
Tomcat8.5,当Get请求中包含了未经编码的中文字符时,会报以下错误,请求未到应用程序在Tomcat层就被拦截了. Tomcat报错: java.lang.IllegalArgumentExce ...
- vue 利用intersectionOberver实现全局appear/disappear事件
搬运自:https://juejin.im/post/5cd10959f265da03a00fe5c6 效果: demo地址: https://codepen.io/deepkolos/pen/OYP ...
- Oracle如何用单字段或多字段进行查重
最近在整理数据形成信用报告,发现重复的数据真的多,梳理都好久.我就做个笔记把去掉重复数据的方法整理下来.方便我后期查阅. 我将我目前已知的两种去重方法分为:视图去重和表去重.原理就是有无rowid这个 ...
- printk 函数消息是如何记录的
printk 函数将消息写入一个 LOG_BUF_LEN 字节长的环形缓存, 长度值从 4 KB 到 1 MB, 由配置内核时选择. 这个函数接着唤醒任何在等待消息的进程, 就是说, 任何在系统 ...
- 宽域POST提交数据
小数据宽域可以使用jsonp,但是大数据跨域必须post那么有以下2种方式 1,传统方式 动态生成form var url = ''var $iframe = $("<iframe s ...
- 第三方下载控件 用起来还是不错的偶!Aria
本文主要介绍开源项目Aria的使用. 先在项目里的build 中配置compile 'com.arialyy.aria:Aria:3.1.1' //下载 开始下载 Aria.download(this ...
- 看 《android权威编程指南》 的笔记
Android 编译工具 确保ant已安装并正常运行,android sdk的tools/和platform-tools目录包含在可执行文件的搜索路径中 切换到项目目录并执行以下命令: android ...
- python csv write 乱码
参考 : https://www.zhihu.com/question/34201726 1.使用utf_8_sig with open('d:/file.csv', 'w', encoding='u ...
- LR回放webservice脚本报错------------mmdrv.exe应用程序错误(未解决)
1.录制完成webservice脚本如下: 2.回放脚本,报错: 3.网上查看了一些解决办法,但都是没有起到作用.
- 漫说安全|智能的云WAF,开挂的Web防御
“漫说安全”是我们推出的一个新栏目,以简洁明了的形式展现高深晦涩的云安全. 今天我们要讲的是智能的云WAF到底有啥“本领”,答案就在漫画里^_^ 漫画看完后估计你还会有些小疑问,不要着急,安全君特意准 ...