24小时热门版块排行榜    

查看: 883  |  回复: 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 的主题更新
信息提示
请填处理意见