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

📄 sga1.cpp

📁 基本遗传算法及其在函数优化中的应用
💻 CPP
📖 第 1 页 / 共 2 页
字号:
          
		  }
    
		}
       else if(FunctionMode==MINIMIZATION)
	   {
         if((population[i].value)<Cmax)
		 {
           temp=Cmax-population[i].value;
		 }
         else
		 {
           temp=0.0;
		 }
	   }
     population[i].fitness =temp;
	  }

}
/************************************************************************************************
*                           找到当前最优                                                        *
************************************************************************************************/
void FindBestWorstIndividual()
{
     int i;
     double sum=0.0;
     bestindividual=population[0];
     worstindividual=population[0];
     for(i=1;i<PopSize;i++)
      {
        if(population[i].fitness >bestindividual.fitness )
		{
          bestindividual=population[i];
          best_index=i;
		}
        else if(population[i].fitness<worstindividual.fitness )
		{
          worstindividual=population[i];
          worst_index=i;
		}
        sum+=population[i].fitness ;
	 }
     if(generation==0)
	 {
         currentbest=bestindividual;
     }
     else
	 {
         if(bestindividual.fitness >currentbest.fitness )
		 {
           currentbest =bestindividual;
		 }
	 }
}

/**************************************************************************************************
                     最优替换最差的
**************************************************************************************************/
void PerformEvolution()
{
     if(bestindividual.fitness >currentbest.fitness )
     {
         currentbest=population[best_index];
     }
     else
     {
         population[worst_index]=currentbest;
     }
}
/***********************************************************************************************
                      进行选择运算
*************************************************************************************************/
 void  SelectionOperator()
{
    int i,index;
    double p,sum=0.0;
    double cfitness[POPSIZE];//计算适应度
    struct individual newpopulation[POPSIZE];
    srand( (unsigned)time( NULL ) );//保证rand()每次产生的数不一样

    //计算相关适应度
    for(i=0;i<PopSize;i++)
    sum+=population[i].fitness ;//一代中所有染色体的适应度相加
    for(i=0;i<PopSize;i++)
    cfitness[i]=population[i].fitness/sum;//计算每个染色体的相关适应度
    //计算累计适应度
    for(i=1;i<PopSize;i++)
    cfitness[i]=cfitness[i-1]+cfitness[i];
    //进行选择操作
    for(i=0;i<PopSize;i++)
    {
        p=rand()%1000/1000.0;
        index=0;
        while(p>cfitness[index])//选择出相关适应度高的染色体
		{
          index++;
		} 
        newpopulation[i]=population[index];
	}
    for(i=0;i<PopSize;i++)//将选择的新的染色体赋值回population[i]
    {
        population[i]=newpopulation[i];
      // printf("%s\n",population[i].chrom);
	}
// printf("选择结束\n");
}

/*******************************************************************************
                 进行交叉运算
*********************************************************************************/
void CrossoverOperator()
{
    int i,j;
    int index[POPSIZE];
    int point,temp;
    double p;
    char ch;
    srand( (unsigned)time( NULL ) );//保证rand()每次产生的数不一样


    //进行随机交叉
    for(i=0;i<PopSize;i++)
    index[i]=i;
    for(i=0;i<PopSize;i++)
    {
       point=rand()%(PopSize-i);
       temp=index[i];
       index[i]=index[point+i];
       index[point+i]=temp;
    }
    //单点交叉
    for(i=0;i<PopSize;i+=2)
    {
        p=rand()%1000/1000.0;
        if(p<Pc)
		{
          point=rand()%(CHROMLENGTH-1)+1;//产生交叉位置
          for(j=point;j<CHROMLENGTH;j++)//从交叉位置以后进行交叉
		  {
            ch=population[index[i]].chrom[j];
            population[index[i]].chrom[j]=population[index[i+1]].chrom[j];
            population[index[i+1]].chrom[j]=ch;
		  }

		}
// printf("%s\n",population[i].chrom);
 // fprintf(fp,"%s\n",population[i].chrom);
	}
  //  printf("交叉结束\n");
    // fprintf(fp,"交叉结束\n");

}

/*********************************************************************************************
                        进行变异运算
**********************************************************************************************/
void MutationOperator()
{
    int i,j;
    double p;
    srand( (unsigned)time( NULL ) );//保证rand()每次产生的数不一样


    //位变异
    for(i=0;i<PopSize;i++)
    {
       for(j=0;j<CHROMLENGTH;j++)
	   {
            p=rand()%1000/1000.0;
            if(p<Pm)
			{
              population[i].chrom[j]=(population[i].chrom[j]=='0')?'1':'0';
			}
	   }
      // printf("%s\n",population[i].chrom);
	}
   // printf("变异结束\n");
}
/**********************************************************************************************
                           打印结果
***********************************************************************************************/
void OutputTextReport()
{
    int i;
    double sum;
    double average;
    sum=0.0;
    for(i=0;i<PopSize;i++)
    sum+=population[i].value ;
    average=sum/PopSize;
    printf("gen= %d,avg=%f, best=%f,",generation,average,currentbest.value );
    fprintf(fp,"\ngen:[%d]   avg:%f  best: %f\n",generation,average,currentbest.value);
	fprintf(fp,"currentbest.chrom=");
	
	for(i=0;i<CHROMLENGTH;i++)
    {
       printf("%c",currentbest.chrom[i]);
       fprintf(fp,"%C",currentbest.chrom[i]);
    }
    fprintf(fp,"\n");
	printf("\n");
}


⌨️ 快捷键说明

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