📄 mfgaview.cpp
字号:
delete [] cA2;
cA2=NULL;
}
void CMFGAView::objfunc(individual *crit)
{
double s11,s21,sa,sb,sw;
s11=0;
s21=0;
sa=0;
sb=0;
sw=wd/sqrt(1+wd*wd);
parameters(crit,&s11,&s21,&sa,&sb);
crit->fitness=-(s11+s21+(sa-sw)*(sa-sw)+(sb-sw)*(sb-sw));
}
void CMFGAView::mutation(unsigned **child)
{
int i,j,k,stop;
unsigned mask,temp=1;
for(i=0;i<N*N+1;i++)
{
for(k=0;k<chromsize;k++)
{
mask=0;
if(k==(chromsize-1))
stop=lchrom-(k*(8*sizeof(unsigned)));
else
stop=8*sizeof(unsigned);
for(j=0;j<stop;j++)
{
if(flip(pmutation))
{
mask=mask|(temp<<j);
nmutation++;
}
}
child[i][k]=child[i][k]^mask;
}
}
}
void CMFGAView::crossover(unsigned **parent1, unsigned **parent2, unsigned **child1, unsigned **child2,int jcr[])
{
int i,j,k,jcro;
unsigned mask,temp;
for(i=0;i<N*N+1;i++)
{
if(flip(pcross))
{
jcro=rnd(1,(lchrom-1)); /*Cross between l and-1*/
ncross++;
for(k=1;k<=chromsize;k++)
{
if(jcro>=(int)(k*(8*sizeof(unsigned))))
{
child1[i][k-1]=parent1[i][k-1];
child2[i][k-1]=parent2[i][k-1];
}
else if((jcro<(int)(k*(8*sizeof(unsigned))))&&(jcro>(int)((k-1)*(8*sizeof(unsigned)))))
{
mask=1;
for(j=1;j<=(int)(jcro-1-((k-1)*(8*sizeof(unsigned))));j++)
{
temp=1;
mask=mask<<1;
mask=mask|temp;
}
child1[i][k-1]=(parent1[i][k-1]&mask)|(parent2[i][k-1]&(~mask));
child2[i][k-1]=(parent1[i][k-1]&(~mask))|(parent2[i][k-1]&mask);
}
else
{
child1[i][k-1]=parent2[i][k-1];
child2[i][k-1]=parent1[i][k-1];
}
}
}
else
{
for(k=0;k<chromsize;k++)
{
child1[i][k]=parent1[i][k];
child2[i][k]=parent2[i][k];
}
jcro=0;
}
jcr[i]=jcro;
}
}
int CMFGAView::flip(double prob)
{
if(randomperc()<=prob)
return(1);
else
return(0);
}
float CMFGAView::randomperc()
{
jrand++;
if(jrand>=55)
{
jrand=1;
advance_random();
}
return((float)oldrand[jrand]);
}
int CMFGAView::rnd(int low, int high)
{
int i;
if(low>=high)
i=low;
else
{
i=(int)(randomperc()*(high-low+1))+low;
if(i>high) i=high;
}
return(i);
}
void CMFGAView::warmup_random(double random_seed)
{
int j1,ii;
double new_random,prev_random;
for(int j=0;j<=54;j++)
oldrand[j]=0.0;
jrand=0;
oldrand[54]=random_seed;
new_random=0.000000001;
prev_random=random_seed;
for(j1=1;j1<=54;j1++)
{
ii=(21*j1)%54;
oldrand[ii]=new_random;
new_random=prev_random-new_random;
if(new_random<0.0) new_random=new_random+1.0;
prev_random=oldrand[ii];
}
}
int CMFGAView::select()
{
double sum,pick;
int i;
pick=randomperc();
sum=0;
if(sumfitness!=0)
{
for(i=0;(sum<pick)&&(i<popsize);i++)
sum+=oldpop[i].fitness/sumfitness;
}
else
i=rnd(1,popsize);
return(i-1);
}
void CMFGAView::SetXYAxis(CDC *pDC, int x, int y)
{
pDC->MoveTo(x,y);
pDC->LineTo(x+1200,y);
pDC->MoveTo(x,y);
pDC->LineTo(x,y-12);
pDC->TextOut(x-27,y-17,"-2");
pDC->MoveTo(x+159,y);
pDC->LineTo(x+150,y-12);
pDC->TextOut(x+150-27,y-17,"-1");
pDC->MoveTo(x+150*2,y);
pDC->LineTo(x+150*2,y-12);
pDC->TextOut(x+150*2-27,y-17,"0");
pDC->MoveTo(x+150*3,y);
pDC->LineTo(x+150*3,y-12);
pDC->TextOut(x+150*3-27,y-17,"1");
pDC->MoveTo(x+150*4,y);
pDC->LineTo(x+150*4,y-12);
pDC->TextOut(x+150*4-27,y-17,"2");
pDC->MoveTo(x+150*5,y);
pDC->LineTo(x+150*5,y-12);
pDC->TextOut(x+150*5-27,y-17,"3");
pDC->MoveTo(x+150*6,y);
pDC->LineTo(x+150*6,y-12);
pDC->TextOut(x+150*6-27,y-17,"4");
pDC->MoveTo(x+150*7,y);
pDC->LineTo(x+150*7,y-12);
pDC->TextOut(x+150*7-27,y-17,"5");
pDC->MoveTo(x+150*8,y);
pDC->LineTo(x+150*8,y-12);
pDC->TextOut(x+150*8-27,y-17,"6");
//设置Y轴坐标
pDC->MoveTo(x,y);
pDC->LineTo(x,y+150*8);
pDC->MoveTo(x,y);
pDC->LineTo(x-12,y);
pDC->TextOut(x-120,y+10,"-80.00");
pDC->MoveTo(x,y+150*1);
pDC->LineTo(x-12,y+150*1);
pDC->TextOut(x-120,y+150+10,"-70.00");
pDC->MoveTo(x,y+150*2);
pDC->LineTo(x-12,y+150*2);
pDC->TextOut(x-120,y+150*2+10,"-60.00");
pDC->MoveTo(x,y+150*3);
pDC->LineTo(x-12,y+150*3);
pDC->TextOut(x-120,y+150*3+10,"-50.00");
pDC->MoveTo(x,y+150*4);
pDC->LineTo(x-12,y+150*4);
pDC->TextOut(x-120,y+150*4+10,"-40.00");
pDC->MoveTo(x,y+150*5);
pDC->LineTo(x-12,y+150*5);
pDC->TextOut(x-120,y+150*5+10,"-30.00");
pDC->MoveTo(x,y+150*6);
pDC->LineTo(x-12,y+150*6);
pDC->TextOut(x-120,y+150*6+10,"-20.00");
pDC->MoveTo(x,y+150*7);
pDC->LineTo(x-12,y+150*7);
pDC->TextOut(x-120,y+150*7+10,"-10.00");
pDC->MoveTo(x,y+150*8);
pDC->LineTo(x-12,y+150*8);
pDC->TextOut(x-120,y+150*8+10,"0.00");
//输出编辑的字符
pDC->TextOut(x-240,y+210*2+120,"dB");
pDC->TextOut(x+210*2+50,y-100,"Frequency(GHz)");
}
void CMFGAView::Display(CDC *pDC, double dis[], int a, int b)
{
for(int i=0;i<800;i++)
{
if(i>0) pDC->LineTo(a+i*1.4,b+150*8+15*dis[i]);
pDC->MoveTo(a+i*1.4,b+150*8+15*dis[i]);
}
}
void CMFGAView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
// TODO: Add your specialized code here and/or call the base class
SetScrollSizes(MM_LOMETRIC,CSize(2000,3000));//初始化滚动条
}
void CMFGAView::draws11(class bestever *ind)
{
int k=0;
int n=0;
int i=0,j=0;
double r,w;
double *m;
m=new double [N*N];
complex<double> cas;
complex<double> cA(1,0);
for(j=0;j<N*N;j++)
m[j]=ind->varible[j];
r=ind->varible[N*N];
complex<double> ss2(0,-2*sqrt(r*r));
complex<double> ss1(0,2*r);
matrix< complex<double> > cmatZ(N,N);
for( i=0;i<N;i++)
{
for( n=0;n<N;n++)
{
cmatZ(i,n)=complex<double> (0,0);
}
}
matrix< complex<double> > matM(N,N);
for( i=0;i<N;i++)
{
for( n=0;n<N;n++)
{
matM(i,n)=complex<double>(m[k],0);
k++;
}
}
matrix< complex<double> > cmatR(N,N);
for(i=0;i<N;i++)
{
for(n=0;n<N;n++)
{
if((i==0)&&(n==0))
cmatR(i,n)=complex<double> (0,-r);
else if((i==N-1)&&(n==N-1))
cmatR(i,n)=complex<double> (0,-r);
else
cmatR(i,n)=complex<double> (0,0);
}
}
matrix< complex<double> > matU(N,N);
for(i=0;i<N;i++)
{
for(n=0;n<N;n++)
{
if(i==n)
matU(i,n)=complex<double> (1,0);
else
matU(i,n)=complex<double> (0,0);
}
}
i=0;
for(w=-2;w<6;w+=0.01)
{
cmatZ=w*matU-(-cmatR)-(-matM);
MatrixInversionGS(cmatZ);
cas=cA+ss1*cmatZ(0,0);
ps1[i]=10.0*log10(abs(cas));
i++;
}
delete [] m;
m=NULL;
}
void CMFGAView::draws21(class bestever *indi)
{
int k=0;
int n=0;
int i=0,j=0;
double r,w;
double *m;
m=new double [N*N];
complex<double> cas;
complex<double> cA(1,0);
for(j=0;j<N*N;j++)
m[j]=indi->varible[j];
r=indi->varible[N*N];
complex<double> ss2(0,-2*sqrt(r*r));
complex<double> ss1(0,2*r);
matrix< complex<double> > cmatZ(N,N);
for( i=0;i<N;i++)
{
for( n=0;n<N;n++)
{
cmatZ(i,n)=complex<double> (0,0);
}
}
matrix< complex<double> > matM(N,N);
for( i=0;i<N;i++)
{
for( n=0;n<N;n++)
{
matM(i,n)=complex<double>(m[k],0);
k++;
}
}
matrix< complex<double> > cmatR(N,N);
for(i=0;i<N;i++)
{
for(n=0;n<N;n++)
{
if((i==0)&&(n==0))
cmatR(i,n)=complex<double> (0,-r);
else if((i==N-1)&&(n==N-1))
cmatR(i,n)=complex<double> (0,-r);
else
cmatR(i,n)=complex<double> (0,0);
}
}
matrix< complex<double> > matU(N,N);
for(i=0;i<N;i++)
{
for(n=0;n<N;n++)
{
if(i==n)
matU(i,n)=complex<double> (1,0);
else
matU(i,n)=complex<double> (0,0);
}
}
i=0;
for(w=-2;w<6;w+=0.01)
{
cmatZ=w*matU-(-cmatR)-(-matM);
MatrixInversionGS(cmatZ);
ps2[i]=10.0*log10(abs(ss2*cmatZ(N-1,0)));
i++;
}
delete [] m;
m=NULL;
}
void CMFGAView::keepbestind(class individual *opop)
{
int i,j,k;
double lmax;
lmax=opop[0].fitness;
for(j=0;j<popsize;j++)
{
if(opop[j].fitness>lmax)
{
for(k=0;k<N*N+1;k++)
{
for(i=0;i<chromsize;i++)
bestone.chrom[k][i]=opop[j].chrom[k][i];
}
bestone.fitness=opop[j].fitness;
}
}
}
void CMFGAView::delminind(class individual *oopop)
{
int j,k,i;
double lmin;
lmin=oopop[0].fitness;
for(j=0;j<popsize;j++)
{
if(oopop[j].fitness<lmin)
{
for(k=0;k<N*N+1;k++)
{
for(i=0;i<chromsize;i++)
oopop[j].chrom[k][i]=bestone.chrom[k][i];
}
oopop[j].fitness=bestone.fitness;
}
}
}
void CMFGAView::report()
{
int i,j;
fprintf(outfp,"bestgen:%d ",bestfit.generation);
fprintf(outfp,"bestfitness:%f \n",bestfit.fitness);
for(j=0;j<N*N+1;j++)
{
fprintf(outfp,"%f ",bestfit.varible[j]);
if((j+1)%N==0)
fprintf(outfp,"%;");
}
fprintf(outfp,"\n");
for(i=0;i<popsize;i++)
{
fprintf(outfp,"%d:",i+1);
for(j=0;j<N*N+1;j++)
fprintf(outfp,"%f ",newpop[i].varible[j]);
fprintf(outfp,"\n");
fprintf(outfp,"%f ",newpop[i].fitness);
fprintf(outfp,"\n");
}
}
void CMFGAView::OnSgaDraw()
{
// TODO: Add your command handler code here
PdsBtEn=1;
class individual *temp=NULL;
outfp=fopen("newpop.txt","w");
for(run=1;run<=maxruns;run++)
{
/*distribute to global data structure space */
initmalloc();
/*initialize random data generator*/
warmup_random(randomseed);
nmutation=0;
ncross=0;
bestfit.fitness=-1.0;
bestfit.generation=0;
/*initialize population,and statistic results*/
initpop();
statistics(oldpop);
for(gen=0;gen<maxgen;gen++)
{
fprintf(outfp,"\n%d/%d time run:current generation%d,total %d generation\n",run,maxruns,gen,maxgen);
keepbestind(oldpop);
/*produce new generation*/
generation();
delminind(newpop);
/*compute fitness statistic data of new generation population*/
statistics(newpop);
/*output statistic data of new generation*/
report();
temp=oldpop;
oldpop=newpop;
newpop=temp;
}
draws11(&bestfit);
draws21(&bestfit);
freeall();
}
CMFGADoc* pDoc = GetDocument();
pDoc->UpdateAllViews(NULL);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -