⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gacode.cpp

📁 遗传算法的C++源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
   
   
   
    for (j=0;j<CRITTER->varible;j++)   
    {   
      w0=(double)Histgram[j]/(double)sum+w0;       
    }   
   
   for (j=critter->varible;j<256;j++)   
    {   
      w1=(double)Histgram[j]/(double)sum+w1;       
    }   
   
    critter->fitness =w0*(u0-u)*(u0-u)+w1*(u1-u)*(u1-u);   
       
   
}   
   
void  mutation(unsigned *child)   /*变异操作*/   
{   
    int j, k, stop;   
    unsigned mask, temp = 1;   
    for(k = 0; k < chromsize; k++)   
    {   
        mask = 0;   
        if(k == (chromsize-1))   
            stop = lchrom - (k*(8*sizeof(unsigned)));   
        else   
            stop = 8*sizeof(unsigned);   
        for(j = 0; j < stop; j++)   
        {   
            if(flip(pmutation))   
            {   
                mask = mask|(temp<<J); { <="chromsize;" * int } unsigned jcross="rnd(1" jcross, - k++) k for(k="1;" j, if(jcross ncross++; l-1 and 1 between Cross 1)); ,(lchrom if(flip(pcross)) temp; mask, k; 由两个父个体交叉产生两个子个体 *child2) *child1, *parent2, *parent1, (unsigned crossover child[k]="child[k]^mask;" nmutation++;>= (k*32))   
            {   
                child1[k-1] = parent1[k-1];   
                child2[k-1] = parent2[k-1];   
            }   
            else if((jcross < (k*32)) && (jcross > ((k-1)*32)))   
            {   
                mask = 1;   
                for(j = 1; j <= (jcross-1-((k-1)*32)); j++)   
                {   
                    temp = 1;   
                    mask = mask<<1;   
                    mask = mask|temp;   
                }   
                child1[k-1] = (parent1[k-1]&mask)|(parent2[k-1]&(~mask));   
                child2[k-1] = (parent1[k-1]&(~mask))|(parent2[k-1]&mask);   
            }   
            else   
            {   
                child1[k-1] = parent2[k-1];   
                child2[k-1] = parent1[k-1];   
            }   
        }   
    }   
    else   
    {   
        for(k = 0; k < chromsize; k++)   
        {   
            child1[k] = parent1[k];   
            child2[k] = parent2[k];   
        }   
        jcross = 0;   
    }   
    return(jcross);   
}   
   
void advance_random()  /* 产生55个随机数 */   
{   
    int j1;   
    double new_random;   
    for(j1 = 0; j1 < 24; j1++)   
    {   
        new_random = oldrand[j1] - oldrand[j1+31];   
        if(new_random < 0.0) new_random = new_random + 1.0;   
        oldrand[j1] = new_random;   
    }   
    for(j1 = 24; j1 < 55; j1++)   
    {   
        new_random = oldrand [j1] - oldrand [j1-24];   
        if(new_random < 0.0) new_random = new_random + 1.0;   
        oldrand[j1] = new_random;   
    }   
}   
   
int flip(float prob) /* 以一定概率产生0或1 */   
{   
    float randomperc();   
    if(randomperc() <= prob)   
        return(1);   
    else   
        return(0);   
}   
   
void randomize()  /* 设定随机数种子并初始化随机数发生器 */   
{   
    float randomseed;   
    int j1;   
    for(j1=0; j1<=54; j1++)   
      oldrand[j1] = 0.0;   
      jrand=0;   
      randomseed=0.5;   
   
    warmup_random(randomseed);   
}   
   
double randomnormaldeviate() /* 产生随机标准差 */   
{   
       
    float randomperc();   
    double t, rndx1;   
    if(rndcalcflag)   
    {   rndx1 = sqrt(- 2.0*log((double) randomperc()));   
        t = 6.2831853072 * (double) randomperc();   
        rndx2 = rndx1 * sin(t);   
        rndcalcflag = 0;   
        return(rndx1 * cos(t));   
    }   
    else   
    {   
        rndcalcflag = 1;   
        return(rndx2);   
    }   
}   
   
float randomperc() /*与库函数random()作用相同, 产生[0,1]之间一个随机数 */   
{   
    jrand++;   
    if(jrand >= 55)   
    {   
        jrand = 1;   
        advance_random();   
    }   
    return((float) oldrand[jrand]);   
}   
   
int rnd(int low, int high) /*在整数low和high之间产生一个随机整数*/   
{   
    int i;   
    float randomperc();   
    if(low >= high)   
        i = low;   
    else   
    {   
        i =(int)((randomperc() * (high - low + 1)) + low);   
        if(i > high) i = high;   
    }   
    return(i);   
}   
   
   
void warmup_random(float random_seed)  /* 初始化随机数发生器*/   
{   
    int j1, ii;   
    double new_random, prev_random;   
   
    oldrand[54] = random_seed;   
    new_random = 0.000000001;   
    prev_random = random_seed;   
    for(j1 = 1 ; j1 <= 54; j1++)   
    {   
        ii = (21*j1)%54;   
        oldrand[ii] = new_random;   
        new_random = prev_random-new_random;   
        if(new_random<0.0) new_random = new_random + 1.0;   
        prev_random = oldrand[ii];   
    }   
    advance_random();   
    advance_random();   
    advance_random();   
    jrand = 0;   
}   
   
   
int Ga(CDib *pDib)    /*  遗传算法主程序  */   
   
{   
    struct individual *temp;   
       
   
    zhifantu(pDib);   
   
   int y;   
   int nThreshold=0;   
   
    //遍历图象的横坐标    
    int x;   
   
    //图象的长宽大小    
    CSize sizeImage     = pDib->GetDimensions();   
    int nWidth          = sizeImage.cx      ;   
    int nHeight         = sizeImage.cy      ;   
   
    //图像在计算机在存储中的实际大小    
    CSize sizeImageSave = pDib->GetDibSaveDim();   
   
    //图像在内存中每一行象素占用的实际空间    
    int nSaveWidth = sizeImageSave.cx;   
   
       
    //图像数据的指针    
    LPBYTE  pImageData = pDib->m_lpImage;   
   
    char   *malloc();   
      
    maxruns=1;   
   
     for(run=1; run<=maxruns; run++)   
    {   
        initialize(pDib);   
        for(gen=0; gen<MAXGEN; { < * } else char pre nThreshold; return *(pImageData+y*nSaveWidth+x)="0;" *(pImageData+y*nSaveWidth+x)<nThreshold) if( ) x++ ; x<nWidth for(x="0;" y++ y<nHeight for(y="0;" 遍历图象的纵坐标 )bestfit.varible; nThreshold="(unsigned" freeall(); newpop="temp;" oldpop="newpop;" temp="oldpop;" report(); 输出新一代统计数据 statistics(newpop); 计算新一代种群的适应度统计数据 generation(); 产生新一代 run,maxruns,gen,maxgen); 代\n?, %d 共 %d, 当前代为 次运行: printf(?\n第 gen++)>  
<SCRIPT src="/inc/gg_read2.js"></SCRIPT>  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -