Matlab-标准遗传算法

写了两个月多目标了,突然上课课程作业叫写单目标。之前用Python写过一次,这次用matlab写吧,也暴露了遗传算法的一些固有问题,可以记录一下:

先上代码,讨论放到最后:

%%get initial parameter
NP=40;  
L=10;    
Pc=0.7;  
Pm=0.1;  
G=50;        %迭代次数 
O2=[0 3.14];
wid=[2 10];  %rotor mag
len=[27 35];
%% generate Primary population
fo=randi([0,1],NP,L);
fw=randi([0,1],NP,L);
fl=randi([0,1],NP,L);
x0=zeros(1,NP*2);
tempx0=zeros(1,NP*2);
xw=zeros(1,NP*2);
tempxw=zeros(1,NP*2);
xl=zeros(1,NP*2);
tempxl=zeros(1,NP*2);
fbest=zeros(1,G);
Ovalue=zeros(1,G);
Wvalue=zeros(1,G);
Lvalue=zeros(1,G);

%% begin to Iteration
for i=1:1:G
    disp([i]);
    f1=zeros(1,NP*2);
    nfo=fo;
    nfw=fw;
    nfl=fl;
    for M=1:2:NP
        p=rand();
        if p<Pc
            q=randi([0,1],1,L);
            for j=1:1:L         %交叉
                if q(j)==1
                    nfo=exchange(nfo,M,j);
                    nfw=exchange(nfw,M,j);
                    nfl=exchange(nfl,M,j);
                end
            end
        end
    end
        j=1;
    while j<=NP*Pm         %变异
        h=randi(NP);
        for k=1:1:round(NP*Pm)
            g=randi(L);
            nfo(h,g)=~nfo(h,g);
            nfw(h,g)=~nfw(h,g);
            nfl(h,g)=~nfl(h,g);
        end
        j=j+1;
    end
    newfo=[fo;nfo];           %垂直方向合并两个矩阵
    newfw=[fw;nfw];
    newfl=[fl;nfl];
    tempsize=size(newfo);
    for j = 1:1:tempsize(1)
        Uo=newfo(j,:);
        Uw=newfw(j,:);
        Ul=newfl(j,:);
        x0(j)=twoto10(Uo,L,O2);
        xw(j)=twoto10(Uw,L,wid);
        xl(j)=twoto10(Ul,L,len);
%         diaoyong(xw(j),xl(j),x0(j));    %调用maxwell对应的输入值
%         data=readmatrix('force.csv');
%         f1(j)=data(end);
%         delete('force.csv')
        f1(j)=funcl(x0(j));
    end
    maxfit=max(f1);         %加入随机量轮盘赌,否则遗传算法太容易收敛到局部最优了。
    minfit=min(f1);
    rr=find(f1==maxfit);
    fbest(i)=f1(rr(1,1));
    Ovalue(i)=x0(rr(1,1));
    Wvalue(i)=xw(rr(1,1));
    Lvalue(i)=xl(rr(1,1));      %记录每一代最优个体
    sum_f1=sum(f1);
    fitvalue=f1./sum_f1;
    fitvalue=cumsum(fitvalue);
    ms=sort(rand(NP,1));
    fiti=1;
    newi=1;
    fo=[];
    fw=[];
    fl=[];
    while newi<=NP
        if (ms(newi))<fitvalue(fiti)       %轮盘赌
            fo=[fo;newfo(fiti,:)];
            fw=[fw;newfw(fiti,:)];
            fl=[fl;newfw(fiti,:)];
            newi=newi+1;
        else
            fiti=fiti+1;
        end
    end
end

因为是在多目标代码上改的,所以有些冗余的地方,见谅。我想讨论的是下面这点:

太容易收敛了。

多目标的时候还不觉得,那时候模型相对复杂,收敛需要一定的迭代次数,这种简单的模型,真的就是迭代个4.5次就到来最优值附近了。

有的同学会说了,到最优值附近快,难道不是好事嘛。

是好事,但万一是局部最优呢?

多目标其实也存在这个问题,只是它有个寻优的过程,让人感觉比较安心。我今天调这个代码,发现收敛太快了,就一直在思考是不是自己哪写得不对。但这个现象其实是遗传算法自带的。。。

放一张图吧,最优值是1,大家看看收敛得有多块。

 其实初始带结果就很好了对吧,因为我在第一代种已经做了一次筛选,所以这里结果的第一代相当于咱口头说的第二代。

也算是加深了自己对遗传算法的理解吧,哎。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值