遗传算法初学习

写了个求10个数的最大和,取值范围啥0-99,因为状态空间比较大,所以变异概率选的0.3,大一点,交叉概率0.8,种群大小100,遗传代数1000

效果的话,不是很理想,距离990的极限还有不小的差距

可以看到,只有8次在950以上,并且,在遗传代数增加到10000以后,效果并没有明显增加,挺失败的

#include<bits/stdc++.h>
using namespace std;
const double by=0.3;//变异概率
const double jh=0.8;//自由交换概率
const int max_size=100;
const int max_d=100000;
int sum;
struct node{
    int v[10];
    int fitness;
    void col(){
        fitness=0;
        for(int i=0;i<10;i++)
            fitness+=v[i];
    }
}now[105],Max,Min;
//分别是种群,临时的,最大个体,最小个体

//生成初始种群
void init(){
    for(int i=0;i<max_size;i++){
        for(int j=0;j<10;j++)
          now[i].v[j]=rand()%100;
    }
}

void js(){
    sum=0;
    Max.fitness=-1;Min.fitness=0x3f3f3f3f;
    for(int i=0;i<max_size;i++){
        now[i].col();
        if(now[i].fitness>Max.fitness)Max=now[i];
        if(now[i].fitness<Min.fitness)Min=now[i];
        sum+=now[i].fitness;
    }

}

//打印某个个体
void print_o(node a){
    for(int i=0;i<10;i++)
      printf("%d ",a.v[i]);

    printf("   ->  %d\n",a.fitness);
}

//打印当前所有种群
void print(){
    for(int i=0;i<max_size;i++)
      print_o(now[i]);
}

int rand_id(){
    int d=rand()%(sum+1);
    int cnt=0;
    for(int i=0;i<max_size;i++){
        cnt+=now[i].fitness;
        if(cnt>=d)return i;
    }
    return rand()%max_size;
}

double randd(){
    double ans=rand()%1000;
    ans/=1000;
    return ans;
}
void tran(){
    js();
    //找到最优个体
    int tmp=0,i,j,pos;
    for(int i=1;i<max_size;i++)
        if(now[i].fitness>now[tmp].fitness)
            tmp=i;
    for(int k=0;k<max_size;k+=2){
        //选择交叉个体
        i=rand_id();
        j=rand_id();
        //交叉位置
        pos=rand()%10;
        //交换
        if(randd()<jh){
            swap(now[k].v[pos],now[j].v[pos]);
            swap(now[k].v[pos],now[i].v[pos]);
        }
        //变异
        if(randd()<by){
            pos=rand()%10;
            now[k].v[pos]=rand()%100;
        }
    }
    js();
    int id=0;
    for(int i=1;i<max_size;i++)
      if(now[id].fitness>now[i].fitness)
        id=i;
    now[id]=Max;
}

void ga(){
    int cnt=0;
    while(cnt<max_d){
        tran();cnt++;

    //    print();
    //    puts("\n\n");
    }
    int ans=now[0].fitness;
    for(int i=0;i<max_size;i++)ans=max(ans,now[i].fitness);
    printf("%d\n",ans);
}

int main(){
    srand((unsigned)time(NULL));
    for(int i=1;i<=15;i++){
        printf("Case %d: \n",i);
        init();
        ga();
    }
    return 0;
}

时间: 2024-12-19 18:39:47

遗传算法初学习的相关文章

UGUI初学习--------Canvas

今天仔细研究了一下UGUI觉得有必要写一篇文章来分享一下.废话不多说直接开码字..... 作者之前也学过NGUI.这里来说明一下,UGUI和NGUI的渲染结构略有不同,UGUI中将NGUI中的深度处理项取消了.UGUI的渲染是按照Hierarchy的UI游戏对象的排列顺序从上到下依次渲染的,重叠部分后渲染的会把先渲染的挡住.总结一句话:下在上前,子在父前.为了修改各个UI控件的绘制顺序,开发者可以采用以下两种方法:拖动Hierarchy视图里的各UI控件对象,改变它们在Canvas下的排列顺序:

C语言初学习(3)

题目:计算字符串中的单词数.单词:由空格分开的连续字母数字串. 分析:这个就一目了然了,题目提示已经很清楚了,那就判断空格呗~简单是简单,所以我们不妨用指针来完成它! 不多说,一起来看代码~ 代码: 1 #include<stdio.h> 2 void str_n(char *s) 3 { 4 int i,j=0; 5 for(i=0;i<100;i++) 6 { 7 if(*s++==32) //数空格 8 { 9 j++; 10 } 11 } 12 printf("单词数为

C语言初学习(4)

题目:求a和b的最大公约数 分析:首先我们要知道最大公约数是什么,就是指两个或多个整数共有约数中最大的一个.好了,知道了最大公约数是什么,就可以求解它了,那么就相当于比较俩个数的约数,取其相等的最大的一个就对了,是吧?约数是啥???约数就是能把a或者b整除的数呗~ 好了~一起来看看代码吧~ 代码: 1 #include<stdio.h> 2 void gcd(long int a,long int b) //子函数求gcd 3 { 4 long int i,t=0,j=0,k=0,max,q=

C语言初学习(1)

题目:对于任意正整数都可以找出至少一串连续奇数,它们的和等于该整数的立方.以下程序验证[2,20]之间的数满足这一性质. 分析:首先得出该整数num的立方n.对于这一连串的奇数,我们不能确定它的个数,但我们可以分析出它的个数不会超过这个整数num(这个应该可以理解~).那么我们就可以得到一个范围那就是1到num之间的奇数,但至于到底有几个呢?好像不好得到.没关系,用for()循环来帮忙.让它遍历从1到num的所以的奇数,用变量sum来存放它们的和,并依次与立方n进行比较,如果相等了,那这就对了,

Linux初学习之 rm 命令

现在我们来仔细的学习一下linux的rm命令,这个命令顾名思义(我猜的,嘻嘻,是remove) 命令格式: rm [OPTION]... FILE... Remove (unlink) the FILE(s). 就是删除文件(们),至于unlink是什么以后再去讨论了 OPTION: -f,  --force           ignore nonexistent files, never prompt 忽略不存在的文件,不提醒-i,  --interactive     prompt bef

初学习C语言

初学C语言的朋友应该首先了解C语言关键的核心概念(结构化.三个执行流程.优先级.指针.文件.共用体.函数.作用域.重载等 ),只有弄明白了这些才能在今后的学习中游刃有余的把握C语言的精髓.这几个概念就像逻辑线一样,把整个C语言的体系贯穿起来,给人一种"结构化"的思想体系.下面我简要谈一下这几个核心概念. 1.从宏观角度来看,结构化是C语言的编程思想基础,就是说C语言每一个功能模块就是一个结构,每一个结构实现一个运算或一个算法,这个结构就用大括号表示"{ }",大括号

Jquery 插件初学习

参考文章:插件开发精品教程,让你的jQuery提升一个台阶 刚刚学了一下jquery的插件插件开发,写个demo记录.练习一下.毕竟,输出才是最好的学习. 这个也不过是最基础的一个插件写法,只是,自己觉得当学习一样东西的时候,学习一些基础,在以后使用到的时候,再去根据实际情况好好的专研,提升自己的能力.这个也只是个人的一个学习方法,有更好的欢迎推荐哈. 所以,下面的这个jquery的插件写法,真心是基础到不行不行的...(*^__^*) css部分: #my_alert{line-height:

linux系统下mysql配置优化初学习入门

学习mysql 一段时间了,在mysql配置优化方面做一下总结,mysql优化要考虑到多方面,多因素.与服务器的硬件,当前运行的环境都息息相关.下面来说一下mysql的配置优化: [client] port = 3306 socket = /tmp/mysql.sock    [mysqld] port = 3306 socket = /tmp/mysql.sock   basedir = /usr/local/mysql datadir = /data/mysql pid-file = /da

2018.2.21 Python 初学习

折腾了一天,一直在用CMD学习Python写Hello World.偶然间发现可以用Pycharm.也算是给后面想学习的人提个醒,方便省事许多. format()使用方法. age = 20name = 'Swaroop'print('{0} was {1} years old when he wrote this book'.format(name, age))print('Why is {0} playing with that python?'.format(name)) # 对于浮点数