Optimization based on the smart behavior of plants with its engineering applications: Ivy代码解读

function [Destination_fitness,Destination_position,Convergence_curve]=IVY(N,Max_iteration,lb,ub,dim,fobj)


CostFunction = @(x) fobj(x);

VarMin = lb;       %Variables Lower Bound
VarMax =ub ;       %Variables Upper Bound

%% IVYA Parameters

MaxIt = Max_iteration;        % Maximum Number of Iterations
nPop = N;                     % Population Size
VarSize = [1 dim];            % Decision Variables Matrix Size

%% Initialization

% Empty Plant Structure
empty_plant.Position = [];
empty_plant.Cost = [];
empty_plant.GV= [];
pop = repmat(empty_plant, nPop, 1);    % Initial Population Array

for i = 1:numel(pop) %fi 数组中数据元素的数量

    % Initialize Position
    %% Eq.(1)
    pop(i).Position = unifrnd(VarMin, VarMax, VarSize); %Continuous uniform random numbers r = unifrnd(a,b) 从具有下部端点 a 和上部端点 b 的连续均匀分布中生成一个随机数。
    %% Eq.(6)-upper condition % 
    pop(i).GV=(pop(i).Position /(VarMax-VarMin));  
    % Evaluation
    pop(i).Cost = CostFunction(pop(i).Position);

end

% Initialize Best Cost History
BestCosts = zeros(MaxIt, 1);

%% Ivy Main Loop

for it = 1:MaxIt

    % Get Best and Worst Cost Values
    Costs = [pop.Cost];
    % Best and worst costs
    BestCost = min(Costs);
    WorstCost = max(Costs);

    % Initialize new Population
    newpop = [];

    for i = 1:numel(pop)

        ii=i+1;
        if i==numel(pop) %最后一轮时设置ii=1
            ii=1;
        end

        newsol = empty_plant;

        beta_1=1+(rand/2); % beta value in line 8 of "Algorithm 1 (Fig.2 in paper)"

        if  pop(i).Cost<beta_1*pop(1).Cost
            %% Eq.(5)-(6)
            newsol.Position =pop(i).Position +abs(randn(VarSize)) .*( pop(ii).Position - pop(i).Position )+ randn(VarSize) .*(pop(i).GV);
        else
            %% Eq.(7)
            newsol.Position =pop(1).Position .*(rand+randn(VarSize).*(pop(i).GV));
        end

    %% Eq.(3)
        pop(i).GV=(pop(i).GV).*((rand^2)*(randn(1,dim))); %肯定向梯度下降的方向生长

        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        newsol.Position = max(newsol.Position, VarMin);
        newsol.Position = min(newsol.Position, VarMax);
        %% Eq.(8)
        newsol.GV=(newsol.Position /(VarMax-VarMin));

        %% Evaluate new population
        newsol.Cost = CostFunction(newsol.Position);

        newpop = [newpop
                  newsol];

    end

    % Merge Populations
    pop = [pop
        newpop];

    % Sort Population
    [~, SortOrder]=sort([pop.Cost]);
    pop = pop(SortOrder);

    % Competitive Exclusion (Delete Extra Members)
    if numel(pop)>nPop
        pop = pop(1:nPop);
    end

    % Store Best Solution Ever Found
    BestSol = pop(1);
    BestCosts(it) = BestSol.Cost;
    Convergence_curve(it) =pop(1).Cost;

    %     Display Iteration Information
    disp(['Iteration ' num2str(it) ': Best Cost = ' num2str(BestCosts(it))]);

end


%% Results
Destination_fitness=pop(1).Cost;
Destination_position=pop(1).Position;
%% plot
plot( Convergence_curve, 'LineWidth', 2); hold on
end

 其他代码见附件 或者论文地址下载

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

QianMo-WXJ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值