meng1004com 发表于 2009-5-12 22:24

遗传算法中的每代优化结果都一样,是什么原因啊,那位高手指导一下。

遗传算法优化1000代,可是每次优化的结果都一样的,哪位高手知道为什么啊?感激不尽啊

ChaChing 发表于 2009-5-13 08:02

个人水平专业有限, 建议楼主看下本版规则并说清楚些!
或许给出相关代码, 方便判断

yufeng 发表于 2009-5-14 09:59

如果程序没有错误 有两个可能 要么是该值已经是最优解 要么陷入了局部最优

meng1004com 发表于 2009-5-14 12:00

原程序是这样的,高手帮忙看下哦,谢谢

%采用二进制编码的基本遗传算法
function B_GA
    clear
    clc
    popsize=20;%input('请输入种群数:');
    pselect=0.05;%input('请输入选择概率:');
    pcross=0.3;%input('请输入交叉概率:');
    pmutation=0.1;%input('请输入变异概率:');
    options=1e-6;%input('请输入精度:');
    bounds=%input('请输入变量范围[]:');
    maxGen=1000;%input('请输入最大世代数:');
%下面进行初始化(含适应度值)
    bits=calcbits(bounds,options);%确定变量二进制的位数
   gen=1;%第一代
    initpop=round(rand(popsize,sum(bits)+1));%初始化
    for i=1:popsize
      var=b2f(initpop(i,:),bounds,bits); %获得变量值
      fitn=fitness(var(1),var(2),var(3)); %获得变量的适应度值
      initpop(i,sum(bits)+1)=fitn; %将变量适应度值加入到种群最后一列中去
    end
    oval = min(initpop(:,sum(bits)+1));%获得初始代中的最优种群个体
    oldpop=initpop;
    while(gen<=maxGen)
       = min(oldpop(:,sum(bits)+1)); %留下最优代,返回最佳适应度值(bval)和相应的位置(bindx)
      best=oldpop(bindx,:);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%下面进行选择,首先计算个体选择概率(采用标准几何分布进行选择)
      x(:,1) =';                        
       = sort(oldpop(:,sum(bits)+1));
      r = pselect/(1-(1-pselect)^popsize);         %标准分布               
      prob(x(:,2))=r*(1-pselect).^(x(:,1)-1); %生成选择概率       
%totalfit=sum(oldpop(:,sum(bits)+1));%适应度总和
%prob=oldpop(:,sum(bits)+1)/totalfit; %选择概率
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%然后采用轮盘赌的方式
      prob=cumsum(prob); %累计概率
      rns=sort(rand(popsize,1)); %随即产生随机数序列并排序(由小到大),采用轮盘赌
      fitin=1;newin=1;
      while newin<=popsize%采用轮盘赌选择
            if (rns(newin)<prob(fitin)) %随机数与累计概率相比较,直到比它大的
                newpop(newin,:)=oldpop(fitin,:);
                newin=newin+1;
            else
                fitin=fitin+1;
            end
      end
      parent=newpop;
%下面进行交叉
      cp=[];
      num_cp=size(cp);
      while num_cp(1,1)<2
            cp=find(rand(popsize,1)<pcross==1); %先后获得交叉的种群数
            num_cp=size(cp);
      end
      if rem(size(cp,1),2)
            cp=cp(1:(size(cp,1)-1));
      end%如果交叉数为奇数则减1
      cp=reshape(cp,size(cp,1)/2,2); %把交叉数分为两列,以便两两交叉
      for j=1:size(cp,1)    %从第j组开始交叉
            cpoint=round(rand*sum(bits)); %获得交叉点
                a=cp(j,1); b=cp(j,2);% 获得第j组的交叉种群数
            child1(1:sum(bits))=;%交叉
            child2(1:sum(bits))=;%交叉
            parent(a,1:sum(bits))=child1(1:sum(bits));
            parent(b,1:sum(bits))=child2(1:sum(bits));
            var=b2f(parent(a,:),bounds,bits);
            parent(a,sum(bits)+1)=fitness(var(1),var(2),var(3));%获得交叉后对应的适应度值
            var=b2f(parent(b,:),bounds,bits);
            parent(b,sum(bits)+1)=fitness(var(1),var(2),var(3));%获得交叉后对应的适应度值
      end
%下面进行变异
      j=1;
      while j<=popsize
            rN=rand(1,sum(bits))<pmutation; %获得变异位(注意,每一位的码都要按照变异率来判断)
            Aparent(j,:)=parent(j,:);
            Aparent(j,1:sum(bits)+1)=;%进行变异,用父体减去变异位,然后取绝对值
            var=b2f(Aparent(j,:),bounds,bits);
            g1=1-9.7009*var(3).^2*(var(1)+var(3))/(var(2).^4-30.^4);
            if (g1>=0)
                parent(j,:)=Aparent(j,:);
                parent(j,sum(bits)+1)=fitness(var(1),var(2),var(3));
               j=j+1;                         %增加变异后的适应度
         end
      end
      oldpop=parent;
       = max(oldpop(:,sum(bits)+1)); %找出当前进化后的最差解
      oldpop(bindx,:) = best; %用最优解替换种群中最差解
       =min(oldpop(:,sum(bits)+1)); %找出当前进化后的最优解
      iii =mean(oldpop(:,sum(bits)+1));
      var=b2f(oldpop(bindx,1:sum(bits)),bounds,bits);
      disp(['第'num2str(gen) ' 次寻优结束。'])
      disp(['目前函数寻优解为:'num2str(bval)])
      disp(['目前函数平均解为:'num2str(iii)])
      disp(['对应变量为:' num2str(var(1)) ''num2str(var(2)) ''num2str(var(3))])
      disp(['------------------------------------------------------'])
      gen=gen+1;%进行新的一代
    end
%======================================
%适应度函数定义
functionfit=fitness(x,y,z)
         fit=0.7854*(x+z)*(y.^2-900);

meng1004com 发表于 2009-5-17 12:03

会遗传算法的进来指导一下啊

为什么下面这个程序优化1000代,可是每次结果都一样呢(MATLAB程序)
%采用二进制编码的基本遗传算法
function B_GA
    clear
    clc
    popsize=20;%input('请输入种群数:');
    pselect=0.05;%input('请输入选择概率:');
    pcross=0.3;%input('请输入交叉概率:');
    pmutation=0.1;%input('请输入变异概率:');
    options=1e-6;%input('请输入精度:');
    bounds=%input('请输入变量范围[]:');
    maxGen=1000;%input('请输入最大世代数:');
%下面进行初始化(含适应度值)
    bits=calcbits(bounds,options);%确定变量二进制的位数
   gen=1;%第一代
    initpop=round(rand(popsize,sum(bits)+1));%初始化
    for i=1:popsize
      var=b2f(initpop(i,:),bounds,bits); %获得变量值
      fitn=fitness(var(1),var(2),var(3)); %获得变量的适应度值
      initpop(i,sum(bits)+1)=fitn; %将变量适应度值加入到种群最后一列中去
    end
    oval = min(initpop(:,sum(bits)+1));%获得初始代中的最优种群个体
    oldpop=initpop;
    while(gen<=maxGen)
       = min(oldpop(:,sum(bits)+1)); %留下最优代,返回最佳适应度值(bval)和相应的位置(bindx)
      best=oldpop(bindx,:);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%下面进行选择,首先计算个体选择概率(采用标准几何分布进行选择)
      x(:,1) =';                        
       = sort(oldpop(:,sum(bits)+1));
      r = pselect/(1-(1-pselect)^popsize);         %标准分布               
      prob(x(:,2))=r*(1-pselect).^(x(:,1)-1); %生成选择概率      
%totalfit=sum(oldpop(:,sum(bits)+1));%适应度总和
%prob=oldpop(:,sum(bits)+1)/totalfit; %选择概率
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%然后采用轮盘赌的方式
      prob=cumsum(prob); %累计概率
      rns=sort(rand(popsize,1)); %随即产生随机数序列并排序(由小到大),采用轮盘赌
      fitin=1;newin=1;
      while newin<=popsize%采用轮盘赌选择
            if (rns(newin)<prob(fitin)) %随机数与累计概率相比较,直到比它大的
                newpop(newin,:)=oldpop(fitin,:);
                newin=newin+1;
            else
                fitin=fitin+1;
            end
      end
      parent=newpop;
%下面进行交叉
      cp=[];
      num_cp=size(cp);
      while num_cp(1,1)<2
            cp=find(rand(popsize,1)<pcross==1); %先后获得交叉的种群数
            num_cp=size(cp);
      end
      if rem(size(cp,1),2)
            cp=cp(1:(size(cp,1)-1));
      end%如果交叉数为奇数则减1
      cp=reshape(cp,size(cp,1)/2,2); %把交叉数分为两列,以便两两交叉
      for j=1:size(cp,1)    %从第j组开始交叉
            cpoint=round(rand*sum(bits)); %获得交叉点
                a=cp(j,1); b=cp(j,2);% 获得第j组的交叉种群数
            child1(1:sum(bits))=;%交叉
            child2(1:sum(bits))=;%交叉
            parent(a,1:sum(bits))=child1(1:sum(bits));
            parent(b,1:sum(bits))=child2(1:sum(bits));
            var=b2f(parent(a,:),bounds,bits);
            parent(a,sum(bits)+1)=fitness(var(1),var(2),var(3));%获得交叉后对应的适应度值
            var=b2f(parent(b,:),bounds,bits);
            parent(b,sum(bits)+1)=fitness(var(1),var(2),var(3));%获得交叉后对应的适应度值
      end
%下面进行变异
      j=1;
      while j<=popsize
            rN=rand(1,sum(bits))<pmutation; %获得变异位(注意,每一位的码都要按照变异率来判断)
            Aparent(j,:)=parent(j,:);
            Aparent(j,1:sum(bits)+1)=;%进行变异,用父体减去变异位,然后取绝对值
            var=b2f(Aparent(j,:),bounds,bits);
            g1=1-9.7009*var(3).^2*(var(1)+var(3))/(var(2).^4-30.^4);
            if (g1>=0)
                parent(j,:)=Aparent(j,:);
                parent(j,sum(bits)+1)=fitness(var(1),var(2),var(3));
               j=j+1;                         %增加变异后的适应度
         end
      end
      oldpop=parent;
       = max(oldpop(:,sum(bits)+1)); %找出当前进化后的最差解
      oldpop(bindx,:) = best; %用最优解替换种群中最差解
       =min(oldpop(:,sum(bits)+1)); %找出当前进化后的最优解
      iii =mean(oldpop(:,sum(bits)+1));
      var=b2f(oldpop(bindx,1:sum(bits)),bounds,bits);
      disp(['第'num2str(gen) ' 次寻优结束。'])
      disp(['目前函数寻优解为:'num2str(bval)])
      disp(['目前函数平均解为:'num2str(iii)])
      disp(['对应变量为:' num2str(var(1)) ''num2str(var(2)) ''num2str(var(3))])
      disp(['------------------------------------------------------'])
      gen=gen+1;%进行新的一代
    end
%======================================
%适应度函数定义
functionfit=fitness(x,y,z)
         fit=0.7854*(x+z)*(y.^2-900);
页: [1]
查看完整版本: 遗传算法中的每代优化结果都一样,是什么原因啊,那位高手指导一下。