声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1513|回复: 4

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

[复制链接]
发表于 2009-5-12 22:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

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

使用道具 举报

发表于 2009-5-13 08:02 | 显示全部楼层
个人水平专业有限, 建议楼主看下本版规则并说清楚些!
或许给出相关代码, 方便判断
发表于 2009-5-14 09:59 | 显示全部楼层
如果程序没有错误 有两个可能 要么是该值已经是最优解 要么陷入了局部最优

评分

1

查看全部评分

 楼主| 发表于 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=[300 650;60 140;90 150]%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)
        [bval,bindx] = min(oldpop(:,sum(bits)+1)); %留下最优代,返回最佳适应度值(bval)和相应的位置(bindx)
        best=oldpop(bindx,:);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%下面进行选择,首先计算个体选择概率(采用标准几何分布进行选择)
        x(:,1) =[popsize:-1:1]';                        
        [y x(:,2)] = 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))=[parent(a,1:cpoint) parent(b,(cpoint+1):sum(bits))];%交叉
            child2(1:sum(bits))=[parent(b,1:cpoint) parent(a,(cpoint+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)=[abs(Aparent(j,1:sum(bits)) - rN) Aparent(j,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;
        [bval,bindx] = max(oldpop(:,sum(bits)+1)); %找出当前进化后的最差解
        oldpop(bindx,:) = best; %用最优解替换种群中最差解
        [bval,bindx] =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
%======================================
%适应度函数定义
  function  fit=fitness(x,y,z)
         fit=0.7854*(x+z)*(y.^2-900);
 楼主| 发表于 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=[300 650;60 140;90 150]%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)
        [bval,bindx] = min(oldpop(:,sum(bits)+1)); %留下最优代,返回最佳适应度值(bval)和相应的位置(bindx)
        best=oldpop(bindx,:);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%下面进行选择,首先计算个体选择概率(采用标准几何分布进行选择)
        x(:,1) =[popsize:-1:1]';                        
        [y x(:,2)] = 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))=[parent(a,1:cpoint) parent(b,(cpoint+1):sum(bits))];%交叉
            child2(1:sum(bits))=[parent(b,1:cpoint) parent(a,(cpoint+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)=[abs(Aparent(j,1:sum(bits)) - rN) Aparent(j,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;
        [bval,bindx] = max(oldpop(:,sum(bits)+1)); %找出当前进化后的最差解
        oldpop(bindx,:) = best; %用最优解替换种群中最差解
        [bval,bindx] =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
%======================================
%适应度函数定义
  function  fit=fitness(x,y,z)
         fit=0.7854*(x+z)*(y.^2-900);

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-9-22 12:58 , Processed in 0.061614 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表