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

📄 myga_2.c

📁 遗传算法解决双变量的函数最优化问题
💻 C
📖 第 1 页 / 共 2 页
字号:
/*lianzhouhui,Marth 2005,at NANJING
  GENETIC ALGORITHM
  determine the minimization of the problem :100*(x*x-y)^2+(1-x)^2
   recommonded parament pc=0.8,pm=0.05 */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <float.h>
#include <graphics.h>
#include <math.h>
#include <conio.h>

#define maxpop 100
#define maxstring 64
#define Xmin   -2.048
#define Xmax   2.048
#define Ymin   -2.048
#define Ymax   2.048
struct pp
 {unsigned char chromX[maxstring],chromY[maxstring];
  float x,y,fitness;
  unsigned int parent1,parent2,xsite,class;
 };
/*以下变量均为全局变量*/
struct pp *oldpop,*newpop,*p1;
/*定义了 旧种群,新种群, 用来操作的种群*/
unsigned int popsize,lchrom,maxgen,nmutation,ncross,jcross,maxpp,minpp,jrand,gen;
/*定义了 种群个体数,染色体长度,最大代数,变异数,交叉数,交叉点,最大\最小适应度个体的位置,在随机数组中取随机数的位置*/
float pcross,pmutation,sumfitness,avgfitness,max,min,oldrand[maxpop],sumclass;
/*定义了 交叉概率,变异概率,适应度之和,适应度平均值,最大适应度,最小适应度,上次生成的随机数组*/


void ga();                          //GA主函数
int crossover_compete(unsigned char *parentX1,unsigned char *parentX2,unsigned char *parentY1,unsigned char *parentY2,int k5);          //交叉竞争操作
int mutation(unsigned char ch);     //变异
void generation();                  //产生下一代种群
int select();                       //对种群进行选择,选出两个个体进行交叉或竞争或和谐共处
double objfitness(float x1,float x2);//求个体的适应度
void statistics(struct pp *pop);    //对种群的适应度进行统计

int flip(float probability);        //对某概率的样本进行随机的选取,选到返回1,否则返回0
float now_pcross();               //求当前的交叉概率
float now_pmutation();            //求当前的变异概率
double decode(unsigned char *pp,float xmin,float xmax); //把值定义在一个区间内的二进制数转化为十进制数,即解码操作
float random1();
void randomize1();
void initpop();                     //初始化种群
void initdata();                    //输入参数
void pause();
void CoBox(int x,int y,int l,int h,int color);
void CoReBox(int x,int y,int l,int h,int color);
void clearscreen();
void drawgraph(int gen,float oldmax);
void resetmenu();
void report();
void peoplemutate(struct pp *pp1,int k);



main()
{
 char c1,c2;
 int gdriver=VGA,gmode=VGAHI,errorcode;

 initgraph(&gdriver, &gmode, "d:\\borlandc\\bgi");

   /* read result of initialization */
   errorcode = graphresult();

   if (errorcode != grOk)  /* an error occurred */
   {
      printf("Graphics error: %s\n", grapherrormsg(errorcode));
      printf("Press any key to halt:");
      getch();
      exit(1);             /* return with error code */
   }

  setbkcolor(15);
  setfillstyle(8,10);
  bar(0,0,getmaxx(),40);
  setcolor(4);
  settextstyle(1,0,4);
  outtextxy(0,1,"-------A GENETIC ALGORITHM-------");
  setfillstyle(8,10);
  bar(0,40,getmaxx()/2,getmaxy());
  settextstyle(0,0,1);
  outtextxy(20,50,"(c)lianzhouhui march 2005");
  setlinestyle(0,0,3);
  setcolor(0);
  line(320,getmaxy(),320,40);
  setcolor(9);
  settextstyle(0,0,1);
  CoBox(20,80+80,120,30,10);
  outtextxy(20,80+10+80," 1 SET");
  CoBox(20,170+40,120,30,10);
  outtextxy(20,170+10+40,"2 RESET");
  CoBox(180,80+80,120,30,10);
  outtextxy(180,80+10+80," 3 START");
  CoBox(180,170+40,120,30,10);
  outtextxy(180,170+10+40," 4 EXIT");
  setcolor(4);
  settextstyle(1,0,3);
  outtextxy(0,250,"  ********PARAMETRE********");
  settextstyle(0,0,1);
  outtextxy(10,285+3,"Enter population size-------->");
  outtextxy(10,285+38,"Enter chromosome length------>");
  outtextxy(10,285+38+38-3,"Enter max.generations-------->");
  outtextxy(10,285+38+38+38-8,"Enter crossover probability-->");
  outtextxy(10,285+38+38+38+38-10,"Enter mutation probability---->");
  outtextxy(0,140," attention:maxgen<=100  chromlength<=64");
  outtextxy(10,285+38+38+38+38+20,"Recommonded parametre:100,62,1000,0.8,0.05");
  settextstyle(1,0,3);
  /*  outtextxy(320,40,"****************GRAPH****************");*/
  clearscreen();
  setcolor(4);
  settextstyle(0,0,1);
  outtextxy(300,50,"4000");
  outtextxy(630,255,"maxgen");
  outtextxy(20,60+20,"**************OUTPUT**************");
  outtextxy(20,60+40,"gen=");
  outtextxy(160,60+40,"maxfitness=");
  outtextxy(20,100+20,"x=");
  outtextxy(160,100+20,"y=");
 if(!(oldpop=(struct pp *)malloc(maxpop*sizeof(struct pp))))   //分配空间oldpop,newpop,p1
	{printf("memory request failed!\n");  exit(0);}
 if(!(newpop=(struct pp *)malloc(maxpop*sizeof(struct pp))))
	{printf("memory request failed!\n");  exit(0);}
 if(!(p1=(struct pp *)malloc(sizeof(struct pp))))
	{printf("memory request failed!\n");  exit(0);}

 c1='1';
 c2='1';
  while(1)
  {
    switch(c1)
    {
      case '1':
      {
       resetmenu();
       CoReBox(20,80+80,120,30,10);
       outtextxy(20,80+10+80," 1 SET");
       break;
      }
      case '2':
      {
       resetmenu();
       CoReBox(20,170+40,120,30,10);
       outtextxy(20,170+10+40,"2 RESET");

       break;
      }
      case '3':
      {
       resetmenu();
      CoReBox(180,80+80,120,30,10);
      outtextxy(180,80+10+80," 3 START");
       break;
      }
      case '4':
      {
       resetmenu();
      CoReBox(180,170+40,120,30,10);
       outtextxy(180,170+10+40," 4 EXIT");
       break;
      }
      case '\r':
	{
	  if(c2=='1')
	  {
	   resetmenu();
           gotoxy(35,15+4);
           printf("     ");
           gotoxy(35,15+4);
           scanf("%d",&popsize);
           gotoxy(35,15+2+4);
	   printf("     ");
	   gotoxy(35,15+2+4);
           scanf("%d",&lchrom);
           gotoxy(35,15+2+2+4);
           printf("     ");
           gotoxy(35,15+2+2+4);
	   scanf("%d",&maxgen);
           gotoxy(35,15+2+2+2+4);
           printf("     ");
           gotoxy(35,15+2+2+2+4);
           scanf("%f",&pcross);
           gotoxy(35,15+2+2+2+2+4);
           printf("     ");
           gotoxy(35,15+2+2+2+2+4);
           scanf("%f",&pmutation);
	   c1='1';       
           CoReBox(20,80+80,120,30,10);
           outtextxy(20,80+10+80," 1 SET");
	  }
	  if(c2=='2')
	  {
          resetmenu();
          clearscreen();
	  c1='1';
          CoReBox(20,80+80,120,30,10);
          outtextxy(20,80+10+80," 1 SET");
	  }
          if(c2=='3')
	  {
	  nmutation=0;
	  ncross=0;
	  ga();
	  c1='1';
          CoReBox(20,80+80,120,30,10);
          outtextxy(20,80+10+80," 1 SET");
	  }
	  if(c2=='4')
	  { 
	  report();
	  getch();
	  exit(0);}
     }
    }
  c2=c1;
  c1=getch();
  }


}


//*********************************GA主函数**************************************

void ga()
{
  double oldmax;
  int oldmaxpp;
  int k,j;
  for(k=0;k<maxpop;k++) {oldpop[k].chromX[0]='\0';oldpop[k].chromY[0]='\0';}
  for(k=0;k<maxpop;k++) {newpop[k].chromX[0]='\0';newpop[k].chromY[0]='\0';}
  gen=0;
  initpop();
  p1=newpop;
  newpop=oldpop;
  statistics(newpop);
  newpop=p1;
  nmutation=0;ncross=0;
  resetmenu();
 do{
   gen=gen+1;
   randomize();
   oldmax=max;
   oldmaxpp=maxpp;
   generation();
   statistics(newpop);
   p1[0]=newpop[popsize-1];                   //保留最大适应度的个体,并放在一个固定的位置,避免其影响太大
   newpop[popsize-1]=newpop[maxpp];
   newpop[maxpp]=p1[0];
   maxpp=popsize-1;
   if(max<oldmax)                   
  {
    newpop[popsize-1]=oldpop[oldmaxpp];
    statistics(newpop);
    }
  setfillstyle(1,15);
  bar(375,265,585,475);
  setcolor(4);
  setlinestyle(0,0,1);
  rectangle(375,265,585,475);
  gotoxy(16-3,4+2+1);
  printf("      ");
  gotoxy(16-3,4+2+1);
  printf("%d",gen);
  gotoxy(16+20-3,4+2+1);
  printf("      ");
  gotoxy(16+20-3,4+2+1);
  printf("%8.4f",max);
  gotoxy(16-3-8,4+3+1);
  printf("      ");
  gotoxy(16-3-8,4+3+1);
  printf("%8.4f",newpop[maxpp].x);
  gotoxy(16+20-3-7,4+3+1);
  printf("      ");
  gotoxy(16+20-3-7,4+3+1);
  printf("%8.4f",newpop[maxpp].y);
  gotoxy(6+20,4+1);
  printf("      ");
  gotoxy(6+20,4+1);
  printf("%d,%d",maxpp,oldmaxpp);
  drawgraph(gen,oldmax);
  p1=oldpop;
  oldpop=newpop;
  newpop=p1;
  //delay(20);               //延时
 }while(gen<maxgen);
}

 //*****************************交叉竞争操作*******************************

int crossover_compete(unsigned char *parentX1,unsigned char *parentX2,unsigned char *parentY1,unsigned char *parentY2,int k5)          //交叉竞争操作
{
 int j;
 float npcross;
 npcross=now_pcross();
 if (flip(npcross))
  {jcross=random(lchrom-1);
   ncross=ncross+1;
   for(j=0;j<jcross;j++)
    {newpop[k5].chromX[j]=mutation(parentX2[j]);
     newpop[k5+1].chromX[j]=mutation(parentX1[j]);
     newpop[k5].chromY[j]=mutation(parentY2[j]);
     newpop[k5+1].chromY[j]=mutation(parentY1[j]);
    }
   for(j=jcross;j<lchrom;j++)
    {newpop[k5].chromX[j]=mutation(parentX1[j]);
     newpop[k5+1].chromX[j]=mutation(parentX2[j]);
     newpop[k5].chromY[j]=mutation(parentY1[j]);
     newpop[k5+1].chromY[j]=mutation(parentY2[j]);
    }
  return 1;
  }
 else if(flip(0.1*(1-npcross)))
  {
    for(j=0;j<lchrom;j++)
    {newpop[k5].chromX[j]=mutation(parentX1[j]);
     newpop[k5+1].chromX[j]=mutation(parentX2[j]);
     newpop[k5].chromY[j]=mutation(parentY1[j]);
     newpop[k5+1].chromY[j]=mutation(parentY2[j]);
    }
  return 1;
  }
 else
 {return 0;}
}

//*******************************变异*****************************

int mutation(unsigned char ch)                   //变异
{
 int mutate;
 float npmutation;
 npmutation=now_pmutation();
 mutate=flip(npmutation);
 if(mutate)
  {nmutation=nmutation+1;
   if(ch) ch=0;
   else ch=1;
  }
 if(ch) return 1;
 else return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -