遗传算法的C语言实现

//目标函数:y=(x1-1)^2+(x2-2)^2;
#include
#include
#include
#include
#define delta 3
#define T 200	//进化代数
#define N 200	//群体个数
#define INT 4	//整数基因长度
#define FLOAT 0//小数基因长度
#define MUTATE 0.005//基因突变率

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

void InitGroup();
double GetValue(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,double c=15) {
	return 2 * a * a - 3 * b * b - 4 * a + 5 * b + c;
}

//初始化种群
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) * delta; 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];
		}
	}
	for (int i = 0; i < N; i++) {
		value[i] = Function(GetValue(gene[i], 1), GetValue(gene[i], 2),GetValue(gene[i],3));
	}
}

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

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

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


//求十进制值
double GetValue(int a[(INT + FLOAT) * delta], int n) {
	int v = 0;
	double ans=0;
	for (int i = 1 + (INT + FLOAT) * (n - 1); i <= (INT + FLOAT) * n; i++) {
		if (a[i - 1] != 0) v += pow(2, (INT + FLOAT) * n - i);
	}
	ans = v / (double)pow(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) * delta; 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) * delta];
	for (int i = 0; i < N - 1; i += 2) {
		int pos = rand() % ((INT + FLOAT) * delta - 1) + 1;
		//printf("%d  ",pos);
		for (int k = 0; k < (INT + FLOAT) * delta; 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) * delta; 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),GetValue(gene[i],3));
	}
}

//基因突变 
void GeneMutate() {
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < (INT + FLOAT) * delta; 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),GetValue(gene[i],3));
	}
}

//输出答案 
void Answer() {
	printf("\n\n最大值是:%.0f\n", value[N - 1]);
	for(int i=0;i

这是一个别人写好的遗传算法,在此基础上修改为任意元遗传算法,但是其中套用的时候需要修改一些地方而不是只修改宏定义,除非将其中的参数列表写为...的形式,就不花这个时间了.

你可能感兴趣的:(算法)