📝個人首頁:研學社的部落格
💥💥💞💞歡迎來到本部落格❤️❤️💥💥
🏆部落客優勢:🌞🌞🌞部落格内容盡量做到思維缜密,邏輯清晰,為了友善讀者。
⛳️座右銘:行百裡者,半于九十。
目錄
💥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算法進行了測試,所提出的算法通過提供精确性和合理的速度,在所有函數和問題上表現出魯棒性和速度。
算法文章來源:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiQDOxEzX3xCZlhXam9VbsUmepNXZy9CXwJWZ3xCdh1mcvZ2Lc1zaHRGcWdUYuVzVa9GczoVdG1mWfVGc5RHLwIzX39GZhh2csATMflHLwEzX4xSZz91ZsAzMfRHLGZkRGZkRfJ3bs92YskmNhVTYykVNQJVMRhXVEF1X0hXZ0xiNx8VZ6l2cssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL1AzM4MWMwQWNiRWZhdzNzYzXxEjMxADM5EzLcFTMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
然後本文基于象鼻蟲損害優化算法的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