|
程序是求x1^2+x2^2的最大值,x1,x2取值范围在0-7中。最近学遗传算法自己编的,比较简单,方便大家搞懂。有不足的地方欢迎指出。具体的算法论坛里有,就不赘述了。
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define N 100 //进化代数
int w;
int m[N]; //随机数表
//求x1^2+x2^2的最大值,x1,x2取值范围在0-7中//
exchange(int a[],int b[],int n)
{
int i;
for(i=0;i<n;i++)
b[i]=a[i];
}
findmin(double a[6])
{
int j=0,i=0;
while(j!=5)
{
if(a[i]<=a[j+1])
j++;
else
i++;
}
return i;
}
findmax(double a[6])
{
int i=0,j=0;
while(j!=5)
{
if(a[i]>=a[j+1])
j++;
else
i++;
}
return i;
}
int suit(int a[6]) //适应性函数,这里直接为x1^2+x2^2的值
{
int x1,x2,y;
x1=2*2*a[0]+2*a[1]+a[2];
x2=2*2*a[3]+2*a[4]+a[5];
y=x1*x1+x2*x2;
return y;
}
int lp(double p[6],int n)//模拟轮盘,选择
{
int j=0;
double psum=0,lunpan;
lunpan=m[n]/32767.0;
while(j!=6)
{
psum+=p[j];
if(psum<lunpan)
j++;
else
return j;
}
}
void zajiao(int a[6],int b[6],int n)//杂交子函数
{
int i,j,t;
j=m[n]%6;
for(i=j;i<6;i++)
{
t=a[i];
a[i]=b[i];
b[i]=t;
}
}
void bianyi(int a[6],int n)//变异子函数
{
int j;
j=m[n]%6;
if(a[j]==0)
a[j]=1;
else
a[j]=0;
}
//****************************主函数*********************//
void main()
{
int j,i,u,v;
int a[6][6]= //初始化种群。这里为六个六位二进制数,即种群大小为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[6];
int max,min,sum=0;
double p[6];
srand((int)time(0));
for(w=0;w<N;w++) //产生随机数,储存在m数组中
{
m[w]=rand();
}
for(j=0;j<N;j++) //计算种群中每个个体的适应性,并求出相应的概率(储存在数组p中)
{ sum=0;
for(i=0;i<6;i++)
{
s[i]=suit(a[i]);
sum+=s[i];
}
for(i=0;i<6;i++)
{
p[i]=s[i]/sum;
}
min=findmin(p);
u=lp(p,rand()%10);//1-6中产生随机的两个序号u,v.
v=lp(p,j);
exchange(a[v],a[min],6);//剔除适应度最差的,复制为被选中的适应度较高的
if(m[j]/32767.0>0.8) //0.8为杂交率
zajiao(a[u],a[v],j); //杂交
if(m[j]/32767.0>0.01) //0.01为变异率
{
bianyi(a[u],j);//变异
}
}
max=findmax(s);
for(i=0;i<6;i++)
{
for(j=0;j<6;j++)
printf(" %d ",a[i][j]);
printf("\n");
}
printf("%d",suit(a[max]));//显示结果
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|