brb2010 发表于 2012-10-16 19:49:06

发一个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));//显示结果
}

3050311118 发表于 2012-10-16 20:40:56

这么简易的遗传算法能实现那些传说中的遗传算法功能不

brb2010 发表于 2012-10-16 20:49:08

原理就是那些。不过针对其他的问题,对个体重新编码,程序的其他部分相应做些调整就好了。
页: [1]
查看完整版本: 发一个c语言编的遗传算法的小程序