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

📄 youwozainijiubuyonggandaohaipa.c

📁 遗传算法在模式识别、神经网络、图像处理、机器学习、工业优化控制、自适应控制、生物科学、社会科学等方面都得到应用。
💻 C
字号:
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#define POPSIZE 500   //
#define length1 10
#define chromlength length1  //染色体长度

int point;
int popsize;        //种群大小
int maxgeneration;  //最大世代数
double pc;          //交叉率
double pm;          //变异率
struct individual
{
char  chrom[chromlength+1];//  
double value;         
double fitness;      //适应度
};
int generation;      //世代数
int best_index;
int worst_index;
struct individual bestindividual;  //最佳个体
struct individual worstindividual; //最差个体
struct individual currentbest;
struct individual population[POPSIZE];





//函数声明                                       
void generateinitialpopulation(); //产生初始种群                
void generatenextpopulation();//进化到下一代
void evaluatepopulation();//评价
long decodechromosome(char *,int);//给一个解码
void calculateobjectvalue();//计算X
void calculatefitnessvalue();//计算X平方,做适应度
void findbestandworstindividual();////求最佳个体和最差个体
void performevolution();//演示评价结果,计算最优和最差个体
void selectoperator();//选择
void crossoveroperator();//交叉
void mutationoperator();//这是变异率的操作
void input();//数据输入
void outputtextreport();//数据输出




void generateinitialpopulation( )  //种群初始化
{
	int i,j;
    for (i=0;i<popsize; i++)
	{
		for(j=0;j<chromlength;j++)
		{
			population[i].chrom[j]=(rand()%10);//rand产生0--9的数
		}
		population[i].chrom[chromlength]='\0';
		printf("%d",population[i].chrom[chromlength]);
	}
}
void generatenextpopulation()  //生成下一代
{
	selectoperator();
	crossoveroperator();
	mutationoperator();
}
void evaluatepopulation()   //评价个体,求最佳个体
{
	calculateobjectvalue();//计算函数值, x
	calculatefitnessvalue();	//shiyinshiying适应度x2
	findbestandworstindividual();//查找最优最劣个体
}
long decodechromosome(char *string ,int length) //给染色体解码,
{										//,染色体编码的形式是 以单个整形数字排列起来的字符串
	int i;
	char*pointer;
	long decimal=0;
    for(i=0,pointer=string;i<length;i++,pointer++)//
	
		{decimal +=(*pointer)* (long) pow(10,length-i+1);}
	return (decimal);
}
void calculateobjectvalue()  //计算函数值              
{
	int i;
	long temp1,temp2;
    
    for (i=0; i<popsize; i++)
	{
		 temp1=decodechromosome(population[i].chrom,length1);
         temp2=decodechromosome(population[i].chrom,length1);
         
			population[i].value=sqrt (temp1+temp2);


	}
}

void calculatefitnessvalue()//计算适应度
{
	int  i;
   
   for(i=0;i<popsize;i++)
   {
 
		population[i].fitness=population[i].value;//temp;
	}

}

void findbestandworstindividual( ) //求最佳个体和最差个体
{
	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;//第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() //演示评价结果   evolution结果
{
	if (bestindividual.fitness>currentbest.fitness){
		currentbest=population[best_index];
	}
	else{
		population[worst_index]=currentbest;
	}
}
void selectoperator() //轮盘赌选择算法
{
	int i,index;
	double p,sum=0.0;
	double cfitness[POPSIZE];//适应比
    struct individual newpopulation[POPSIZE];
	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]=newpopulation[i];
	}
}
void crossoveroperator() //交叉算法
{
	int i,j;
	int index[POPSIZE];
	int point,temp;// 随机产生point
	double p;
	char ch;
    for (i=0;i<popsize;i++){   //popsize种群的个体数
		index[i]=i;
	}
		for (i=0;i<popsize;i++)
		{
		point=rand()%(popsize-i);//从“point”位开始交换
		temp=index[i];
		index[i]=index[point+i];
		index[point+i]=temp;
	}

    for (i=0;i<popsize-1;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;
			}
		}
	}

}
void mutationoperator() //变异操作
{
	int i,j;
	double p;
	for (i=0;i<popsize;i++)
	{
		for(j=0;j<chromlength;j++)
		{
			p=rand()%1000/1000.0;
			point=rand()%10;

			j=point;
			if (p<pm)
			{
				switch(population[i].chrom[j])
				{
				case 9: population[i].chrom[j]=0;break;
				case 8: population[i].chrom[j]=1;break;
				case 7: population[i].chrom[j]=2;break;
				case 6: population[i].chrom[j]=3;break;
				case 5: population[i].chrom[j]=4;break;
				case 4: population[i].chrom[j]=5;break;
				case 3: population[i].chrom[j]=6;break;
				case 2: population[i].chrom[j]=7;break;
				case 1: population[i].chrom[j]=8;break;
				default: population[i].chrom[j]=9;
				}
			}
		}
	}
}
void input() //数据输入
{   printf("初始化全局变量:\n");
	printf("    种群大小(50-500):");
   scanf("%d", &popsize);
    if((popsize%2) != 0)
    {printf( "   种群大小已设置为偶数\n");
	popsize++;};
    printf("     最大世代数(100-300):");
   scanf("%d", &maxgeneration);
   printf("     交叉率(0.2-0.99):");
   scanf("%f", &pc);
   printf("     变异率(0.001-0.1):");
   scanf("%f", &pm);
}
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("当前世代=%d\n当前世代平均函数值=%f\n当前世代最高函数值=%d\n",generation,average,population[best_index].value);
}
void main()    //主函数
{   int i;
    
    generation=0;
    input();
    generateinitialpopulation();
	evaluatepopulation();
	while(generation<maxgeneration)
	{
		generation++;
		generatenextpopulation();
		evaluatepopulation();
		performevolution();
		outputtextreport();
	}
    printf("\n");
	printf("         统计结果:        ");
    printf("\n");
    printf("当前最优值等于:%d\n",currentbest.fitness);
	printf("其染色体编码为:");
	for (i=0;i<chromlength;i++)
	{
	printf("%d",currentbest.chrom[i]);
	}
    printf("\n"); 
}

⌨️ 快捷键说明

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