个人主页:研学社的博客
欢迎来到本博客❤️❤️
博主优势:博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。
⛳️座右铭:行百里者,半于九十。
目录
1 概述
2 运行结果
3 参考文献
4 Matlab代码及文章阅读
象鼻虫是一种长着细长鼻子的昆虫,来自Curculionoide超科,约有97000种。其中大多数认为害虫会造成环境破坏,但一些种类,如小麦象鼻虫、玉米象鼻虫和棉铃象鼻虫,以对农作物,尤其是谷物造成巨大破坏而闻名。这项研究提出了一种新的基于群的元启发式算法,称为象鼻虫损伤优化算法(WDOA),该算法模拟了象鼻虫的飞行能力、鼻部力量和对作物或农产品的损伤能力。用12个基准单峰和多峰人工景观或优化测试函数对所提出的算法进行了测试。此外,所提出的WDOA被用于五个工程问题,以检查其解决问题的鲁棒性。问题包括旅行推销员问题(TSP)、n-Queens问题、投资组合问题、最优库存控制问题(OIC)和装箱问题(BPP)。所有测试的功能都与广泛使用的粒子群优化(PSO)、遗传算法(GA)、和谐搜索(HS)算法、帝国主义竞争算法(ICA)、萤火虫算法(FA)和差分进化(DE)算法等基准算法进行了比较。此外,所有问题都用DE、FA和HS算法进行了测试,所提出的算法通过提供精确性和合理的速度,在所有函数和问题上表现出鲁棒性和速度。
算法文章来源:
然后本文基于象鼻虫损害优化算法的TSP问题求解,用Matlab代码实现。
部分代码:
%% Problem Definition
model=CreateModel2(); % Create Model
model.Umax=400;
CostFunction=@(xhat) MyCost(xhat,model); % Cost Function
VarSize=[model.K model.H]; % Size of Decision Variables Matrix
nVar=prod(VarSize); % Number of Decision Variables
VarMin=0; % Lower Bound of Variables
VarMax=1; % Upper Bound of Variables
%% WDOA Parameters
MaxIt = 200; % Maximum Number of Iterations
nPop = 400; % Number of weevils
DamageRate = 0.1; % 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
if BestSol.Sol.IsFeasible
Flag=' *';
else
Flag='';
end
% Iteration
disp(['Iteration ' num2str(it) ': WDOA Best Cost = ' num2str(BestCost(it)) Flag]);
% Plot Solution
figure(1);
PlotSolution(BestSol.Sol,model);
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;
%%
BestSol.Sol
disp(['Sum of Orders or Products Costs ' num2str(BestSol.Sol.SumAX)]);
disp(['Sum of Inventory or Maintenance Costs ' num2str(BestSol.Sol.SumBI)]);
disp(['Used Capacity ' num2str(BestSol.Sol.UC)]);
部分理论来源于网络,如有侵权请联系删除。