差分进化算法用c语言实现,差分进化算法C++语言实现
/*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++语言实现相关推荐
- R语言滞后差分diff()函数
该文主要介绍滞后差分和diff()函数.文章仅供学习使用,欢迎留言交流哦! 首先解释滞后差分. 滞后差分:滞后项一般是指该变量的前一期的值,而差分则是当期值与前一期的值之差(一阶). 例如:存在向量C ...
- 算法基础(五)| 差分算法及模板详解
⭐写在前面的话:本系列文章旨在复习算法刷题中常用的基础算法与数据结构,配以详细的图例解释,总结相应的代码模板,同时结合例题以达到最佳的学习效果.本专栏面向算法零基础但有一定的C++基础的学习者.若C+ ...
- C语言实现粒子群算法(PSO)一
C语言实现粒子群算法(PSO)一 最近在温习C语言,看的书是<C primer Plus>,忽然想起来以前在参加数学建模的时候,用过的一些智能算法,比如遗传算法.粒子群算法.蚁群算法等等. ...
- 用GA算法设计22个地点之间最短旅程-R语言实现
数据挖掘入门与实战 公众号: datadw 相关帖子 转载︱案例 基于贪心算法的特征选择 用GA算法设计22个地点之间最短旅程-R语言实现 ----------------------------- ...
- can差分线阻抗_什么是差分线?三分钟看懂差分线!硬件工程师电路设计基础知识!...
燚智能硬件开发大讲堂 用简单的语言,讲复杂的技术! 什么是差分线 差分线用通俗的话讲,用两条平行的.等长的走线传输相位差180度的同一信号. 说白了,就是一根线传输正信号,一根线传输负信号.正信号减去 ...
- C语言常用算法 脚本之家,C/C++常用算法手册 秦姣华 中文pdf扫描版 22.5MB
<C/C++常用算法手册>分3篇,共13章,"第1篇算法基础篇"介绍了算法概述,重点分析了数据结构和基本算法思想:"第2篇算法基本应用篇"详细讲解了 ...
- c语言算法6,c语言6函数和算法.ppt
c语言6函数和算法创新 近半个月目标 学会使用函数进行模块化程序设计 学会调试由多个函数(包含库函数)组成的程序 主要内容 模块化程序设计思想 函数定义和函数调用.函数原型(函数声明) 函数的参数和返 ...
- 影像算法瓶颈突破 汽车ADAS再进化
影像算法瓶颈突破 汽车ADAS再进化 2015-01-31 18:58:00 来源:工研院资通所 关键字: 影像 算法 瓶颈 突破 近年来,世界各国的交通主管单位皆大力倡导「防御驾驶」 ...
- 简单算法的举例c语言,计算机科学与技术系C语言程序设计22简单算法举例.PPT
计算机科学与技术系C语言程序设计22简单算法举例 第2章 程序的灵魂--算法 本章主要介绍算法的思想及算法的表示方法. 2.0 绪论 2.1 算法的概念 2.2 简单算法举例 2.3 算法的特性 2. ...
- c语言排序算法实际案例,[C语言] 部分经典排序算法详解(有图解)
目录 1.内容概括 2.主要算法 3.技术的具体应用 4.算法实际应用 5.总结 0.前言 在上一篇文章<[C语言] 数组的实际应用三则>中我们提到了数组的一些基础知识,并通过三个实际例子 ...
最新文章
- strtotime 获取当月最后一天的日期
- C++17中那些值得关注的特性(上)
- Java基础day2
- css 文字可选,在HTML5中如何使用CSS建立不可选的文字
- 京东商品知识图谱,约10万商品品牌,约65万品牌销售关系
- 如何搭建监狱高清1080P OTT/IPTV电视系统
- 【转存】游戏中常用术语
- 【机器人学习】SCARA机器人正逆运动学分析与直线轨迹规划
- 修改网络设备在路由器中显示名称
- word自动添加题注,带章节编号并根据章节重新开始编号
- python中print的用法_Python中print用法里面% ,%s 和 % d 代表的意思
- 根据前序遍历和中序遍历的结果重建二叉树
- AutoHotKey:Shift+ijkl实现方向键
- 人工智能AI工程师学习路线心路历程和总结分享
- 基于51单片机TLC2543芯片实现AD转换
- 微信可以找回删除的好友吗?
- 医疗时鲜资讯:第二十三届中国国际医用仪器设备展览会暨技术交流会 有感
- 苹果svg解析自适应长图
- JS文件下载页面跳转出现空白页解决办法
- 苹果IOS 软件内购破解(亲自实践)