QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2641|回复: 9
打印 上一主题 下一主题

免疫算法

[复制链接]
字体大小: 正常 放大
kelimasa        

7

主题

5

听众

188

积分

升级  44%

  • TA的每日心情
    开心
    2012-9-10 21:57
  • 签到天数: 53 天

    [LV.5]常住居民I

    跳转到指定楼层
    1#
    发表于 2011-12-18 19:02 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    染色体(即可能解的序号)定义一个概率(关键步骤)
    %%%%%%%%%%%%%%%好的染色体概率高,坏的概率低。依据误差functionError计算概率
    [p,trueP]=chromosomeProbability(functionError);
    if trueP =='Fail'
    '可能解严重不适应方程,请重新开始'
    return%结束程序
    end
    %%%%%%%%%%%%%%%7:按照概率筛选染色体(关键步骤)
    %fa=bin2dec(fatherChromosomeGroup)%显示父染色体
    %从父染体中选择优秀染色体
    %selecteChromosomeGroup=selecteChromosome(fatherChromosomeGroup,p);
    %%%%%%%%%%%%%%%8:染色体杂交(关键步骤)
    %sle=bin2dec(selecteChromosomeGroup)%显示选择出来的解的序号(染色体)
    %用概率筛选出的染色体selecteChromosomeGroup进行杂交,产生子代染色体
    %sonChromosomeGroup=crossChromosome(selecteChromosomeGroup,2);
    %不用概率筛选出的染色体selecteChromosomeGroup进行杂交,而直接用上一代(父代)的
    sonChromosomeGroup=crossChromosome(fatherChromosomeGroup,2);
    %sonChromosomeGroup=immunity(fatherChromosomeGroup,holdBestChromosome,3);
    %把疫苗接种到其它染色体中
    sonChromosomeGroup=immunity(sonChromosomeGroup,holdBestChromosome,3);
    %cro=bin2dec(sonChromosomeGroup)%显示杂交后的子代染色体
    sonChromosomeGroup=checkSequence(sonChromosomeGroup,solutionN);%检查杂交后的染色体是否越界
    %%%%%%%%%%%%%%%9:变异
    %不杂交直接变异
    %fatherChromosomeGroup=varianceCh(fatherChromosomeGroup,0.1,solutionN);
    %杂交后变异
    fatherChromosomeGroup=varianceCh(sonChromosomeGroup,0.5,solutionN);
    fatherChromosomeGroup=checkSequence(fatherChromosomeGroup,solutionN);%检查变异后的染色体是否越界
    end

     

    接种疫苗函数,这是和遗传算法唯一不同的函数,可以用它代替染色体的交叉操作。

    %chromosomeGroup:染色体组
    %bachterinChromosome:疫苗染色体,即最好的染色体。从这个染色体上取疫苗
    %parameter:接种疫苗的参数,即用什么方法接种
    %inoculateChromosome:接种疫苗后的染色体
    function inoculateChromosome=immunity(chromosomeGroup,bacterinChromosome,parameter)
    [chromosomeGroupSum,chromosomeLength]=size(chromosomeGroup);
    [row,bacterinChromosomeLength]=size(bacterinChromosome);
    %chromosomeGroupSum:染色体的条数;chromosomeLength:染色体的长度
    switch parameter
    case 1%随机选择染色体进行接种
    for i=1:chromosomeGroupSum
    %%%%%%%%%%%%从疫苗染色体上定位疫苗
    headDot=fix(rand(1)*bacterinChromosomeLength);
    %疫苗在染色体上左边的点位
    if headDot==0%防止出现0点位
    headDot=1;
    end
    tailDot=fix(rand(1)*bacterinChromosomeLength);
    %疫苗在染色体上右边的点位
    if tailDot==0%防止出现0点位
    tailDot=1;
    end
    if tailDot>headDot%防止右边的点位大于左边的点位
    dot=headDot;
    headDot=tailDot;
    tailDot=dot;
    end
    %%%%%%%%%%%%%接种
    randChromosomeSequence=round(rand(1)*chromosomeGroupSum);
    %随机产生1条染色体的序号,对这条染色体进行接种
    if randChromosomeSequence==0%防止产生0序号
    randChromosomeSequence=1;
    end
    inoculateChromosome(i,:)...%先把输入染色体传给输出
    =chromosomeGroup(randChromosomeSequence,:);
    %执行免疫,即从疫苗染色体上取出一段基因做疫苗,再注入到其它染色体中
    inoculateChromosome(i,headDot:tailDot)...
    =bacterinChromosome(1,headDot:tailDot);
    end
    case 2 %所有染色体挨个接种
    for i=1:chromosomeGroupSum
    %%%%%%%%%%%%从疫苗染色体上定位疫苗
    headDot=fix(rand(1)*bacterinChromosomeLength);
    %疫苗在染色体上左边的点位
    if headDot==0%防止出现0点位
    headDot=1;
    end
    tailDot=fix(rand(1)*bacterinChromosomeLength);
    %疫苗在染色体上右边的点位
    if tailDot==0%防止出现0点位
    tailDot=1;
    end
    if tailDot>headDot%防止右边的点位大于左边的点位
    dot=headDot;
    headDot=tailDot;
    tailDot=dot;
    end
    %%%%%%%%%%%%%接种
    inoculateChromosome(i,:)=chromosomeGroup(i,:);%先把输入染色体传给输出
    %执行免疫,即从疫苗染色体上取出一段基因做疫苗,再注入到其它染色体中
    inoculateChromosome(i,headDot:tailDot)...
    =bacterinChromosome(1,headDot:tailDot);
    end
    case 3 %接种位置是随机的
    for i=1:chromosomeGroupSum
    %%%%%%%%%%%%从疫苗染色体上定位疫苗
    headDot=fix(rand(1)*bacterinChromosomeLength);
    %疫苗在染色体上左边的点位
    if headDot==0%防止出现0点位
    headDot=1;
    end
    tailDot=fix(rand(1)*bacterinChromosomeLength);
    %疫苗在染色体上右边的点位
    if tailDot==0%防止出现0点位
    tailDot=1;
    end
    if tailDot>headDot%防止右边的点位大于左边的点位
    dot=headDot;
    headDot=tailDot;
    tailDot=dot;
    end
    %%%%%%%%%%%%%在染色体上随机定位接种位置
    inoculateDot=fix(rand(1)*chromosomeLength);%随机选择染色体的接种点位
    if inoculateDot==0
    inoculateDot=1;
    inoculateChromosome(i,:)=chromosomeGroup(i,:);
    inoculateChromosome(i,inoculateDot:tailDot-headDot+1)...
    =bacterinChromosome(1,headDot:tailDot);
    elseif inoculateDot<=headDot
    inoculateChromosome(i,:)=chromosomeGroup(i,:);
    inoculateChromosome(i,inoculateDot:inoculateDot+tailDot-headDot)...
    =bacterinChromosome(1,headDot:tailDot);
    elseif (chromosomeLength-inoculateDot)>=(tailDot-headDot)
    inoculateChromosome(i,:)=chromosomeGroup(i,:);
    inoculateChromosome(i,inoculateDot:inoculateDot+tailDot-headDot)...
    =bacterinChromosome(1,headDot:tailDot);
    else
    inoculateChromosome(i,:)=chromosomeGroup(i,:);
    inoculateChromosome(i,headDot:tailDot)...
    =bacterinChromosome(1,headDot:tailDot);
    end
    end
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信

    857

    主题

    21

    听众

    1598

    积分

  • TA的每日心情
    开心
    2012-7-27 21:03
  • 签到天数: 99 天

    [LV.6]常住居民II

    群组第二届数模基础实训

    群组Matlab讨论组

    回复

    使用道具 举报

    0

    主题

    6

    听众

    221

    积分

    升级  60.5%

  • TA的每日心情

    2014-6-1 15:45
  • 签到天数: 103 天

    [LV.6]常住居民II

    群组第一期sas基础实训课堂

    回复

    使用道具 举报

    2

    主题

    4

    听众

    103

    积分

    升级  1.5%

  • TA的每日心情
    郁闷
    2012-3-9 13:59
  • 签到天数: 27 天

    [LV.4]偶尔看看III

    群组数学建摸协会

    回复

    使用道具 举报

    qukaito        

    0

    主题

    4

    听众

    155

    积分

    升级  27.5%

  • TA的每日心情
    难过
    2012-4-23 23:21
  • 签到天数: 24 天

    [LV.4]偶尔看看III

    自我介绍
    多多学习 天天向上
    回复

    使用道具 举报

    0

    主题

    12

    听众

    8

    积分

    升级  3.16%

  • TA的每日心情
    开心
    2014-10-31 09:57
  • 签到天数: 1 天

    [LV.1]初来乍到

    回复

    使用道具 举报

    4

    主题

    10

    听众

    141

    积分

    升级  20.5%

  • TA的每日心情
    开心
    2014-12-21 14:51
  • 签到天数: 22 天

    [LV.4]偶尔看看III

    国际赛参赛者

    群组科技写作基础培训

    群组Matlab讨论组

    群组环境-数学-建模群

    回复

    使用道具 举报

    盐田港        

    1

    主题

    11

    听众

    22

    积分

    升级  17.89%

  • TA的每日心情
    慵懒
    2017-6-6 17:55
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    邮箱绑定达人 新人进步奖

    回复

    使用道具 举报

    liwenhui        

    70

    主题

    65

    听众

    5195

    积分

    独孤求败

  • TA的每日心情
    擦汗
    2018-4-26 23:29
  • 签到天数: 1502 天

    [LV.Master]伴坛终老

    自我介绍
    紫薇软剑,三十岁前所用,误伤义士不祥,乃弃之深谷。 重剑无锋,大巧不工。四十岁前恃之横行天下。 四十岁后,不滞于物,草木竹石均可为剑。自此精修,渐进至无剑胜有剑之境。

    社区QQ达人 邮箱绑定达人 发帖功臣 元老勋章 新人进步奖 风雨历程奖 最具活力勋章

    群组计量经济学之性

    群组LINGO

    回复

    使用道具 举报

    shrewd        

    0

    主题

    11

    听众

    4

    积分

    升级  80%

    该用户从未签到

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2024-5-29 12:58 , Processed in 0.616365 second(s), 103 queries .

    回顶部