进击的小白Day012——遗传算法(一)

今天写个遗传算法的程序,例子很简单,y=x^3,x∈[0,101],求y最大时x的值,今天实现到累积概率的计算。

贴代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#define M 6  /*种群规模*/

/*十进制转二进制*/
int Transform(int n)
{
	int result = 0, k = 1, i, temp;
	temp = n;
	while (temp) 
	{
		i = temp % 2;
		result = k * i + result;
		k = k * 10;
		temp = temp / 2;
	}
	return result;
}

/*产生随机初始种群*/
void Creat(int *a)
{
	int i;

	/*设定随机种子数*/
	srand(time(NULL));

	/*产生随机数*/
	for (i = 0; i < M; i++)
	{
		/*产生一定范围内的随机数*/
		a[i] = rand() % 102 + 0;
		//printf("a=%d\n", a[i]);
	}
}

/*产生0-1的随机数*/
void reCreat(double *a)
{
	int i;

	/*设定随机种子数*/
	srand((double)time(NULL));

	/*产生随机数*/
	for (i = 0; i < M; i++)
	{
		/*产生一定范围内的随机数*/
		a[i] = rand() / (double)(RAND_MAX);;
		printf("a=%lf\n", a[i]);
	}
}

/*适应度*/
void Adapt(int *a, double *P, double *Q)
{
	int b[M];
	int sum = 0;
	int i;

	for (i = 0; i < M; i++)
	{
		b[i] = pow(a[i], 3);
		sum += b[i];
	}

	for (i = 0; i < M; i++)
	{
		P[i] = (double)b[i] / (double)sum;
	}
	
	for (i = 1, Q[0] = P[0]; i < M; i++)
	{
		Q[i] = Q[i - 1] + P[i];
	}
}

void XX(double *r, double *Q)
{
	int i;
	for (i = 0; i < M; i++)
	{
		if (r[i] > 0 && r[i] < Q[0])
		{
			
		}
		else if (r[i] > Q[0] && r[i] < Q[1])
		{
			
		}
		else if (r[i] > Q[1] && r[i] < Q[2])
		{
			
		}
		else if (r[i] > Q[2] && r[i] < Q[3])
		{
			
		}
		else if (r[i] > Q[3] && r[i] < Q[4])
		{
			
		}
		else
		{
			
		}
	}
}

int main(void)
{
	int population[M];
	double P[M], Q[M];
	double r[M];
	int i;

	Creat(population);
	
	printf("初始种群为:");
	for (i = 0; i < M; i++)
	{
		printf("s%d=%d  ",i + 1 , population[i]);
	}
	printf("\n");

	Adapt(population, P, Q);

	printf("选择概率为:");
	for (i = 0; i < M; i++)
	{
		printf("P(%d)=%lf  ",i + 1 , P[i]);
	}
	printf("\n");

	printf("累积概率为:");
	for (i = 0; i < M; i++)
	{
		printf("Q(%d)=%lf  ", i + 1, Q[i]);
	}
	printf("\n");

	reCreat(r);

	return 0;
}

收获:

  1. 要想子函数直接对主函数中多个值产生影响,可以考虑以地址作为形参, 比如希望子函数运行后产生一个数组,可以将主函数中的数组名作为子函数的形参,在子函数中以地址的形式影响主函数中的数值。

猜你喜欢

转载自blog.csdn.net/u011232393/article/details/84108847