非支配排序算法 matlab
时间: 2023-09-23 12:07:14 浏览: 50
非支配排序算法(Non-dominated Sorting Algorithm,NSGA)是一种多目标优化算法,用于解决带有多个目标函数的问题。下面是MATLAB代码示例:
```matlab
function [fronts,X,F] = NSGA2(FUN,X0,lb,ub,NP,NGen)
% FUN: 目标函数
% X0: 初始种群
% lb: 变量下界
% ub: 变量上界
% NP: 种群大小
% NGen: 迭代次数
nObj = length(FUN); % 目标函数个数
nVar = size(X0,2); % 变量个数
X = zeros(NP,nVar); % 存储种群
F = zeros(NP,nObj); % 存储目标函数值
% 初始化种群
for i = 1:NP
X(i,:) = X0(i,:);
F(i,:) = FUN(X(i,:));
end
% 归一化处理
Fmax = max(F,[],1);
Fmin = min(F,[],1);
F = (F - repmat(Fmin,NP,1)) ./ repmat(Fmax-Fmin,NP,1);
fronts = cell(1,NGen); % 存储每一代的帕累托前沿
for iGen = 1:NGen
% 非支配排序
[F,rank] = sortrows(F);
X = X(rank,:);
rank = NonDominatedSorting(F);
% 计算拥挤度
dist = CrowdingDistance(F,rank);
% 选择新的种群
idx = Selection(rank,dist,NP);
X = X(idx,:);
F = F(idx,:);
% 进行交叉和变异
X = GeneticOperators(X,lb,ub);
% 更新目标函数值
for i = 1:NP
F(i,:) = FUN(X(i,:));
end
% 归一化处理
F = (F - repmat(Fmin,NP,1)) ./ repmat(Fmax-Fmin,NP,1);
fronts{iGen} = F;
end
end
% 非支配排序
function rank = NonDominatedSorting(F)
NP = size(F,1); % 种群大小
rank = zeros(1,NP);
nDom = zeros(1,NP);
S = cell(1,NP);
for i = 1:NP
S{i} = [];
for j = 1:NP
if i ~= j
if all(F(i,:) <= F(j,:)) && any(F(i,:) < F(j,:))
S{i} = [S{i},j];
elseif all(F(i,:) >= F(j,:)) && any(F(i,:) > F(j,:))
nDom(i) = nDom(i) + 1;
end
end
end
if nDom(i) == 0
rank(i) = 1;
end
end
k = 1;
while any(rank==0)
Q = find(rank==0 & nDom==0);
for i = 1:length(Q)
p = Q(i);
rank(p) = k;
for j = 1:length(S{p})
nDom(S{p}(j)) = nDom(S{p}(j)) - 1;
end
end
k = k + 1;
end
end
% 计算拥挤度
function dist = CrowdingDistance(F,rank)
NP = size(F,1); % 种群大小
nObj = size(F,2); % 目标函数个数
dist = zeros(1,NP);
for iObj = 1:nObj
[~,idx] = sort(F(:,iObj));
dist(idx(1)) = inf;
dist(idx(end)) = inf;
for i = 2:NP-1
dist(idx(i)) = dist(idx(i)) + (F(idx(i+1),iObj)-F(idx(i-1),iObj)) / (max(F(:,iObj))-min(F(:,iObj)));
end
end
end
% 选择新的种群
function idx = Selection(rank,dist,NP)
idx = zeros(1,NP);
for iRank = 1:max(rank)
I = find(rank==iRank);
[~,idxI] = sort(dist(I),'descend');
idx(iRank:length(I):NP) = I(idxI);
end
end
% 进行交叉和变异
function X = GeneticOperators(X,lb,ub)
[NP,nVar] = size(X); % 种群大小和变量个数
% 交叉
for i = 1:2:NP
p1 = X(i,:);
p2 = X(i+1,:);
r = rand(1,nVar);
c1 = r.*p1 + (1-r).*p2;
c2 = (1-r).*p1 + r.*p2;
X(i,:) = c1;
X(i+1,:) = c2;
end
% 变异
for i = 1:NP
if rand < 0.1
X(i,:) = lb + (ub-lb) .* rand(1,nVar);
end
end
end
```
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)