发一个c语言编的遗传算法的小程序
程序是求x1^2+x2^2的最大值,x1,x2取值范围在0-7中。最近学遗传算法自己编的,比较简单,方便大家搞懂。有不足的地方欢迎指出。具体的算法论坛里有,就不赘述了。#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define N 100 //进化代数
int w;
int m; //随机数表
//求x1^2+x2^2的最大值,x1,x2取值范围在0-7中//
exchange(int a[],int b[],int n)
{
int i;
for(i=0;i<n;i++)
b=a;
}
findmin(double a)
{
int j=0,i=0;
while(j!=5)
{
if(a<=a)
j++;
else
i++;
}
return i;
}
findmax(double a)
{
int i=0,j=0;
while(j!=5)
{
if(a>=a)
j++;
else
i++;
}
return i;
}
int suit(int a) //适应性函数,这里直接为x1^2+x2^2的值
{
int x1,x2,y;
x1=2*2*a+2*a+a;
x2=2*2*a+2*a+a;
y=x1*x1+x2*x2;
return y;
}
int lp(double p,int n)//模拟轮盘,选择
{
int j=0;
double psum=0,lunpan;
lunpan=m/32767.0;
while(j!=6)
{
psum+=p;
if(psum<lunpan)
j++;
else
return j;
}
}
void zajiao(int a,int b,int n)//杂交子函数
{
int i,j,t;
j=m%6;
for(i=j;i<6;i++)
{
t=a;
a=b;
b=t;
}
}
void bianyi(int a,int n)//变异子函数
{
int j;
j=m%6;
if(a==0)
a=1;
else
a=0;
}
//****************************主函数*********************//
void main()
{
int j,i,u,v;
int a= //初始化种群。这里为六个六位二进制数,即种群大小为6.(前三位为X1后三位为x2)。
{
{1,0,0,0,0,0},
{1,0,0,0,0,1},
{0,0,0,0,1,1},
{0,1,0,0,0,0},
{0,0,1,1,0,0},
{1,0,1,1,1,0}
};
double s;
int max,min,sum=0;
double p;
srand((int)time(0));
for(w=0;w<N;w++) //产生随机数,储存在m数组中
{
m=rand();
}
for(j=0;j<N;j++) //计算种群中每个个体的适应性,并求出相应的概率(储存在数组p中)
{ sum=0;
for(i=0;i<6;i++)
{
s=suit(a);
sum+=s;
}
for(i=0;i<6;i++)
{
p=s/sum;
}
min=findmin(p);
u=lp(p,rand()%10);//1-6中产生随机的两个序号u,v.
v=lp(p,j);
exchange(a,a,6);//剔除适应度最差的,复制为被选中的适应度较高的
if(m/32767.0>0.8) //0.8为杂交率
zajiao(a,a,j); //杂交
if(m/32767.0>0.01) //0.01为变异率
{
bianyi(a,j);//变异
}
}
max=findmax(s);
for(i=0;i<6;i++)
{
for(j=0;j<6;j++)
printf(" %d ",a);
printf("\n");
}
printf("%d",suit(a));//显示结果
} 这么简易的遗传算法能实现那些传说中的遗传算法功能不 原理就是那些。不过针对其他的问题,对个体重新编码,程序的其他部分相应做些调整就好了。
页:
[1]