💥1 概述
象鼻虫是一种长着细长鼻子的昆虫,来自Curculionoide超科,约有97000种。其中大多数认为害虫会造成环境破坏,但一些种类,如小麦象鼻虫、玉米象鼻虫和棉铃象鼻虫,以对农作物,尤其是谷物造成巨大破坏而闻名。这项研究提出了一种新的基于群的元启发式算法,称为象鼻虫损伤优化算法(WDOA),该算法模拟了象鼻虫的飞行能力、鼻部力量和对作物或农产品的损伤能力。用12个基准单峰和多峰人工景观或优化测试函数对所提出的算法进行了测试。此外,所提出的WDOA被用于五个工程问题,以检查其解决问题的鲁棒性。问题包括旅行推销员问题(TSP)、n-Queens问题、投资组合问题、最优库存控制问题(OIC)和装箱问题(BPP)。所有测试的功能都与广泛使用的粒子群优化(PSO)、遗传算法(GA)、和谐搜索(HS)算法、帝国主义竞争算法(ICA)、萤火虫算法(FA)和差分进化(DE)算法等基准算法进行了比较。此外,所有问题都用DE、FA和HS算法进行了测试,所提出的算法通过提供精确性和合理的速度,在所有函数和问题上表现出鲁棒性和速度。
算法文章来源:
然后本文基于象鼻虫损害优化算法的TSP问题求解,用Matlab代码实现。
📚2 运行结果
部分代码:
nQueen=16; %------------------------------------------------------ CostFunction=@(s) CostF(s); % Cost Function nVar=nQueen; % 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 = 200; % 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))]); figure(1); ShowRes(BestSol.Sol); if BestCost(it)==0 break; end end %% ITR figure; plot(BestCost,'k', 'LineWidth', 2); xlabel('ITR'); ylabel('Cost Value'); ax = gca; ax.FontSize = 14; ax.FontWeight='bold'; set(gca,'Color','c') grid on;
🎉3 参考文献
部分理论来源于网络,如有侵权请联系删除。