24小时热门版块排行榜    

查看: 1019  |  回复: 4

tdykxmg

新虫 (初入文坛)

[求助] GA算法怎么求最小值啊,算法哪里出错了,求大神指教。。。。。 已有1人参与

有没有大神帮我看一下GA算法怎么求函数最小值啊
这是代码
function ga()
clear
clc
popsize = 50;     
chromlength = 10;  
pc = 0.5;        
p0=0.1;
pend=0.0025;
t=160;
n=1600;
pm = (p0-pend).*exp(-n/t)+pend;        
pop = initpop(popsize,chromlength);   

  for i=1:100
     [objvalue] = cal_objvalue(pop);   
      fitvalue = objvalue;
     [newpop] = selection(pop,fitvalue);
     [newpop] = crossover(newpop,pc);     
     [newpop] = mutation(newpop,pm);      
      pop = newpop;           
      [bestindividual,bestfit]=best(pop,fitvalue);
      x2 = binary2decimal(bestindividual);
   
      x1 = binary2decimal(newpop);
      [y1] = cal_objvalue(newpop);   
      if  mod(i,10)==0
      figure;   
      fplot('(x-3).^2',[0 5]);
      hold on;
     title(['迭代次数为 n=' num2str(i)]);
     plot(x1,y1,'*');
      end
  end
      fprintf('the best X is  --->>%5.2f\n',x2);
      fprintf('the best Y is  --->>%5.2f\n',bestfit);
function pop = initpop(popsize,chromlength)
pop = round(rand(popsize,chromlength));
function pop2 = binary2decimal(pop)
[px,py]=size(pop);
for i=1:py
    pop1(:,i) = 2.^(py-i).*pop(:,i);
end
%sum(.,2)对行求和,得到列的向量
temp = sum(pop1,2);
pop2 = temp*5/1023;
function [objvalue]=cal_objvalue(pop)
x = binary2decimal(pop);
objvalue =(x-3).^2;
function [newpop] = selection(pop,fitvalue)
%构造轮盘
[px,py]=size(pop);   
totalfit = sum(fitvalue);
p_fitvalue = fitvalue/totalfit;
p_fitvalue = cumsum(p_fitvalue);%概率求和排序
%-------
ms = sort(rand(px,1));
fitin = 1;
newin = 1;
while newin<=px
     if (ms(newin))<p_fitvalue(fitin)
         newpop(newin,=pop(fitin,;
         newin=newin+1;
     else fitin=fitin+1;
     end
end;
function [newpop]=crossover(pop,pc)
[px,py]=size(pop);
newpop = ones(size(pop));
for i=1:2:px-1
    if(rand<pc)
        cpoint = round(rand*py);
        newpop(i, = [pop(i,1:cpoint),pop(i+1,cpoint+1:py)];
        newpop(i+1, = [pop(i+1,1:cpoint),pop(i,cpoint+1:py)];
    else
        newpop(i,=pop(i,;
        newpop(i+1,=pop(i+1,;
    end
end
function [newpop] = mutation(pop,pm)
[px,py] = size(pop);
newpop = ones(size(pop));
for i=1:px
    if(rand<pm)
        mpoint = round(rand*py);
        if mpoint<=0
            mpoint=1;
        end
        newpop(i, = pop(i,;
        if newpop(i,mpoint)==0
            newpop(i,mpoint)=1;
        else newpop(i,mpoint)=0;
        end
    else
         newpop(i,=pop(i,;
    end
end
function [bestindividual,bestfit]=best(pop,fitvalue)
[px,py]=size(pop);
bestindividual = pop(1,;
bestfit = fitvalue(1);
for i=2:px
    if fitvalue(i)<bestfit
        bestindividual = pop(i,;
        bestfit = fitvalue(i);
    end
end

这个求出来是(x-3).^2的最大值,我想求他的最小值,我也试了把函数变成-(x-3).^2,结果求出来是他的最小值也就是说还是原函数的最大值,但是我需要的 是原函数放入最小值。。。。。求大神指点啊

GA算法怎么求最小值啊,算法哪里出错了,求大神指教。。。。。
1.jpg


GA算法怎么求最小值啊,算法哪里出错了,求大神指教。。。。。-1
2.jpg
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

pdl9527

专家顾问 (小有名气)

【答案】应助回帖

★ ★ ★ ★ ★ ★ ★
感谢参与,应助指数 +1
tdykxmg: 金币+7, ★★★★★最佳答案 2017-10-16 17:45:05
CODE:
function question_56 clear clc popsize = 50; chromlength = 10; pc = 0.5; p0=0.1; pend=0.0025; t=160; n=1600; pm = (p0-pend).*exp(-n/t)+pend; pop = initpop(popsize,chromlength); for i=1:100 [objvalue] = cal_objvalue(pop); fitvalue = objvalue; [newpop] = selection(pop,fitvalue); [newpop] = crossover(newpop,pc); [newpop] = mutation(newpop,pm); pop = newpop; [bestindividual,bestfit]=best(pop,fitvalue); x2 = binary2decimal(bestindividual); x1 = binary2decimal(newpop); [y1] = cal_objvalue(newpop); if mod(i,10)==0 figure; fplot('(x-3).^2',[0 5]); hold on; title(['迭代次数为 n=' num2str(i)]); plot(x1,1./y1,'*'); end end fprintf('the best X is --->>%5.2f\n',x2); fprintf('the best Y is --->>%5.2f\n',bestfit); function pop = initpop(popsize,chromlength) pop = round(rand(popsize,chromlength)); function pop2 = binary2decimal(pop); [px,py]=size(pop); for i=1:py pop1(:,i) = 2.^(py-i).*pop(:,i); end %sum(.,2)对行求和,得到列的向量 temp = sum(pop1,2); pop2 = temp*5/1023; function [objvalue]=cal_objvalue(pop) x = binary2decimal(pop); objvalue =1./((x-3).^2); function [newpop] = selection(pop,fitvalue) %构造轮盘 [px,py]=size(pop); totalfit = sum(fitvalue); p_fitvalue = fitvalue/totalfit; p_fitvalue = cumsum(p_fitvalue);%概率求和排序 %------- ms = sort(rand(px,1)); fitin = 1; newin = 1; while newin<=px if (ms(newin))<p_fitvalue(fitin) newpop(newin,:)=pop(fitin,:); newin=newin+1; else fitin=fitin+1; end end function [newpop]=crossover(pop,pc) [px,py]=size(pop); newpop = ones(size(pop)); for i=1:2:px-1 if(rand<pc) cpoint = round(rand*py); newpop(i,:) = [pop(i,1:cpoint),pop(i+1,cpoint+1:py)]; newpop(i+1,:) = [pop(i+1,1:cpoint),pop(i,cpoint+1:py)]; else newpop(i,:)=pop(i,:); newpop(i+1,:)=pop(i+1,:); end end function [newpop] = mutation(pop,pm) [px,py] = size(pop); newpop = ones(size(pop)); for i=1:px if(rand<pm) mpoint = round(rand*py); if mpoint<=0 mpoint=1; end newpop(i,:) = pop(i,:); if newpop(i,mpoint)==0 newpop(i,mpoint)=1; else newpop(i,mpoint)=0; end else newpop(i,:)=pop(i,:); end end function [bestindividual,bestfit]=best(pop,fitvalue) [px,py]=size(pop); bestindividual = pop(1,:); bestfit = fitvalue(1); for i=2:px if fitvalue(i)<bestfit bestindividual = pop(i,:); bestfit = fitvalue(i); end end

2楼2017-09-27 20:10:01
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

pdl9527

专家顾问 (小有名气)

【答案】应助回帖

引用回帖:
2楼: Originally posted by pdl9527 at 2017-09-27 20:10:01
function question_56 clear clc popsize = 50; chromlength = 10; pc = 0.5; p0=0.1; pend=0.0025; t=160; n=1600; pm = (p0-pend).*exp(-n/t)+pend; pop = initpop(popsize,chromlength); for i=1:100  = cal_obj ...

CODE:
function question_56
clear
clc
popsize = 50;     
chromlength = 10;  
pc = 0.5;        
p0=0.1;
pend=0.0025;
t=160;
n=1600;
pm = (p0-pend).*exp(-n/t)+pend;        
pop = initpop(popsize,chromlength);   
  for i=1:100
     [objvalue] = cal_objvalue(pop);
      fitvalue = objvalue;
     [newpop] = selection(pop,fitvalue);
     [newpop] = crossover(newpop,pc);     
     [newpop] = mutation(newpop,pm);      
      pop = newpop;           
      [bestindividual,bestfit]=best(pop,fitvalue);
      x2 = binary2decimal(bestindividual);
   
      x1 = binary2decimal(newpop);
      [y1] = cal_objvalue(newpop);   
      if  mod(i,10)==0
      figure;   
      fplot('(x-3).^2',[0 5]);
      hold on;
     title(['迭代次数为 n=' num2str(i)]);
     plot(x1,1./y1,'*');
      end
  end
      fprintf('the best X is  --->>%5.2f\n',x2);
      fprintf('the best Y is  --->>%5.2f\n',bestfit);
function pop = initpop(popsize,chromlength)
pop = round(rand(popsize,chromlength));
function pop2 = binary2decimal(pop);
[px,py]=size(pop);
for i=1:py
    pop1(:,i) = 2.^(py-i).*pop(:,i);
end
%sum(.,2)对行求和,得到列的向量
temp = sum(pop1,2);
pop2 = temp*5/1023;
function [objvalue]=cal_objvalue(pop)
x = binary2decimal(pop);
objvalue =1./((x-3).^2);
function [newpop] = selection(pop,fitvalue)
%构造轮盘
[px,py]=size(pop);   
totalfit = sum(fitvalue);
p_fitvalue = fitvalue/totalfit;
p_fitvalue = cumsum(p_fitvalue);%概率求和排序
%-------
ms = sort(rand(px,1));
fitin = 1;
newin = 1;
while newin<=px
     if (ms(newin))<p_fitvalue(fitin)
         newpop(newin,:)=pop(fitin,:);
         newin=newin+1;
     else fitin=fitin+1;
     end
end
function [newpop]=crossover(pop,pc)
[px,py]=size(pop);
newpop = ones(size(pop));
for i=1:2:px-1
    if(rand<pc)
        cpoint = round(rand*py);
        newpop(i,:) = [pop(i,1:cpoint),pop(i+1,cpoint+1:py)];
        newpop(i+1,:) = [pop(i+1,1:cpoint),pop(i,cpoint+1:py)];
    else
        newpop(i,:)=pop(i,:);
        newpop(i+1,:)=pop(i+1,:);
    end
end
function [newpop] = mutation(pop,pm)
[px,py] = size(pop);
newpop = ones(size(pop));
for i=1:px
    if(rand<pm)
        mpoint = round(rand*py);
        if mpoint<=0
            mpoint=1;
        end
        newpop(i,:) = pop(i,:);
        if newpop(i,mpoint)==0
            newpop(i,mpoint)=1;
        else newpop(i,mpoint)=0;
        end
    else
         newpop(i,:)=pop(i,:);
    end
end
function [bestindividual,bestfit]=best(pop,fitvalue)
[px,py]=size(pop);
bestindividual = pop(1,:);
bestfit = fitvalue(1);
for i=2:px
    if fitvalue(i)<bestfit
        bestindividual = pop(i,:);
        bestfit = fitvalue(i);
    end
end

3楼2017-09-27 20:11:06
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

tdykxmg

新虫 (初入文坛)

引用回帖:
3楼: Originally posted by pdl9527 at 2017-09-27 20:11:06
function question_56
clear
clc
popsize = 50;     
chromlength = 10;  
pc = 0.5;        
p0=0.1;
pend=0.0025;
t=160;
n=1600;
pm = (p0-pend).*exp(-n/t)+pend;        
pop = initpop(popsize ...

还是不对啊,我需要在原图上求最小值
GA算法怎么求最小值啊,算法哪里出错了,求大神指教。。。。。-2
3.jpg

4楼2017-09-28 09:40:01
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

tdykxmg

新虫 (初入文坛)

引用回帖:
3楼: Originally posted by pdl9527 at 2017-09-27 20:11:06
function question_56
clear
clc
popsize = 50;     
chromlength = 10;  
pc = 0.5;        
p0=0.1;
pend=0.0025;
t=160;
n=1600;
pm = (p0-pend).*exp(-n/t)+pend;        
pop = initpop(popsize ...

抱歉,解决了,谢谢啊
5楼2017-09-28 09:55:45
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 tdykxmg 的主题更新
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[基金申请] 科研人应该花精力去思考如何解决问题,而不是去凝练问题 +3 瞬息宇宙 2026-09-01 5/250 2026-09-02 08:01 by anjeeshine
[文学芳草园] 梦想 +5 myrtle 2026-08-26 8/400 2026-09-02 02:42 by Leogzhya
[基金申请] 投票:  有多少人是今天查系统知道结果的? +17 爱看书的可乐 2026-08-26 19/950 2026-09-02 00:19 by xiangy672
[基金申请] 面上函评意见出来了,像什么等级? 20+4 Tsingking1 2026-08-27 17/850 2026-09-01 19:51 by 超级无敌华子
[基金申请] 为什么资助数各大高校都创新高,自己申请怎么就这么难 +13 Kittylucky 2026-08-27 14/700 2026-09-01 11:06 by feng6531
[论文投稿] 小白求助 投论文要求的highlights应该如何写 5+3 l1963982152 2026-08-29 4/200 2026-09-01 09:04 by 北京莱茵编辑
[基金申请] 国社科又开始会评了,不知道这次命运如何 +7 雨打竹帘 2026-08-30 11/550 2026-08-31 23:16 by hittle2008
[基金申请] 哪位高人中了,把查询到的截图贴出来让我看看,让我长长见识 +6 yuleib84 2026-08-26 7/350 2026-08-31 19:46 by 鱼翔浅底1
[基金申请] 能否申诉? +7 echo8914667 2026-08-30 8/400 2026-08-31 17:00 by yihongxu
[基金申请] 中青基了要发朋友圈吗? +7 349506619 2026-08-28 7/350 2026-08-31 13:39 by 冼亮淀粉酶
[基金申请] 有没有仍没收到信息的 +7 德尚中行 2026-08-27 8/400 2026-08-30 20:52 by purplejack
[考博] 找导师 +6 yuanjiabao 2026-08-29 7/350 2026-08-30 14:40 by 生科新手
[基金申请] 国自然面上复盘~欢迎讨论 (金币+15) +15 晴天加油 2026-08-26 16/800 2026-08-29 18:28 by symmetry
[基金申请] 系统查不到 +11 董八千 2026-08-26 11/550 2026-08-28 18:06 by Leogzhya
[基金申请] 基金系统什么内容也没有 30+4 winsaint 2026-08-27 9/450 2026-08-28 11:06 by maolC
[基金申请] 为什么 国际(地区)合作与交流项目 没有放榜? 10+3 majunge000 2026-08-26 11/550 2026-08-27 08:42 by 北京莱茵编辑
[基金申请] 出来了 +9 trojank 2026-08-26 9/450 2026-08-26 14:25 by 宝贝虫子
[基金申请] 国际合作可查了,中了面上 (EPI+1)(金币+50) +18 Ldrop2023 2026-08-26 18/900 2026-08-26 11:15 by cmrandy
[基金申请] 系统进不去 +4 yanglien 2026-08-26 5/250 2026-08-26 11:10 by wenfengw83
[基金申请] 项目信息和经费信息在系统里都可以看到了 +6 wittyboy 2026-08-26 14/700 2026-08-26 10:55 by wittyboy
信息提示
请填处理意见