目录
1 概述
2 数学模型
3 运行结果
4 参考文献
5 Matlab代码及详细文章
1 概述
基于分解的多目标进化算法(multiobjective evolu-tionary algorithm based on decomposition,MOEA/D)是一种利用分解策略解决多目标问题的算法2'。该算法通过聚合函数将多目标问题分解为N个子问题,每个子问题分配一个对应的权重和相关种群点的邻域"3'。种群迭代通过邻域内随机选择两个父代点交叉产生新的子代点后更新参考点Z ,然后通过聚合方法比较子代点与父代点,更新邻域内所有被支配的点,有效地利用局部信息,避免陷入局部最优,最后将非支配解存入外部存档(external population, EP)。MOEA/D通过分解的思想,每一个点(子问题)对应一个权重进行求解,由于权重是均匀分布在目标空间的,故MOEA/D算法相对于其他算法在计算效率提高的同时保证了点的均匀分布。
分解是传统多目标优化的基本策略。然而,它尚未在多目标进化优化中得到广泛应用。提出一种基于分解(MOEA/D)的多目标进化算法。它将多目标优化问题分解为多个标量优化子问题,并同时优化它们。每个子问题都通过使用来自其几个相邻子问题的信息进行优化,这使得MOEA / D在每一代的计算复杂性低于MOGLS和非支配排序遗传算法II(NSGA-II)。实验结果表明,采用简单分解方法的MOEA/D在多目标0-1背包问题和连续多目标优化问题上优于MOGLS和NSGA-II或具有与NSGA-II相似的性能。研究表明,使用目标归一化MOEA/D可以处理不同比例的目标,而使用高级分解方法的MOEA/D可以为3目标测试实例生成一组分布非常均匀的解。本文还对MOEA/D在小群体下的能力、MOEA/D的可扩展性和敏感性进行了实验研究。
2 数学模型
详细模型讲解见第四部分。
3 运行结果
clc;
clear;
close all;
%% Problem Definition
CostFunction = @(x) ZDT(x); % Cost Function
nVar = 3; % Number of Decision Variables
VarSize = [nVar 1]; % Decision Variables Matrix Size
VarMin = 0; % Decision Variables Lower Bound
VarMax = 1; % Decision Variables Upper Bound
nObj = numel(CostFunction(unifrnd(VarMin, VarMax, VarSize)));
%% MOEA/D Settings
MaxIt = 100; % Maximum Number of Iterations
nPop = 50; % Population Size (Number of Sub-Problems)
nArchive = 50;
T = max(ceil(0.15*nPop), 2); % Number of Neighbors
T = min(max(T, 2), 15);
crossover_params.gamma = 0.5;
crossover_params.VarMin = VarMin;
crossover_params.VarMax = VarMax;
%% Initialization
% Create Sub-problems
sp = CreateSubProblems(nObj, nPop, T);
% Empty Individual
empty_individual.Position = [];
empty_individual.Cost = [];
empty_individual.g = [];
empty_individual.IsDominated = [];
% Initialize Goal Point
%z = inf(nObj, 1);
z = zeros(nObj, 1);
% Create Initial Population
pop = repmat(empty_individual, nPop, 1);
for i = 1:nPop
pop(i).Position = unifrnd(VarMin, VarMax, VarSize);
pop(i).Cost = CostFunction(pop(i).Position);
z = min(z, pop(i).Cost);
end
for i = 1:nPop
pop(i).g = DecomposedCost(pop(i), z, sp(i).lambda);
end
% Determine Population Domination Status
pop = DetermineDomination(pop);
% Initialize Estimated Pareto Front
EP = pop(~[pop.IsDominated]);
%% Main Loop
for it = 1:MaxIt
for i = 1:nPop
% Reproduction (Crossover)
K = randsample(T, 2);
j1 = sp(i).Neighbors(K(1));
p1 = pop(j1);
j2 = sp(i).Neighbors(K(2));
p2 = pop(j2);
y = empty_individual;
y.Position = Crossover(p1.Position, p2.Position, crossover_params);
y.Cost = CostFunction(y.Position);
z = min(z, y.Cost);
for j = sp(i).Neighbors
y.g = DecomposedCost(y, z, sp(j).lambda);
if y.g <= pop(j).g
pop(j) = y;
end
end
end
% Determine Population Domination Status
pop = DetermineDomination(pop);
ndpop = pop(~[pop.IsDominated]);
EP = [EP
ndpop]; %#ok
EP = DetermineDomination(EP);
EP = EP(~[EP.IsDominated]);
if numel(EP)>nArchive
Extra = numel(EP)-nArchive;
ToBeDeleted = randsample(numel(EP), Extra);
EP(ToBeDeleted) = [];
end
% Plot EP
figure(1);
PlotCosts(EP);
pause(0.01);
% Display Iteration Information
disp(['Iteration ' num2str(it) ': Number of Pareto Solutions = ' num2str(numel(EP))]);
end
%% Reults
disp(' ');
EPC = [EP.Cost];
for j = 1:nObj
disp(['Objective #' num2str(j) ':']);
disp([' Min = ' num2str(min(EPC(j, :)))]);
disp([' Max = ' num2str(max(EPC(j, :)))]);
disp([' Range = ' num2str(max(EPC(j, :))-min(EPC(j, :)))]);
disp([' St.D. = ' num2str(std(EPC(j, :)))]);
disp([' Mean = ' num2str(mean(EPC(j, :)))]);
disp(' ');
end
4 参考文献
[1]王启翔,许峰.基于协同进化策略改进的MOEA/D算法[J].科技创新与应用,2021(4):24-27
[2]易灵芝,林佳豪,刘建康,罗显光,李旺.改进自适应MOEA/D算法的楼宇负荷优化调度[J].计算机工程与应用,2022,58(2):295-302
[3]Q. Zhang and H. Li, "MOEA/D: A Multiobjective Evolutionary Algorithm Based on Decomposition," in IEEE Transactions on Evolutionary Computation, vol. 11, no. 6, pp. 712-731, Dec. 2007, doi: 10.1109/TEVC.2007.892759.
部分理论引用网络文献,如有侵权请联系删除。
👨🎓博主课外兴趣:中西方哲学,送予读者:
👨💻做科研,涉及到一个深在的思想系统,需要科研者逻辑缜密,踏实认真,但是不能只是努力,很多时候借力比努力更重要,然后还要有仰望星空的创新点和启发点。当哲学课上老师问你什么是科学,什么是电的时候,不要觉得这些问题搞笑,哲学就是追究终极问题,寻找那些不言自明只有小孩子会问的但是你却回答不出来的问题。建议读者按目录次序逐一浏览,免得骤然跌入幽暗的迷宫找不到来时的路,它不足为你揭示全部问题的答案,但若能让人胸中升起一朵朵疑云,也未尝不会酿成晚霞斑斓的别一番景致,万一它居然给你带来了一场精神世界的苦雨,那就借机洗刷一下原来存放在那儿的“真理”上的尘埃吧。
或许,雨过云收,神驰的天地更清朗.......🔎🔎🔎
5 Matlab代码及详细文章