#include "iostream.h"
#include "math.h"
#include "stdlib.h"
#include "iomanip.h"
#include "time.h"
//-------------------------参数区------------------------------------------
const int popsize=40; //种群规模
const int N=2; //维数
const int generation=200; //进化代数
const int number=100;
const double pc=0.3; //交叉概率
const double pm=0.1; //变异概率
//const int num=0;
//-------------------------函数声明区------------------------------------------
void Initialize(double p1[][N],double x1[N],double x2[N]); //初始化种群
void CalObjValue(double p1[][N],double *p2);
double CalObjvalueIndi(double p1[][N],int i);
void CalFitvalueMax(double *p1,double *p2); //计算适应度值,p1->objvalue,p2->fitvalue
void BestReplace(double & CurrentBestFitValue,double *p1,double p2[][N], double *p3);
void TournamentSelection(double p1[][N],double *p2,double p3[][N]);// 联赛选择算法
void ArithmeticCossover(double p1[][N]);//算数交叉
void GaussianMutation(double p[][N],double x1[N],double x2[N]);//高斯变异
void Climbing(double p1[][2],double x1[N],double x2[N]); //下坡法
//-------------------------子函数区------------------------------------------
void Initialize(double p1[][N],double x1[N],double x2[N]) //初始化种群
{
for(int i=0;i<popsize;i++) //p1指向POP
{
for(int j=0;j<N;j++)
{
double temp=x2[j]+(x1[j]-x2[j])*(double)rand()/(double)32767;
p1[i][j]=temp;
}
}
}
void CalObjValue(double p1[][N],double *p2)
{
for(int i=0;i<popsize;i++)
{
double temp;
temp=CalObjvalueIndi(p1,i);
p2[i]=temp;
}
}
void CalFitvalueMax(double *p1,double *p2) //计算适应度值,p1->objvalue,p2->fitvalue
{
for(int i=0;i<popsize;i++)
{
double cmin=100;
p2[i]=p1[i]+cmin;
}
}
void BestReplace(double & CurrentBestFitValue,double *p1,double p2[][N], double *p3)
//p1->fitvalue,p2->pop,p3->currentbestindividual
{
for(int i=0;i<popsize;i++)
{
if(p1[i]>CurrentBestFitValue)
{
CurrentBestFitValue=p1[i];
for(int j=0;j<N;j++)
p3[j]=p2[i][j];
}
}
}
void TournamentSelection(double p1[][N],double *p2,double p3[][N])// 联赛选择算法
//p1->pop,p2->fitvalue,p3->newpop
{
for(int i=0;i<popsize;i++)
{
int point1=floor((popsize-1)*rand()/(double)32767+0.5);
int point2=floor((popsize-1)*rand()/(double)32767+0.5);
if(p2[point1]>p2[point2])
{
for(int j=0;j<N;j++)
{
p3[i][j]=p1[point1][j];
}
}
else
{
for(int j=0;j<N;j++)
{
p3[i][j]=p1[point2][j];
}
}
}
}
void ArithmeticCossover(double p1[][N])//算数交叉
//p1->newpop
{
for(int i=0;i<popsize-1;i+=2)
for(int j=0;j<N;j++)
{
double rands=(double)rand()/(double)32767;
double alpha=(double)rand()/(double)32767;
if(rands<pm)
{
double temp1=p1[i][j];
double temp2=p1[i+1][j];
p1[i][j]=alpha*temp2+(1-alpha)*temp1;
p1[i+1][j]=alpha*temp1+(1-alpha)*temp2;
}
}
}
void GaussianMutation(double p[][N],double x1[N],double x2[N])//高斯变异
{
int i,j;
double temp;
int m;
double rand_vector[12];
double sum;
for(i=0;i<popsize;i++)
{
for(j=0;j<N;j++)
{
double s=(double)rand()/(double)32767;//产生一个随机数s
if(s<pc) //如果产生的随机数小于交叉概率
{
temp=x2[j]-1; //temp没有实际意义,只是为了使得while循环得以启动
while(temp<x2[j]||temp>x1[j])
{
for(m=0;m<12;m++)
{
rand_vector[m]=(double)rand()/(double)32767;
}//产生随机数组
sum=0;
for(m=0;m<12;m++)
{
sum=sum+rand_vector[m];
}//计算12个随机数的和
temp=p[i][j]+(x1[j]-x2[j])/6*(sum-6); //(x1max-x1min)/6为方差,可根据实际情况任意选取
}
p[i][j]=temp;
}
}
}
}
void Climbing(double p1[][N],double x1[N],double x2[N]) //下坡法
{
double TempPop[popsize][N];
double rand_vector[12];
double sum;
double temp;
double step;
double old_objvalue;
double old_fitvalue;
double new_objvalue;
double new_fitvalue;//定义新旧适应度值
double delta_fitvalue=0;
for(int x=0;x<popsize;x++)
for(int y=0;y<N;y++)
TempPop[x][y]=p1[x][y];//将Nbestpop赋给temp_Nbestpop;
for(int i=0;i<popsize;i++)
{
for(int j=0;j<N;j++)
{
//-----------对某个体的某维进行高斯变异------------------------------------
temp=x2[j]-1;//使得while循环能够启动
while(temp<x2[j]||temp>x1[j])
{
for(int m=0;m<12;m++)
{
rand_vector[m]=(double)rand()/(double)32767;
}//产生随机数组
sum=0;
for(m=0;m<12;m++)
{
sum=sum+rand_vector[m];
}//计算12个随机数的和
temp=p1[i][j]+(sum-6)*(x1[j]-x1[j])/6; //(sum-6)*(x1max-x1min)/6为方差,可调整
TempPop[i][j]=temp;
}
old_objvalue=CalObjvalueIndi(p1,i); //objvalue和fitvalue综合在一起了
old_fitvalue=old_objvalue+100;
new_objvalue=CalObjvalueIndi(TempPop,i); //objvalue和fitvalue综合在一起了
new_fitvalue=new_objvalue+100;
delta_fitvalue=old_fitvalue-new_fitvalue;
if(delta_fitvalue<0) //新的适应度数值大
{
step=TempPop[i][j]-p1[i][j];
while(delta_fitvalue<0)
{
p1[i][j]=TempPop[i][j]; //将新的数值付给POP
TempPop[i][j]+=step;
old_objvalue=CalObjvalueIndi(p1,i); //objvalue和fitvalue综合在一起了
old_fitvalue=old_objvalue+100;
new_objvalue=CalObjvalueIndi(TempPop,i); //objvalue和fitvalue综合在一起了
new_fitvalue=new_objvalue+100;
delta_fitvalue=old_fitvalue-new_fitvalue;
}
}
}
}
}
//-------------------------主函数区------------------------------------------
void main()
{
int num=0;
double RelativeErrorx=0;
double RelativeErrory=0;
srand(time(NULL)); //初始化时间种子
for(int k=0;k<number;k++)
{
double pop[popsize][N]; //浮点数种群
double newpop[popsize][N];
double objvalue[popsize]; //目标函数值
double fitvalue[popsize]; //适应度值
double CurrentBestIndividual[N]={0}; //当前最优个体
double CurrentBestFitValue=0; //当前最优适应度值,初始值设为0
double Xmax[N]={2.048,2.048};
double Xmin[N]={-2.048,-2.048};
//srand(time(NULL)); //初始化时间种子
//for(int k=0;k<number;k++)
//{
Initialize(pop,Xmax,Xmin); //初始化种群
for(int t=0;t<generation;t++)
{
CalObjValue(pop,objvalue);
CalFitvalueMax(objvalue,fitvalue); //计算适应度值,p1->objvalue,p2->fitvalue
BestReplace(CurrentBestFitValue,fitvalue,pop,CurrentBestIndividual);
TournamentSelection(pop,fitvalue,newpop);// 联赛选择算法
ArithmeticCossover(newpop);//算数交叉
GaussianMutation(newpop,Xmax,Xmin);//高斯变异
Climbing(newpop,Xmax,Xmin);
CalObjValue(newpop,objvalue);
//CalFitvalueMax(objvalue,fitvalue); //计算适应度值
//BestReplace(CurrentBestFitValue,fitvalue,newpop,CurrentBestIndividual);
for(int i=0;i<popsize;i++)
for(int j=0;j<N;j++)
pop[i][j]=newpop[i][j];
}
cout<<"当前最优目标函数值:"<<endl;
cout<<CurrentBestFitValue-100<<endl;
RelativeErrorx=CurrentBestIndividual[0]*100;
RelativeErrory=CurrentBestIndividual[1]*100;
cout<<"最优个体所在位置:"<<endl;
cout<<"x="<<CurrentBestIndividual[0]<<endl<<"y="<<CurrentBestIndividual[1]<<endl;
cout<<endl<<endl;
//RelativeErrorx=(abs(CurrentBestIndividual[0])-0.0898)/0.0898*100;
yichuansuanfa.rar_极大值_极小值
版权申诉
76 浏览量
2022-09-14
16:50:34
上传
评论
收藏 322KB RAR 举报
JonSco
- 粉丝: 67
- 资源: 1万+
最新资源
- 历届(第1-21届)希望杯数学竞赛初一试题及答案(最新整理).doc全国数学邀请赛(264页资料)
- 水滴.psd
- TokenPocket_V2.1.2_release.apk
- Apache-druid-kafka-rce.yaml
- 基于C#的ASP.NET数据库原理及应用技术课程指导平台的开发
- 基于ROS的智能车轨迹跟踪算法的仿真与设计源码运用PID跟踪算法.zip.zip
- Bug Bounty Tip - i春秋Self-XSS变废为宝的奇思妙想
- 1991-2015年全国初中化学竞赛复赛试题汇编(212页)(24年竞赛复赛真题).docx天原杯
- Apache Flink 未授权访问+远程代码执行.pdf
- hadoop-基于hive的聊天数据分析报表可视化案例数据源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0