代码来源于网络,写得非常棒

 /*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++面向对象方法实现的更多相关文章

  1. 标准差分进化算法matlab程序实现(转载)

    标准差分进化算法matlab程序实现 自适应差分演化算法方面的Matlab和C++代码及论文 差分进化算法 DE-Differential Evolution matlab练习程序(差异演化DE) [ ...

  2. 差分进化算法 DE-Differential Evolution

    差分进化算法 (Differential Evolution)   Differential Evolution(DE)是由Storn等人于1995年提出的,和其它演化算法一样,DE是一种模拟生物进化 ...

  3. 差分进化算法介绍及matlab实现

    引言 差分进化算法是基于群体智能理论的优化算法,是通过群体内个体间的合作与竞争而产生的智能优化搜索算法,它保留了基于种群的全局搜索策略,采用实数编码.基于差分的简单变异操作和"一对一&quo ...

  4. 离散的差分进化Discrete DE

    一般的差分算法的变异规则:Xmutation=Xr1+F(Xr2-Xr3),F为缩放因子, 离散差分进化DDE的变异规则:设每个解为K个元素的集合,则Xr2-Xr3:求出Xr2与Xr3有m个共同元素, ...

  5. 差分进化算法-python实现

    DEIndividual.py import numpy as np import ObjFunction class DEIndividual: ''' individual of differen ...

  6. Python遗传和进化算法框架(一)Geatpy快速入门

    https://blog.csdn.net/qq_33353186/article/details/82014986 Geatpy是一个高性能的Python遗传算法库以及开放式进化算法框架,由华南理工 ...

  7. SBX(Simulated binary crossover)模拟二进制交叉算子和DE(differential evolution)差分进化算子

    一起来学演化计算-SBX(Simulated binary crossover)模拟二进制交叉算子和DE(differential evolution)差分进化算子 觉得有用的话,欢迎一起讨论相互学习 ...

  8. [Evolutionary Algorithm] 进化算法简介

    进化算法,也被成为是演化算法(evolutionary algorithms,简称EAs),它不是一个具体的算法,而是一个“算法簇”.进化算法的产生的灵感借鉴了大自然中生物的进化操作,它一般包括基因编 ...

  9. geatpy - 遗传和进化算法相关算子的库函数(python)

    Geatpy The Genetic and Evolutionary Algorithm Toolbox for Python Introduction Website (including doc ...

随机推荐

  1. javaSpring学习总结day_02

    使用注解注入: 1.用于创建bean对象 @Component: 作用:相当于配置了一个bean标签 位置:类上面 属性:value,含义是bean的id,当不写时,有默认值,默认值是当前类的短名,首 ...

  2. JS规则 是非颠倒(逻辑非操作符)"!"是逻辑非操作符,也就是"不是"的意思,非真即假,非假即真

    是非颠倒(逻辑非操作符) "!"是逻辑非操作符,也就是"不是"的意思,非真即假,非假即真.好比小华今天买了一个杯子,小明说:"杯子是白色的" ...

  3. nodejs实现读取文件

    今天后端同事下班,想让我读取一个文件的内容.我想这个是小忙啊,就立马答应了. 我知道这个是nodejs读取,可是我又想,平时我们都要起一个服务才能够运行node服务器, 比如如下代码 var http ...

  4. 180608发现的一个有趣的Douyin-Bot项目

    今日发现的github 项目 Douyin-Bot 抖音机器人发现漂亮小姐姐 :sweat_smile: 在开发者模式下,找到指针位置,开启之后,当点击屏幕时,可以获取点击屏幕处的xy坐标了 我使用的 ...

  5. 2.初始化spark

    参考:  RDD programming guide http://spark.apache.org/docs/latest/rdd-programming-guide.html  SQL progr ...

  6. 阿里云容器服务通过LoadBalancer暴露IPv6服务

    背景: IPv4地址已接近枯竭,被誉为下一代互联网技术的IPv6成为新的“全球互联网门牌号”,它可以让地球上的每一粒沙子都拥有地址.当下,各国都在加速推进下一代互联网的部署,工信部也互联网服务商提出了 ...

  7. github上创建java项目简单操作

    github上创建java项目简单操作 参考L: github上创建java项目简单操作 - CSDN博客http://blog.csdn.net/qq_29392425/article/detail ...

  8. Java笔记 - 线程与并行API

    一.线程简介 1.线程与进程 每个进程都具有独立的代码和数据空间,进程间的切换会有较大的开销.线程是轻量级的进程,同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换的开 ...

  9. SPSS分析过程可自动化,你知道吗

    SPSS分析过程可自动化,你知道吗 在使用SPSS的过程中,有时候会遇到重复进行相同分析操作的情况,或者分析过程很复杂的情况. 这时候我们多么希望SPSS能够记住上一次的分析步骤,不要让我们重复的去点 ...

  10. Docker系列(十):Kubernetes集群入门

    kubenetes安装 官网:https://github.com/kubernetes/kubernetes/blob/release-1.0/docs/getting-started- guide ...