遗传算法应用实例

本文介绍了遗传算法在生物学背景下的基本原理,强调了环境选择、基因交叉和变异在生物多样性中的作用。接着,通过一个实例展示了如何使用遗传算法解决数组分割问题,目标是选取数组中10个元素,使它们的值接近数组总值的1/10。文章详细阐述了适应度计算、个体选择、交叉因子计算和变异等关键步骤,并提到了主函数和其他辅助函数的调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

生物学中的遗传

假设将一个种群放到一个新的环境中,在环境不变的情况下,种群中适应环境的个体的基因遗传到下一代的概率就会大,不适应环境的个体的基因遗传到下一代的概率就会小,在进行N次迭代后,种群中不适应环境的基因就会逐渐消失,保留下来的都是对环境适应度高的基因。
但仅仅依靠外部的环境选择是远远不能达到我们现在的生物的多样性的,因为生物的遗传过程中还存在着基因的交叉互换和基因的变异。

遗传算法所能解决的问题

遗传算法无法确定性的给出问题的具体解,因为在遗传过程中存在着不确定因素,但能够保证在迭代次数足够多的时候,能给出问题的近似解。如果求的是最优解问题,遗传算法不一定能够得到最优解,但可以得到相对较优的解。所以,该算法适用于对解的精确度要求不高的一些问题。在概率计算中应用较广。

生物遗传图解

在这里插入图片描述

遗传算法图解

在这里插入图片描述

代码实现解决数组分割问题

一个有100个整数的数组中取10个元素,使得这10个元素的值接近于数组总值的1/10

适应度计算

//arr[][]表示选择出来的种群,这里是10和数组长度为10的二维数组
//mid 表示数组总和的1/10
//yarr 表示原来的数组
int Suff(int arr[ROW][COL],int mid,int len,int n,int *yarr,double *suf)
{
   
   
	double suff = 0;
	int num = 0;							//子数组的和
	for(int i = 0; i < n; i++)
	{
   
   
		num = Sum(arr[i],len,yarr);			//求arr[i]数组中10个元素的和
		num = abs(num-mid);				//子数组和减去原数组的和的1/10
		if (num == 0)
		{
   
   
			return i;					//如果找到满足条件子数组,直接返回,不再迭代
		}
		suff += (double)1/num;			//累加总的适应度
		num = 0;						//循环求解
	}
	*suf = suff;					//将总的适应度带回
	return -1;						//返回总的适应度
}

Sum 求和函数

int Sum(int *arr,int len,int *yarr)
{
   
   
	int sum = 0;
	for(int i = 0; i < len; i++)
	{
   
   
		sum += yarr[arr[i]];		//arr[]中存放的是yarr总数组的下标
	}
	return sum;
}

选择进入下一代的个体

//选择算子设计 选出下一代个体
//index[] 记录进入下一代的个体
void Subarrs(int arr[ROW][COL],int mid,double suff
				,int n,int len,int index[LEN],int *yarr)
{
   
   
	double corona[LEN] = {
   
   0};
	int num = 0;
	//通过轮盘赌的方法构造一个数组,将数组分段,每个段代表一个个体进入下一代的概率
	//如果此处不明白,可自行查看轮盘赌构造方法
	for(int i = 0; i < LEN; i++)					//构造轮盘
	{
   
   
		num = Sum
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值