查看: 995  |  回复: 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 的主题更新
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[基金申请] 听说今天filecode变了 +18 布布和一二 2026-08-06 32/1600 2026-08-07 00:37 by ywclong81
[基金申请] 基金中了 +6 laoda193707 2026-08-06 6/300 2026-08-06 23:34 by dragonxp
[基金申请] filecode +10 等待解的谜 2026-08-06 14/700 2026-08-06 21:16 by zhanghaozhu
[基金申请] 固定端突然变了,今天 +3 archvillain 2026-08-06 7/350 2026-08-06 21:05 by archvillain
[基金申请] filecode +8 布布和一二 2026-08-06 11/550 2026-08-06 20:41 by tangpu318
[基金申请] 大家散了吧,后缀研究没有意义,别浪费时间了,过好目前的每一天,不要焦虑 +5 Tide man 2026-08-06 6/300 2026-08-06 20:19 by 苏知砚
[有机交流] 一个有机合成实验室都需要哪些设备? 50+3 kf2781974 2026-07-31 12/600 2026-08-06 15:11 by eddyin
[基金申请] 求各位大神看下 100+6 hpkpkpkp 2026-08-05 33/1650 2026-08-06 14:49 by zhiyanjiang
[教师之家] 咨询面上基金 +4 李长云 2026-07-31 7/350 2026-08-06 11:20 by 李长云
[基金申请] 影响面上的因素 +8 布布和一二 2026-08-05 11/550 2026-08-06 10:41 by 宝贝虫子
[基金申请] 8月时间戳变的,举个手。玩一下,释放压力 +9 archvillain 2026-08-04 11/550 2026-08-05 20:06 by wlwhappy
[基金申请] 面上再次挂了,太难了,躺也躺不了,倦也卷不过,小学校之殇! +22 低垂的野花 2026-07-31 30/1500 2026-08-05 18:03 by 低垂的野花
[基金申请] 好消息?这个有何含义??? +8 Tide man 2026-08-05 10/500 2026-08-05 16:14 by xmuxiaoyu
[考博] 【2027博士申请】纳米药物递送方向 20+3 13586093586 2026-08-03 4/200 2026-08-05 09:59 by lfy8008
[基金申请] 有没有H口的?有收到消息的吗? +3 超级海虾 2026-08-04 3/150 2026-08-04 17:26 by 学教育滴
[论文投稿] 十年后又回来了,论文投稿求助 +3 哈哈114477 2026-08-01 3/150 2026-08-04 15:40 by tegsgjy20
[基金申请] 纯娱乐,不喜欢勿喷 +7 Tide man 2026-08-04 10/500 2026-08-04 15:10 by loufangrui
[基金申请] 面上提前没消息,有中的吗 +14 archvillain 2026-08-02 18/900 2026-08-04 14:42 by archvillain
[基金申请] 娱乐 +4 Tide man 2026-08-03 4/200 2026-08-04 11:51 by wgch518
[基金申请] 什么时候能放榜呀? +3 Jacob678 2026-08-03 3/150 2026-08-03 16:14 by gltch
信息提示
请填处理意见