遗传算法(浮点数编码)

更新时间:2023-06-08 23:13:42 阅读: 评论:0

浮点数编码实现遗传算法
遗传算法主要包括三个主要操作,选择、交叉和变异。用浮点数编码进行运算,三种操作方法如下:
选择:
1. 计算
2. 计算
3. 庄子二则累计概率
4. 产生均匀分布0~1的随机数r
5. r比较,如果,则选择个体i进入到下一代新群体
6. 反复执行45,直至新群体的个体数目等于父代群体规模
交叉:
其中,是交叉之后的个体,是随机选择的两个个体,是交叉的一个常数, 取值为
变异:
是变异之后的个体,项羽有后代吗是变异之前的个体,k是变异的一个常数,取值为是个体的上限,是个体的下限,r是产生的随机数。
适应度线性变换:
其中F是原适应度,是变换之后的适应度,a,b是变换的系数。适应度线性变换要满足下面两个条件:
条件一:
条件二:                C=1.2~2
缩放时参数a,b的计算方法可以用如下方法:
如果满足:
就令:
否则:
实现代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
#define M 80                //种群数量
#define XMIN -1                //下限
#define XMAX 2                //上限
#define PI 3.1415926
#define PC 0.8                //交叉概率
#define PM 0.18                //变异概率
#define PA 0.01                //交叉因子
struct Node
{
    double Pmember;
    double Myfitness;        //Myfitness玫瑰情人节是适应度
    double Myfitsum;        //Myfitsum是适应度占总体适应度的百分比,然后从第一个个体往后累加,主要用于选择操作
}Nownode[M],Nextnode[M];    //本代群体和下一代群体
int nodeindex[M];            //交叉时随机配对,存放配对的群体下标
int T=0;
double fx(double x)            //根据x计算fx
{
早上起来舌苔厚白是怎么回事
    double y;
早安朋友圈说说    y=x*sin(10*PI*x)+2;
    //y=100-(x-5)*(x-5);
    return y;
}
int calfitness()            //计算适应度值
{
    int i;
    double minfitness,maxfitness,avefitness=0;
    double C=1.7,a,b;
    double temp;
    minfitness=Nownode[0].Myfitness=fx(Nownode[0].Pmember);
等腰梯形的判定
    maxfitness=minfitness;
    avefitness=maxfitness;
    for(i=1;i<M;i++)
    {   
        Nownode[i].Myfitness=fx(Nownode[i].Pmember);
        avefitness+=Nownode[i].Myfitness;
        if(minfitness>Nownode[i].Myfitness)
        {
            minfitness=Nownode[i].Myfitness;
        }
        if(maxfitness<Nownode[i].Myfitness)
        {
            maxfitness=Nownode[i].Myfitness;
        }
    }
   
    if(minfitness<0)//如果有负的适应度值,就把所以的适应度都加上一个数,使适应度全都为正数
    {
        temp=minfitness;
        Nownode[0].Myfitness+=-temp;
        avefitness=Nownode[0].Myfitness;
        maxfitness=Nownode[0].Myfitness;
        minfitness=Nownode[0].Myfitness;
        for(i=1;i<M;i++)
        {
            Nownode[i].Myfitness+=-temp;
            avefitness+=Nownode[i].Myfitness;
            if(minfitness>Nownode[i].Myfitness)
            {
                minfitness=Nownode[i].Myfitness;
            }
            if(maxfitness<Nownode[i].Myfitness)
            {
                maxfitness=Nownode[i].Myfitness;
            }   
        }
    }
    //适应度线性变换
    avefitness=avefitness/M;//计算平均适应度
    if(minfitness>(C*avefitness-maxfitness)/(C-1))
    {
        a=(C-1)*avefitness/(maxfitness-avefitness);
        b=(maxfitness-C*avefitness)*avefitness/(maxfitness-avefitness);
    }
    el
    {
秋葵花
        a=avefitness/(avefitness-minfitness);
        b=minfitness*avefitness/(avefitness-minfitness);
    }
    for(i=0;i<M;i++)
    {
        Nownode[i].Myfitness=a*Nownode[i].Myfitness+b;
    }
    Nownode[0].Myfitsum=Nownode[0].Myfitness;
    for(i=1;i<M;i++)
    {
        Nownode[i].Myfitsum=Nownode[i].Myfitness+Nownode[i-1].Myfitsum;//每一个Myfitsum都是自己的适应度加上前一个的Myfitsum
    }
    for(i=0;i<M;i++)
    {
        Nownode[i].Myfitsum=Nownode[i].Myfitsum/Nownode[M-1].Myfitsum;//每一个Myfitsum除以所有适应度之和,使Myfitsum0~1之间
    }
    return 0;
}
中学生优秀作文double randn()        //产生XMINXMAX之间的随机数
{
    return XMIN+1.0*rand()/RAND_MAX*(XMAX-XMIN);
}
int initpopulation()    //初始化种群

本文发布于:2023-06-08 23:13:42,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1027301.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:适应度   个体   群体   交叉   变异   选择
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图