遗传算法(求函数极值)简易代码C语言200行

思路:

//目标函数:y=(x1-1)^2+(x2-2)^2;
#include<stdio.h>
#include<time.h>
#include<windows.h>
#define T 2000	//进化代数
#define N 200	//群体个数
#define INT 8	//整数基因长度
#define FLOAT 20	//小数基因长度
#define MUTATE 0.005	//基因突变率

int t=0;	//代数计数
int gene[N][(INT+FLOAT)*2];	//基因
double value[N];	//函数值
double ratio[N];	//适应度概率区间
int pair[N];	//随机配对规则
int totalRate=0;

void InitGroup();
double GetValue(int[],int);
int Mi(int,int);
void SortGroup();
void Output();
double Function(float,float);
void PairGroup();
void GeneMutate();
void Answer();

int main() {
	InitGroup();
	Output();
	while((t++)!=T) {
		GeneMutate();
		SortGroup();
		PairGroup();
	}
	SortGroup();
	Output();
	Answer();
}

//目标函数
double Function(double a,double b) {
	return -(a-1)*(a-1)-(b-2)*(b-2)+2;
}

//初始化种群
void InitGroup() {
	for(int i=1; i<=N; i++) {
		totalRate+=i*i;
	}
	srand((unsigned)time(0));
	for(int i=0; i<N; i++) {
		for(int j=0; j<(INT+FLOAT)*2; j++) {
			gene[i][j]=rand()%2;
		}
	}
	for(int i=0; i<N; i++) {
		if(i==0) {
			ratio[i]=(i+1)*(i+1)/(double)totalRate;
		} else {
			ratio[i]=(i+1)*(i+1)/(double)totalRate;
			ratio[i]+=ratio[i-1];
		}
		//printf("%f\n",ratio[i]);
	}
	for(int i=0; i<N; i++) {
		value[i]=Function(GetValue(gene[i],1),GetValue(gene[i],2));
	}
}

//输出种群信息
void Output() {

	printf("个体基因:\n");
	for(int i=0; i<N; i++) {
		printf("【");
		for(int j=0; j<(INT+FLOAT)*2; j++) {
			if(j==INT) printf(",");
			else if(j==INT+FLOAT) printf("】,【");
			else if(j==INT*2+FLOAT) printf(",");
			printf("%d",gene[i][j]);
		}
		printf("】\n");
	}

	printf("个体数值:\n");
	for(int i=0; i<N; i++) {
		printf("%d: %f + %f -> %.16f\n",i,GetValue(gene[i],1),GetValue(gene[i],2),value[i]);
	}
}

//求a的b次方
int Mi(int a,int b) {
	int ans=1;
	for(int i=0; i<b; i++) {
		ans*=a;
	}
	return ans;
}

//求十进制值
double GetValue(int a[(INT+FLOAT)*2],int n) {
	int v=0;
	double ans;
	if(n==1) {
		for(int i=1; i<=INT+FLOAT; i++) {
			if(a[i-1]!=0) v+=Mi(2,INT+FLOAT-i);
		}
		ans=v/(double)Mi(2,FLOAT);
	} else if(n==2) {
		for(int i=1+INT+FLOAT; i<=(INT+FLOAT)*2; i++) {
			if(a[i-1]!=0) v+=Mi(2,(INT+FLOAT)*2-i);
		}
		ans=v/(double)Mi(2,FLOAT);
	}
	return ans;
}

//计算适应度并排序
void SortGroup() {
	for(int i=0; i<N; i++) {
		for(int j=0; j<N-1; j++) {
			if(value[j]>value[j+1]) {
				double b=value[j];
				value[j]=value[j+1];
				value[j+1]=b;
				for(int k=0; k<(INT+FLOAT)*2; k++) {
					int a=gene[j][k];
					gene[j][k]=gene[j+1][k];
					gene[j+1][k]=a;
				}
			}
		}
	}
}

//基因自由组合 
void PairGroup() {
	float b;
	//printf("\n配对规则:");
	for(int i=0; i<N; i++) {
		b=rand()/(RAND_MAX+1.0);
		for(int j=0; j<N; j++) {
			if(ratio[j]>=b) {
				pair[i]=j;
				//printf("%d  ",pair[i]);
				break;
			}
		}
	}
	//printf("\n分割位置:");
	int gene1[N][(INT+FLOAT)*2];
	for(int i=0; i<N-1; i+=2) {
		int pos=rand()%((INT+FLOAT)*2-1)+1;
		//printf("%d  ",pos);
		for(int k=0; k<(INT+FLOAT)*2; k++) {
			gene1[i][k]=gene[pair[i]][k];
			gene1[i+1][k]=gene[pair[i+1]][k];
		}
		for(int j=0; j<pos; j++) {
			int a=gene1[i][j];
			gene1[i][j]=gene1[i+1][j];
			gene1[i+1][j]=a;
		}
	}
	for(int i=0; i<N; i++) {
		for(int j=0; j<(INT+FLOAT)*2; j++) {
			gene[i][j]=gene1[i][j];
		}
	}
	for(int i=0; i<N; i++) {
		value[i]=Function(GetValue(gene[i],1),GetValue(gene[i],2));
	}
}

//基因突变 
void GeneMutate() {
	for(int i=0; i<N; i++) {
		for(int j=0; j<(INT+FLOAT)*2; j++) {
			if(rand()/(RAND_MAX+1.0)<MUTATE) {
				gene[i][j]=(gene[i][j]+1)%2;
			}
		}
	}
	for(int i=0; i<N; i++) {
		value[i]=Function(GetValue(gene[i],1),GetValue(gene[i],2));
	}
}

//输出答案 
void Answer() {
	printf("\n\n最大值是:%.16f\n",value[N-1]);
	printf("此时,x1=%f, x2=%f\n",GetValue(gene[N-1],1),GetValue(gene[N-1],2));
}

运行结果:

 

 

 

  • 7
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
遗传算法是一种模拟自然进化过程的优化算法,它通过模拟基因的交叉与变异来生成新的个体,并通过适应度选择策略筛选保留优秀的个体,从而逐步优化解问题。下面是用遗传算法求函数最大值问题的C语言实现过程: 首先,需要定义个体编码方式,即表示一个解的数据结构,通常使用二进制编码。将函数的自变量范围进离散化,将每个自变量编码为一串二进制数表示。 其次,需要初始化种群,生成一定数量的个体作为初始解,可以随机生成,也可以利用问题特点进合理的初始设计。 然后,从初始化的种群中选择优秀个体,通过计算个体的适应度函数来评估个体的优劣程度。适应度函数通常选择与目标函数有关的衡量标准,例如即将解的函数。 接下来,通过选择操作,根据适应度函数选择一部分优秀的个体作为父代,来进交叉与变异操作产生子代。交叉操作将两个个体的染色体进交换,变异操作则是对某个个体的染色体进随机变动。 最后,不断迭代上述步骤,通过多代的进化,逐步优化种群中的个体,使其适应度不断提高,直到达到终止条件,例如达到一定需要的迭代次数或者找到满足要最优解。 综上所述,通过遗传算法可以解决函数最大值解问题。根据问题具体要,可以灵活地调整适应度函数的构造、交叉和变异的策略等。 请注意,上述只是对遗传算法函数最大值问题的大致过程进了简要描述,实际应用中需要对具体问题进更多的细节优化和相关设置。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值