⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mfgaview.cpp

📁 混沌遗传算法应用于微波滤波器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -