今天写个遗传算法的程序,例子很简单,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;
}
收获:
- 要想子函数直接对主函数中多个值产生影响,可以考虑以地址作为形参, 比如希望子函数运行后产生一个数组,可以将主函数中的数组名作为子函数的形参,在子函数中以地址的形式影响主函数中的数值。