/*DE_test

*对相应的Matlab程序进行测试

*/

#include

#include

#include

using namespace std;

//产生随机数,随机数为(0.0,1.0)

double Rand_Double(void)

{

return static_cast(rand()) / static_cast(RAND_MAX);

}

//测试函数Hansen

//参数个数为2

double Hansen(double *p_pars)

{

return ( cos(1.0) + 2.0*cos(p_pars[0]+2.0) + 3.0*cos(2.0*p_pars[0]+3.0)

+ 4.0*cos(3.0*p_pars[0]+4.0) + 5.0*cos(4.0*p_pars[0]+5.0) )

* ( cos(2.0*p_pars[1]+1.0) + 2.0*cos(3.0*p_pars[1]+2.0) +

3.0*cos(4.0*p_pars[1]+3.0) + 4.0*cos(5.0*p_pars[1]+4.0) + 5.0*cos(6.0*p_pars[1]+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) = 0;

};

class CHansen:public CFunction

{

public:

//注册函数

CHansen(void)

:CFunction(Hansen,2,-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(0),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=0;i

{

m_p_DNA[i] = ind.m_p_DNA[i];

}

return *this;

}

friend ostream& operator<

{

return o<

}

};

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=0;i

{

p_old[i].Ini(pars_num);

p_new[i].Ini(pars_num);

}

//-------------------------产生初始的随机种群--------------------------------

for(int i=0;i

{

for(int j=0;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=0;t

{

//显示结果

ind_best = p_old[0];

for(int i=1;i

{

if(pos==true && ind_best.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<

//差分变异

for(int i=0;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=0;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]max)//越界

p_new[i].m_p_DNA[j] = p_old[i].m_p_DNA[j];

}

}

//交叉操作,注意,交叉要对每个实数位进行交叉

for(int i=0;i

{

for(int j=0;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(int i=0;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 0;

}

差分进化算法用c语言实现,差分进化算法C++语言实现相关推荐

  1. R语言滞后差分diff()函数

    该文主要介绍滞后差分和diff()函数.文章仅供学习使用,欢迎留言交流哦! 首先解释滞后差分. 滞后差分:滞后项一般是指该变量的前一期的值,而差分则是当期值与前一期的值之差(一阶). 例如:存在向量C ...

  2. 算法基础(五)| 差分算法及模板详解

    ⭐写在前面的话:本系列文章旨在复习算法刷题中常用的基础算法与数据结构,配以详细的图例解释,总结相应的代码模板,同时结合例题以达到最佳的学习效果.本专栏面向算法零基础但有一定的C++基础的学习者.若C+ ...

  3. C语言实现粒子群算法(PSO)一

    C语言实现粒子群算法(PSO)一 最近在温习C语言,看的书是<C primer Plus>,忽然想起来以前在参加数学建模的时候,用过的一些智能算法,比如遗传算法.粒子群算法.蚁群算法等等. ...

  4. 用GA算法设计22个地点之间最短旅程-R语言实现

    数据挖掘入门与实战  公众号: datadw 相关帖子 转载︱案例 基于贪心算法的特征选择 用GA算法设计22个地点之间最短旅程-R语言实现 ----------------------------- ...

  5. can差分线阻抗_什么是差分线?三分钟看懂差分线!硬件工程师电路设计基础知识!...

    燚智能硬件开发大讲堂 用简单的语言,讲复杂的技术! 什么是差分线 差分线用通俗的话讲,用两条平行的.等长的走线传输相位差180度的同一信号. 说白了,就是一根线传输正信号,一根线传输负信号.正信号减去 ...

  6. C语言常用算法 脚本之家,C/C++常用算法手册 秦姣华 中文pdf扫描版 22.5MB

    <C/C++常用算法手册>分3篇,共13章,"第1篇算法基础篇"介绍了算法概述,重点分析了数据结构和基本算法思想:"第2篇算法基本应用篇"详细讲解了 ...

  7. c语言算法6,c语言6函数和算法.ppt

    c语言6函数和算法创新 近半个月目标 学会使用函数进行模块化程序设计 学会调试由多个函数(包含库函数)组成的程序 主要内容 模块化程序设计思想 函数定义和函数调用.函数原型(函数声明) 函数的参数和返 ...

  8. 影像算法瓶颈突破 汽车ADAS再进化

    影像算法瓶颈突破 汽车ADAS再进化 2015-01-31 18:58:00   来源:工研院资通所    关键字: 影像  算法  瓶颈  突破 近年来,世界各国的交通主管单位皆大力倡导「防御驾驶」 ...

  9. 简单算法的举例c语言,计算机科学与技术系C语言程序设计22简单算法举例.PPT

    计算机科学与技术系C语言程序设计22简单算法举例 第2章 程序的灵魂--算法 本章主要介绍算法的思想及算法的表示方法. 2.0 绪论 2.1 算法的概念 2.2 简单算法举例 2.3 算法的特性 2. ...

  10. c语言排序算法实际案例,[C语言] 部分经典排序算法详解(有图解)

    目录 1.内容概括 2.主要算法 3.技术的具体应用 4.算法实际应用 5.总结 0.前言 在上一篇文章<[C语言] 数组的实际应用三则>中我们提到了数组的一些基础知识,并通过三个实际例子 ...

最新文章

  1. strtotime 获取当月最后一天的日期
  2. C++17中那些值得关注的特性(上)
  3. Java基础day2
  4. css 文字可选,在HTML5中如何使用CSS建立不可选的文字
  5. 京东商品知识图谱,约10万商品品牌,约65万品牌销售关系
  6. 如何搭建监狱高清1080P OTT/IPTV电视系统
  7. 【转存】游戏中常用术语
  8. 【机器人学习】SCARA机器人正逆运动学分析与直线轨迹规划
  9. 修改网络设备在路由器中显示名称
  10. word自动添加题注,带章节编号并根据章节重新开始编号
  11. python中print的用法_Python中print用法里面% ,%s 和 % d 代表的意思
  12. 根据前序遍历和中序遍历的结果重建二叉树
  13. AutoHotKey:Shift+ijkl实现方向键
  14. 人工智能AI工程师学习路线心路历程和总结分享
  15. 基于51单片机TLC2543芯片实现AD转换
  16. 微信可以找回删除的好友吗?
  17. 医疗时鲜资讯:第二十三届中国国际医用仪器设备展览会暨技术交流会 有感
  18. 苹果svg解析自适应长图
  19. JS文件下载页面跳转出现空白页解决办法
  20. 苹果IOS 软件内购破解(亲自实践)

热门文章

  1. 【OpenGL】实例渲染示例——草地渲染
  2. ThreadLocal
  3. 【vijos】在vijos的自己的域中创建题目
  4. 安卓现盗号木马 威胁网银盗刷
  5. NYOJ456andNYOJ325
  6. 最优秀的一到五个国产软件
  7. matlab鲍威尔法(Powell)
  8. 速达软件各版本及产品ID
  9. 手机软件APP下载类网站Pbootcms模板 游戏软件应用网站源码 模板自适应手机端
  10. 最常用的五种数据分析方法,建议收藏!