• 大小: 11KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2021-06-16
  • 语言: C/C++
  • 标签: 遗传算法  

资源简介

用C++实现的遗传算法求函数的最大值,可运行

资源截图

代码片段和文件信息

#include   
#include   
#include   
#include   
#include   
  
typedef struct Chrom                           // 结构体类型,为单个染色体的结构;  
{  
    short int bit[6];//一共6bit来对染色体进行编码,其中1位为符号位。取值范围-64~+64  
    int fit ;//适应值  
    double rfit;//相对的fit值,即所占的百分比  
    double cfit;//积累概率  
}chrom;                                         
//定义将会用到的几个函数;  
void *evpop (chrom popcurrent[4]);//进行种群的初始化  
int x (chrom popcurrent);  
int y (int x);  
void *pickchroms (chrom popcurrent[4]);//选择操作  
void *pickchroms_new (chrom popcurrent[4]); // 基于概率分布  
void *crossover (chrom popnext[4]);//交叉操作  
void *mutation (chrom popnext[4]);//突变  
double r8_uniform_ab ( double a double b int &seed );//生成a~b之间均匀分布的数字  
chrom popcurrent [4];                        // 初始种群规模为;  
chrom popnext [4];                           // 更新后种群规模仍为;  
void main ()                                    // 主函数;  
{  
    int num ;                                    // 迭代次数;  
    int i j lMax k;  
    Max=0;                                      // 函数最大值  
  
    printf(“\nWelcome to the Genetic Algorithm!\n“);  //   
    printf(“The Algorithm is based on the function y = -x^2 + 5 to find the maximum value of the function.\n“);  
  
enter:printf (“\nPlease enter the no. of iterations\n请输入您要设定的迭代数 : “);  
    scanf(“%d“ &num);                           // 输入迭代次数,传送给参数 num;  
  
    if(num <1)                                    
        goto enter ;                                 // 判断输入的迭代次数是否为负或零,是的话重新输入;  
    //不同的随机数可能结果不同??那是当所设置的迭代次数过少时,染色体的基因型过早地陷入局部最优  
    srand(time(0));    
    evpop(popcurrent );    // 随机产生初始种群;  
    //是否需要指定x的取值范围呢?6bit来表示数字,第一位为符号位,5bit表示数字大小。所以,取值范围为-32~+31  
    Max = popcurrent[0].fit;//对Max值进行初始化  
  
    for(i =0;i< num;i ++)                          // 开始迭代;  
    {  
  
        printf(“\ni = %d\n“ i);                 // 输出当前迭代次数;  
  
        for(j =0;j<4; j++)  
        {  
            popnext[j ]=popcurrent[ j];           // 更新种群;  
        }  
  
        pickchroms(popnext );                    // 挑选优秀个体;  
        crossover(popnext );                     // 交叉得到新个体;  
        mutation(popnext );                      // 变异得到新个体;  
  
        for(j =0;j<4; j++)   
        {  
            popcurrent[j ]=popnext[ j];              // 种群更替;  
        }  
  
    }  // 等待迭代终止;  
//对于真正随机数是需要注意取较大的迭代次数  
    for(l =0;l<3; l++)  
    {  
        if(popcurrent [l]. fit > Max )  
        {  
            Max=popcurrent [l]. fit;  
            k=x(popcurrent [l]);//此时的value即为所求的x值  
        }  
  
    }  
    printf(“\n 当x等于 %d时,函数得到最大值为: %d “k Max);  
    printf(“\nPress any key to end ! “ );  
  
    flushall();                                 // 清除所有缓冲区;  
    getche();                                   // 从控制台取字符,不以回车为结束;  
  
}                                               
  
  
  
void *evpop (chrom popcurrent[4])   // 函数:随

评论

共有 条评论