📝个人主页:研学社的博客
💥💥💞💞欢迎来到本博客❤️❤️💥💥
🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。
⛳️座右铭:行百里者,半于九十。
目录
💥1 概述
📚2 运行结果
🎉3 参考文献
🌈4 Matlab代码实现
💥1 概述
象鼻虫是一种长着细长鼻子的昆虫,来自Curculionoide超科,约有97000种。其中大多数认为害虫会造成环境破坏,但一些种类,如小麦象鼻虫、玉米象鼻虫和棉铃象鼻虫,以对农作物,尤其是谷物造成巨大破坏而闻名。这项研究提出了一种新的基于群的元启发式算法,称为象鼻虫损伤优化算法(WDOA),该算法模拟了象鼻虫的飞行能力、鼻部力量和对作物或农产品的损伤能力。用12个基准单峰和多峰人工景观或优化测试函数对所提出的算法进行了测试。此外,所提出的WDOA被用于五个工程问题,以检查其解决问题的鲁棒性。问题包括旅行推销员问题(TSP)、n-Queens问题、投资组合问题、最优库存控制问题(OIC)和装箱问题(BPP)。所有测试的功能都与广泛使用的粒子群优化(PSO)、遗传算法(GA)、和谐搜索(HS)算法、帝国主义竞争算法(ICA)、萤火虫算法(FA)和差分进化(DE)算法等基准算法进行了比较。此外,所有问题都用DE、FA和HS算法进行了测试,所提出的算法通过提供精确性和合理的速度,在所有函数和问题上表现出鲁棒性和速度。
算法文章来源:

然后本文基于象鼻虫损害优化算法的TSP问题求解,用Matlab代码实现。
📚2 运行结果

 

部分代码:
%% Problem 
 model=MakeModel3();
 CostFunction=@(s) CostF(s,model);        % Cost Function
 nVar=model.n;             % Number of Decision Variables
 VarSize=[1 nVar];         % Decision Variables Matrix Size
 VarMin=0;                 % Lower Bound of Variables
 VarMax=1;                 % Upper Bound of Variables
%% WDOA Parameters
 MaxIt = 300;          % Maximum Number of Iterations
 nPop = 50;            % Number of weevils 
DamageRate = 0.3;                   % Damage Rate
 nweevil = round(DamageRate*nPop);   % Number of Remained weevils
 nNew = nPop-nweevil;                % Number of New weevils
 mu = linspace(1, 0, nPop);          % Mutation Rates
 pMutation = 0.2;                    % Mutation Probability
 MUtwo = 1-mu;                       % Second Mutation
 SnoutPower = 0.8;                   % Weevil Snout power Rate
 FlyPower = 0.03*(VarMax-VarMin);    % Weevil Fly Power Rate
 %% Basics
 % Empty weevil
 weevil.Position = []; 
 weevil.Cost = [];
 weevil.Sol = [];
% Weevils Array
 pop = repmat(weevil, nPop, 1);
 % First weevils
 for i = 1:nPop
 pop(i).Position = unifrnd(VarMin, VarMax, VarSize);
 [pop(i).Cost pop(i).Sol] = CostFunction(pop(i).Position);
 end;
% Sort 
 [~, SortOrder] = sort([pop.Cost]);pop = pop(SortOrder);
 % Best Solution
 BestSol = pop(1);
 % Best Costs Array
 BestCost = zeros(MaxIt, 1);
%% WDOA Body
 for it = 1:MaxIt
 newpop = pop;
 for i = 1:nPop
 for k = 1:nVar
 if rand <= MUtwo(i)
 TMP = mu;TMP(i) = 0;TMP = TMP/sum(TMP);
 j = RouletteWheelS(TMP);
 newpop(i).Position(k) = pop(i).Position(k)+SnoutPower*(pop(j).Position(k)-pop(i).Position(k));
 end;
 % Mutation
 if rand <= pMutation
 newpop(i).Position(k) = newpop(i).Position(k)+FlyPower*randn;
 end;end;
 % Apply Lower and Upper Bound Limits
 newpop(i).Position = max(newpop(i).Position, VarMin);
 newpop(i).Position = min(newpop(i).Position, VarMax);
 [newpop(i).Cost newpop(i).Sol] = CostFunction(newpop(i).Position);
 end;% Asses power
 [~, SortOrder] = sort([newpop.Cost]);newpop = newpop(SortOrder);% Sort
 pop = [pop(1:nweevil);newpop(1:nNew)];% Select 
 [~, SortOrder] = sort([pop.Cost]);pop = pop(SortOrder);% Sort 
 BestSol = pop(1);% Update 
 BestCost(it) = BestSol.Cost;% Store 
 % Iteration 
 disp(['In Iteration No ' num2str(it) ': WDOA Best Cost = ' num2str(BestCost(it))]);
 % Plot Res
 figure(1);
 Plotfig(BestSol.Sol.tour,model);
 end
🎉3 参考文献
部分理论来源于网络,如有侵权请联系删除。











