⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sacpmde.m

📁 差分进化算法变形——参数自适应差分进化算法
💻 M
字号:
function [tr,bj,bm,n] = SACPMDE(VTR,XVmin,XVmax,D,NP,fname)
% 参数自适应差分进化算法,对Rastrigrin函数起作用
% aa     当前计算到第几次
% VTR    优化的目标值
% fname  选择测试函数
% XVmin  搜索空间下限
% XVmax  搜索空间上限
itermax = 8000;            % maximum number of iterations (generations)
F = 0.6;                  % DE-stepsize F from interval [0, 2]
F1=0.45;
CR = 0.9;                 % crossover probability constant from interval [0, 1]
%-----DE Initialize--------------------------------------------------------
pop = zeros(NP,D);        % initialize pop
for i = 1:NP
   pop(i,:) = XVmin + rand(1,D).*(XVmax - XVmin);
end
popold = zeros(size(pop));% toggle population
val = zeros(1,NP);        % create and reset the "cost array"
bestmem = zeros(1,D);     % best population member ever
bestmemit = zeros(1,D);   % best population member in iteration
for i = 1:NP              % Evaluate the best member after initialization
    input = pop(i,:);
    output(i) = feval(fname,input);
end
val = output';
[bestvalit,idx] = min(val);
bestmemit = pop(idx,:);   % best member of current iteration
bestmem = bestmemit;      % best member ever
bestval = bestvalit;      % best value ever
%-----DE Iteration---------------------------------------------------------
tr = zeros(1,itermax);
for j = 1:itermax
    if (bestval-VTR) < 1e-5
        break
    end   
    popold = pop;
    % generate the trail population
    for i = 1:NP

        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        CR=0.1;
        if val(i)<=mean(val)
           CR=0.1+(0.6-0.1)*(val(i)-max(val))/(min(val)-max(val)); 
        end     
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

        % pick up the donor and differential vectors
        rd = fix(rand(1) * NP + 1);
        while val(rd) > val(i)
            rd = fix(rand(1) * NP + 1);
        end
        rb = fix(rand(1) * NP + 1);
        while rb == i || rb == rd
             rb = fix(rand(1) * NP + 1);
        end
        rc = fix(rand(1) * NP + 1);
        while rc == i || rc == rd || rc==rb
             rc = fix(rand(1) * NP + 1);
        end
        re = fix(rand(1) * NP + 1);
        while re == i || re == rd || re==rb  || re==rc
             re = fix(rand(1) * NP + 1);
        end
        % bulid a trial vector and crossover
        jr = fix(rand(1) * D + 1);

        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        % 找基变量
        tb=rd;
        if val(rb,:)<=min(val(rd,:),val(rc,:))
           tb=rb;
        end
        if val(rc,:)<=min(val(rd,:),val(rb,:))
           tb=rc;
        end
        % 找另两个差分向量;
        tm=rd;
        if val(rb,:)>=min(val(rd,:),val(rc,:)) && val(rb,:)<=max(val(rd,:),val(rc,:))
           tm=rb;
        end
        if val(rc,:)>=min(val(rd,:),val(rb,:)) && val(rc,:)<=max(val(rd,:),val(rb,:))
            tm=rc;
        end
        % 找最差的向量
        tw=rd;
        if val(rb,:)>=max(val(rd,:),val(rc,:))
           tw=rb;
        end
        if val(rc,:)>=max(val(rd,:),val(rb,:))
           tw=rc;
        end
        % 自适应缩放因子
        F=0.1+0.8*(val(tm)-val(tb))/(val(tw)-val(tb));
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

        for k = 1:D
            if rand(1)<=CR || k==jr
               diff = F * (popold(tm,k) - popold(tw,k));
               pop(i,k) = popold(tb,k) + diff;                
            else
                pop(i,k) = popold(i,k);
            end
        end
        for k = 1:D
           if pop(i,k) > XVmax(k)
               pop(i,k) = XVmax(k);
           end
           if pop(i,k) < XVmin(k)
               pop(i,k) = XVmin(k);
           end
        end
    end
    % select trial vector
    for i = 1:NP
        input = pop(i,:);
        output = feval(fname,input);
        if output < val(i)
            val(i) = output;
        else
            pop(i,:) = popold(i,:);
        end
    end
    % find the best parameter vector and the best objective function
    [bestvalit,idx] = min(val);
    bestmemit = pop(idx,:); 
    if bestvalit < bestval
        bestval = bestvalit;
        bestmem = bestmemit;
    end
    tr(j) = bestval;
    if abs(tr(j)) < VTR
        break
    end   
    bestval
    tr(j)=bestval;
end
bj=bestval;
bm=bestmem;
n=j;

    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -