搜索
bottom↓
回复: 2

发一个c语言编的遗传算法的小程序

[复制链接]

出0入0汤圆

发表于 2012-10-16 19:49:06 | 显示全部楼层 |阅读模式
程序是求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碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

发表于 2012-10-16 20:40:56 | 显示全部楼层
这么简易的遗传算法  能实现那些传说中的遗传算法功能不

出0入0汤圆

 楼主| 发表于 2012-10-16 20:49:08 | 显示全部楼层
原理就是那些。不过针对其他的问题,对个体重新编码,程序的其他部分相应做些调整就好了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 18:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表