2018-4-7 包子阳书本39页例题

来源书本包子阳《智能算法以及matlab实现》


代码:

%差分进化求函数极值
clear all;
close all;
clc;
NP = 50;   %种群数量
D = 10;    %个体的维度
G = 200;   %最大进化代数
F0 = 0.4;  %初始的变异因子
CR = 0.1;  %交叉算子
Xs = 20;   %自变量上限
Xx = -20;  %自变量下限
yz = 10^-6; %阈值

%%%%%%%%%%%%%%%%%%%赋初值%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
x = zeros(D,NP);  %初始化种群
v = zeros(D,NP);  %变异种群
u = zeros(D,NP);  %选择种群
x = rand(D,NP)*(Xs-Xx)+Xx;  %赋初值
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%计算目标函数%%%%%%%%%%%%%%%%%%%
for m = 1:NP
    Ob(m) = func1(x(:,m));
end
trace(1) = min(Ob);
%%%%%%%%%%%%%%%%%%%%%%%差分进化循环%%%%%%
for gen = 1:G
    %%%%%%%%%%变异操作%%%%%%
    %%%%%%%%%%自适应变异算子%%%%%%%%%%
    lamda = exp(1 - G/(G+1-gen));
    F = F0*2^(lamda);
    %%%%%%%%%%r1,r2,r3和m的互不相同%%%%%%%%%%
    for m = 1:NP
       r1 = randint(1,1,[1,NP]);
       while (r1==m)
           r1 = randint(1,1,[1,NP]);
       end
       r2 = randint(1,1,[1,NP]);
       while (r2==m) | (r2==r1)
           r2 = randint(1,1,[1,NP]);
       end
      r3 = randint(1,1,[1,NP]);
       while (r2==m) | (r2==r1)|(r3==r2)
           r1 = randint(1,1,[1,NP]);
       end 
       v(:,m) = x(:,r1)+F*(x(:,r2)-x(:,r3));
    end
    %%%%%%%%%%%%%%%%交叉操作%%%%%%%%%%%%%%%
    r = randint(1,1,[1,D]);
    for n = 1:D
        cr = rand(1);
        if (cr<= CR) |(n==r)
            u(n,:) = v(n,:);
        else
            u(n,:)= v(n,:);
        end
    end
    %%%%%%%%%%%%%%%%%边界条件的处理%%%%%%%%%%%
    for n =1:D
        for m = 1:NP
            if (u(n,m)<Xx)|(u(n,m)>Xs)
                u(n,m) = rand*(Xs-Xx)+Xx;
            end
        end
    end
    %%%%%%%%%%%%%%%%%%%选择操作%%%%%%%%%%%%
    for m = 1:NP
        Ob1(m) = func1(u(:,m));
    end
    for m = 1:NP
        if Ob1(m)<Ob(m)
            x(:,m) = u(:,m);
        end
    end
    for m = 1:NP
        Ob(m) = func1(x(:,m));
    end
    trace(gen+1) = min(Ob);
    if min(Ob(m))<yz
        break
    end
end
[SortOb, Index] = sort (Ob);
x = x(:,Index);                   %最优变量
X = x(:,1); 
Y = min(Ob);
%%%%%%%%%%%%%%%%%%%%%%%%%%%画图%%%%%%%%%%%
figure
plot(trace);
xlabel('迭代次数');
ylabel('目标函数值');
title('DE 目标函数曲线');

适应函数:

%%%%%%%%%%%%%%%%%%%适应度函数%%%%%%%%%
function result= func1(x)
summ = sum(x.^2);
result = summ;
end
不过感觉这个代码时间复杂度应该不小吧
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值