遗传算法C++实现

 

 

云枕青山塔影斜,湖楼放舟摇柳叶。

春风吹荷花未歇,长醉梦中各华颠。   

                                    ------敬 子瞻

遗传算法是美国的J.Holland教授和他的学生于1975年受生物进化论的启发而提出并建立发展起来的。现在在诸多研究领域都有其应用。

主要涉及TSP求解问题;后来研究者的改进遗传算法也有很多。

遗传算法借鉴的是生物进化过程,遵循“适者生存”的规律。流程大概如下:

 

Step1

输入:种群大小、染色体长度、交叉概率、变异概率、停止规则

Step2

初始化种群

Step3

计算个体适应度

Step4

选择操作

Step5

交叉操作

Step6

变异操作

 

关于Step5和Step6,也有很多改进规则。

参数定义:

#define POP_SIZE 600 // 群体大小
#define MAX_GEN 1000 // 最大迭代次数
#define PC 0.99		 // 交叉概率
#define PM 0.2		 // 变异概率
#define VariableNum 7 //
#define alpha 0.6	 // 隐含的算法选择压力

变异实现代码:

void CAlgorithm::mutation(double x[POP_SIZE][VariableNum + 1])
{
	for (int i = 0; i < POP_SIZE; i++)
	{
		for (int j = 0; j < VariableNum; j++)
		{
			if (rand() / 32767.0 < PM)
			{
				switch (rand()%3)
				{
				case 0:
				{
					x[i][j] = Boundary[j][0] + (Boundary[j][1] - Boundary[j][0]) * rand() / 32767.0;
					break;
				}
				case 1:
				{
					x[i][j] = x[i][j] + (Boundary[j][1] - x[i][j]) * rand() / 32767.0;
					break;
				}
				case 2:
				{
					x[i][j] = Boundary[j][0] + (x[i][j] - Boundary[j][0]) * rand() / 32767.0;
					break;
				}
				default:
					break;
				}
			}
		}
	}
}

交叉操作:

void CAlgorithm::intercrose(double x[POP_SIZE][VariableNum + 1])
{
	int RandData[POP_SIZE], n[VariableNum], TempInt;

	double RandDouble[VariableNum], RandDouble2[VariableNum], TempDouble;

	SearchRandData(RandData);

	for (int j = 0; j < POP_SIZE - 1; j += 2)
	{
		switch (rand()%3)
		{
		case 0:
		{
			SearchRandData2(n);
			if (n[0] > n[1])
			{
				TempInt = n[0];
				n[0] = n[1];
				n[1] = TempInt;
			}
			for (int k = n[0]; k <= n[1]; k++)
			{
				TempDouble = x[RandData[j]][k];
				x[RandData[j]][k] = x[RandData[j + 1]][k];
				x[RandData[j + 1]][k] = TempDouble;

			}
			break;
		}
		case 1:
		{
			for (int k = 0; k < VariableNum; k++)
			{
				if (rand() / 32767.0 > 0.5)
				{
					x[RandData[j]][k] = x[RandData[j + 1]][k];
				}
				else
					x[RandData[j + 1]][k] = x[RandData[j]][k];
			}
			break;
		}
		case 2:
		{
			for (int k = 0; k < VariableNum; k++)
			{
				RandDouble[k] = x[RandData[j]][k];
				RandDouble2[k] = x[RandData[j + 1]][k];
			}
			TempDouble = rand() / 32767.0;
			for (int k = 0; k < VariableNum; k++)
			{
				x[RandData[j]][k] = RandDouble[k] + (RandDouble2[k] - RandDouble[k]) * TempDouble;
				x[RandData[j + 1]][k] = RandDouble2[k] + (RandDouble[k] - RandDouble2[k]) * TempDouble;
			}
			break;
		}

		default:
			break;
		}
	}
}

实验结果:

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
免疫遗传算法是一种基于免疫系统的优化算法,其主要思想是将生物免疫系统的进化和自适应机制运用到优化问题求解中。下面是一个简单的免疫遗传算法的C语言实现: ```c #include <stdio.h> #include <stdlib.h> #include <time.h> #define POP_SIZE 20 // 种群规模 #define CHROM_LENGTH 20 // 染色体长度 #define MAX_ITER 1000 // 最大迭代次数 #define MUT_RATE 0.1 // 变异率 // 定义染色体结构体 typedef struct tagChrom { int gene[CHROM_LENGTH]; double fit; } Chrom; // 初始化种群 void initialize(Chrom *pop) { int i, j; for (i = 0; i < POP_SIZE; i++) { for (j = 0; j < CHROM_LENGTH; j++) { pop[i].gene[j] = rand() % 2; } pop[i].fit = 0.0; } } // 计算适应度 void evaluate(Chrom *pop) { int i, j; double sum; for (i = 0; i < POP_SIZE; i++) { sum = 0.0; for (j = 0; j < CHROM_LENGTH; j++) { sum += pop[i].gene[j]; } pop[i].fit = sum / CHROM_LENGTH; } } // 选择操作 void select(Chrom *pop, Chrom *new_pop) { int i, j, k, r1, r2; double sum_fit, r, accu_fit[POP_SIZE]; // 计算适应度总和 sum_fit = 0.0; for (i = 0; i < POP_SIZE; i++) { sum_fit += pop[i].fit; } // 计算累计适应度 accu_fit[0] = pop[0].fit / sum_fit; for (i = 1; i < POP_SIZE; i++) { accu_fit[i] = accu_fit[i - 1] + pop[i].fit / sum_fit; } // 选择 for (i = 0; i < POP_SIZE; i++) { r = (double)rand() / RAND_MAX; for (j = 0; j < POP_SIZE; j++) { if (r <= accu_fit[j]) { new_pop[i] = pop[j]; break; } } } } // 交叉操作 void crossover(Chrom *pop, Chrom *new_pop) { int i, j, k, p1, p2, cp; for (i = 0; i < POP_SIZE; i += 2) { p1 = rand() % POP_SIZE; p2 = rand() % POP_SIZE; cp = rand() % (CHROM_LENGTH - 1) + 1; for (j = 0; j < cp; j++) { new_pop[i].gene[j] = pop[p1].gene[j]; new_pop[i + 1].gene[j] = pop[p2].gene[j]; } for (j = cp; j < CHROM_LENGTH; j++) { new_pop[i].gene[j] = pop[p2].gene[j]; new_pop[i + 1].gene[j] = pop[p1].gene[j]; } } } // 变异操作 void mutate(Chrom *pop) { int i, j; for (i = 0; i < POP_SIZE; i++) { for (j = 0; j < CHROM_LENGTH; j++) { if ((double)rand() / RAND_MAX < MUT_RATE) { pop[i].gene[j] = 1 - pop[i].gene[j]; } } } } // 打印种群 void print_pop(Chrom *pop) { int i, j; for (i = 0; i < POP_SIZE; i++) { for (j = 0; j < CHROM_LENGTH; j++) { printf("%d ", pop[i].gene[j]); } printf("%.2f\n", pop[i].fit); } } int main() { Chrom pop[POP_SIZE], new_pop[POP_SIZE]; int iter; srand(time(NULL)); // 初始化种群 initialize(pop); // 迭代 for (iter = 0; iter < MAX_ITER; iter++) { // 计算适应度 evaluate(pop); // 选择 select(pop, new_pop); // 交叉 crossover(pop, new_pop); // 变异 mutate(new_pop); // 更新种群 for (int i = 0; i < POP_SIZE; i++) { pop[i] = new_pop[i]; } } // 打印最终种群及其适应度 print_pop(pop); return 0; } ``` 这段代码实现了免疫遗传算法的基本操作,包括初始化种群、计算适应度、选择、交叉和变异。在实际应用中,还需要根据具体问题对算法进行改进和优化。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值