#include <iostream>
#include <cmath>
#include <ctime>
#include <cstdlib>
#include <engine.h>
using namespace std;
#define MAXNUMSIZE 50
#define CODELENGTH 20
#define mutbits 4
#define XFLAGS 0
#define YFLAGS 1
#define LOOPMAX 10000
static unsigned int codex[MAXNUMSIZE][CODELENGTH],codey[MAXNUMSIZE][CODELENGTH];
double idivalx[MAXNUMSIZE],idivaly[MAXNUMSIZE],newidivalx[MAXNUMSIZE],newidivaly[MAXNUMSIZE];
double f1[MAXNUMSIZE];
double optval[LOOPMAX],optposx[LOOPMAX],optposy[LOOPMAX],loopcount[LOOPMAX];
void DtoB(int,double,int);
void Crossover(int,int,int);
void MyRand(int ,int *,int ,int );
void MyPrint(int,int);
void Mutation(int,int);
void BtoD(int,int);
double fun1(double,double);
double fun2(double,double);
void MDraw();
void main()
{
double MAX_X=10,MIN_X=-10,MAX_Y=10,MIN_Y=-10,sumf1,peridival[MAXNUMSIZE],curbestval,curx,cury;
int loop,i,j,idivalnum[MAXNUMSIZE],newsum,CroChoicex,CroChoicey,MutChoicex,MutChoicey,
CrossNum[4]={20,28,36,44},MutNum[4]={1,5,10,15},
CroIdivsx[44],CroIdivsy[44],MutIdivsx[15],MutIdivsy[15],
base,countnew;
srand(time(0));
for(i=0;i<MAXNUMSIZE;i++)
{
idivalx[i]=idivaly[i]=-10+(rand()%2000000)*0.00001;
DtoB(i,idivalx[i],XFLAGS);
DtoB(i,idivaly[i],YFLAGS);
}
for(loop=0;loop<LOOPMAX;loop++)
{
countnew=0;
sumf1=0;
newsum=0;
for(i=0;i<MAXNUMSIZE;i++)
{
f1[i]=fun1(idivalx[i],idivaly[i]);
sumf1+=f1[i];
}
for(i=0;i<MAXNUMSIZE;i++)
{
peridival[i]=f1[i]/sumf1;
idivalnum[i]=(int)(peridival[i]*MAXNUMSIZE+0.5);
newsum+=idivalnum[i];
}
for (i=0;i<MAXNUMSIZE-1;i++)
{
for(j=i+1;j<MAXNUMSIZE;j++)
{
if(f1[i]<f1[j])
{
swap(idivalx[i],idivalx[j]);
swap(idivaly[i],idivaly[j]);
swap(f1[i],f1[j]);
swap(idivalnum[i],idivalnum[j]);
}
}
}
for(i=0;i<MAXNUMSIZE;i++)
{
base=countnew;
for(j=0;j<idivalnum[i];j++)
{
newidivalx[j+base]=idivalx[i];
newidivaly[j+base]=idivaly[i];
countnew++;
if(countnew==MAXNUMSIZE)
{
break;
}
}
if(countnew==MAXNUMSIZE)
{
break;
}
}
for(i=0;i<MAXNUMSIZE;i++)
{
idivalx[i]=newidivalx[i];
idivaly[i]=newidivaly[i];
DtoB(i,idivalx[i],XFLAGS);
DtoB(i,idivaly[i],YFLAGS);
}
if(curbestval<fun1(idivalx[0],idivaly[0]))
{
curbestval=fun1(idivalx[0],idivaly[0]);
curx=idivalx[0];
cury=idivaly[0];
}
else
{
idivalx[49]=curx;
idivaly[49]=cury;
}
optval[loop]=curbestval;
optposx[loop]=curx;
optposy[loop]=cury;
loopcount[loop]=loop;
cout<<optval[loop]<<" "<<optposx[loop]<<" "<<optposy[loop]<<endl;
CroChoicex=rand()%4;
CroChoicey=rand()%4;
MyRand(CrossNum[CroChoicex],CroIdivsx,0,49);
MyRand(CrossNum[CroChoicey],CroIdivsy,0,49);
for(i=0;i<CrossNum[CroChoicex];i+=2)
{
Crossover(CroIdivsx[i],CroIdivsx[i+1],XFLAGS);
}
for(i=0;i<CrossNum[CroChoicey];i+=2)
{
Crossover(CroIdivsy[i],CroIdivsy[i+1],YFLAGS);
}
MutChoicex=rand()%4;
MutChoicey=rand()%4;
MyRand(MutNum[MutChoicex],MutIdivsx,0,49);
MyRand(MutNum[MutChoicey],MutIdivsy,0,49);
for(i=0;i<MutNum[MutChoicex];i++)
{
Mutation(MutIdivsx[i],XFLAGS);
}
for(i=0;i<MutNum[MutChoicey];i++)
{
Mutation(MutIdivsy[i],YFLAGS);
}
for(i=0;i<MAXNUMSIZE;i++)
{
BtoD(i,XFLAGS);
BtoD(i,YFLAGS);
}
}
MDraw();
}
void MDraw()
{
Engine *ep;
mxArray *OVAL=NULL, *OPOSX=NULL,*OPOSY=NULL,*LPCNT=NULL;
if (!(ep=engOpen(NULL)))
{
cout<<"Can't open MATLAB engine!"<<endl;
exit(-1);
}
OVAL=mxCreateDoubleMatrix(1, LOOPMAX, mxREAL);
OPOSX=mxCreateDoubleMatrix(1, LOOPMAX, mxREAL);
OPOSY=mxCreateDoubleMatrix(1, LOOPMAX, mxREAL);
LPCNT=mxCreateDoubleMatrix(1, LOOPMAX, mxREAL);
mxSetName(OVAL,"OVAL");
mxSetName(OPOSX,"OPOSX");
mxSetName(OPOSY,"OPOSY");
mxSetName(LPCNT,"LPCNT");
memcpy((char*)mxGetPr(OVAL), (char*)optval, LOOPMAX*sizeof(double));
memcpy((char*)mxGetPr(OPOSX), (char*)optposx, LOOPMAX*sizeof(double));
memcpy((char*)mxGetPr(OPOSY), (char*)optposy, LOOPMAX*sizeof(double));
memcpy((char*)mxGetPr(LPCNT), (char*)loopcount, LOOPMAX*sizeof(double));
engPutArray(ep,OVAL);
engPutArray(ep,OPOSX);
engPutArray(ep,OPOSY);
engPutArray(ep,LPCNT);
engEvalString(ep,"subplot(1,2,1);");
engEvalString(ep,"plot3(OPOSX,OPOSY,LPCNT);");
engEvalString(ep,"grid on;");
engEvalString(ep,"xlabel('x');ylabel('y');zlabel('循环次数');title('f2(x,y)');");
engEvalString(ep,"subplot(1,2,2);");
engEvalString(ep,"plot(LPCNT,OVAL);");
engEvalString(ep,"grid on;");
engEvalString(ep,"xlabel('循环次数');ylabel('最适应值');title('f2(x,y)');");
}
double fun1(double x,double y)
{
return 0.9*exp(-((x+5)*(x+5)+(y+5)*(y+5))/10)+0.99996*exp(-((x-5)*(x-5)+(y-5)*(y-5))/20);
}
double fun2(double x,double y)
{
if(x==0)
{
if(y==0)
return 1.0;
else
return sin(y)/y;
}
else
{
if(y==0)
return sin(x)/x;
else
return sin(x)*sin(y)/x/y;
}
}
void Mutation(int num,int FLAGS)
{
int i,pos[mutbits];
MyRand(mutbits,pos,0,CODELENGTH-1);
for(i=0;i<mutbits;i++)
{
if(FLAGS)
codey[num][pos[i]]=codey[num][pos[i]]==1?0:1;
else
codex[num][pos[i]]=codex[num][pos[i]]==1?0:1;
}
}
void BtoD(int i,int FLAGS)
{
int j;
if(FLAGS)
{
idivaly[i]=0;
for(j=1;j<CODELENGTH;j++)
{
idivaly[i]=2*idivaly[i]+codey[i][j];
}
idivaly[i]/=100000;
if(codey[i][0]==1)
idivaly[i]*=(-1);
}
else
{
idivalx[i]=0;
for(j=1;j<CODELENGTH;j++)
{
idivalx[i]=2*idivalx[i]+codex[i][j];
}
idivalx[i]/=100000;
if(codex[i][0]==1)
idivalx[i]*=(-1);
}
}
void DtoB(int i,double val,int FLAGS)
{
int j,k,intval;
if(FLAGS)
{
codey[i][0]=val<0?1:0;
intval=fabs(val)*100000;
for (j=(CODELENGTH-1);j>0;j--)
{
if(intval<2)
{
codey[i][j]=intval;
for(k=1;k<j;k++)
codey[i][k]=0;
break;
}
codey[i][j]=intval%2;
intval/=2;
}
}
else
{
codex[i][0]=val<0?1:0;
intval=fabs(val)*100000;
for (j=(CODELENGTH-1);j>0;j--)
{
if(intval<2)
{
codex[i][j]=intval;
for(k=1;k<j;k++)
codex[i][k]=0;
break;
}
codex[i][j]=intval%2;
intval/=2;
}
}
}
void Crossover(int num1,int num2,int FLAGS)
{
int i,pos[CODELENGTH/2];
MyRand(CODELENGTH/2,pos,0,CODELENGTH-1);
for(i=0;i<CODELENGTH/2;i++)
{
if(FLAGS)
swap(codey[num1][pos[i]],codey[num2][pos[i]]);
else
swap(codex[num1][pos[i]],codex[num2][pos[i]]);
}
}
void MyRand(int num,int a[],int min,int max)
{
int i,rdval,totol;
int mask[MAXNUMSIZE];
for(i=0;i<MAXNUMSIZE;i++)
{
mask[i]=0;
}
totol=max-min+1;
for(i=0;i<num;i++)
{
rdval=rand()%totol;
while(mask[rdval])
rdval=rand()%totol;
mask[rdval]=1;
a[i]=rdval;
}
}
void MyPrint(int num,int FLAGS)
{
int col;
for(col=0;col<CODELENGTH;col++)
{
if(FLAGS)
cout<<codey[num][col];
else
cout<<codex[num][col];
}
}
GA.rar_遗传算法搜索
版权申诉
16 浏览量
2022-09-23
09:24:34
上传
评论
收藏 1004KB RAR 举报
alvarocfc
- 粉丝: 111
- 资源: 1万+
最新资源
- 基于C和C++的二维绘制工具设计源码 - DrawPro
- Object.defineProperty 的 IE 补丁object-defineproperty-ie-master.zip
- 整卷预览.mhtml
- MySQL是一种广泛使用的开源关系型数据库管理系统,它提供了丰富的SQL语句用于数据库的创建、查询、更新和管理 以下是一些常见的
- MySQL是一种广泛使用的开源关系型数据库管理系统,它提供了丰富的SQL语句用于数据库的创建、查询、更新和管理 以下是一些常见
- MySQL是一种广泛使用的开源关系型数据库管理系统,它提供了丰富的SQL语句用于数据库的创建、查询、更新和管理 以下是一些常见的
- 基于Javascript的结婚请帖设计源码 - Invitation
- mysql语句大全及用法
- mysql语句大全及用法
- mysql语句大全及用法
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈