EDA365电子论坛网
标题:
#技术风云榜#基于非支配排序的多目标PSO算法MATLAB实现
[打印本页]
作者:
ededewa
时间:
2020-11-12 13:35
标题:
#技术风云榜#基于非支配排序的多目标PSO算法MATLAB实现
#技术风云榜#基于非支配排序的多目标PSO算法MATLAB实现
& \& u, V, f2 v6 C/ d% O0 T6 w) o
0 V6 {2 T; ^2 _" g$ }6 `6 N& ~
这一篇是Xue Bing在一区cybernetics发的论文,里面提出了两个多目标PSO特征选择算法,一个是NSPSO另一个是CMDPSO。
( G+ z5 ?' {# D# D( v. f4 T
5 r& m6 i; v6 u1 e
伪代码
1 b0 F" m% R! _4 L
: @( X: Y- H. d
4.jpg
(50.53 KB, 下载次数: 6)
下载附件
保存到相册
2020-11-12 13:32 上传
" F& x( k: U8 \1 J* [
{# E Q- U; f& p& T
0 W* H! ]+ n) R0 Q0 K# a$ J" O
具体流程
! S0 }3 N. x. ]0 ~( @9 t' E
①划分数据集为测试集和训练集
②初始化PSO算法
③迭代开始
④计算两个目标值(论文中是特征数和错误率)
⑤非支配排序
⑥拥挤距离度量并排序
⑥对每个粒子从第一前沿面选择一个粒子作为gbest,更新当前粒子
⑦调整粒子群
⑧迭代结束返回
+ H2 r+ Z9 a7 I* \ d5 I
& a7 X$ H* J! g
MATLAB实现:
2 G0 u3 U3 u( X" W* Q& l+ a) n
NSPSO:
/ l$ L& N' t0 ~9 M
' Z4 ~! W' Z0 a E1 n0 D) {
注意其中FSKNN是我的问题的评价函数,包含两个目标值,都存入到pfitness中
/ t9 ?' W' |% U! _* K7 e
) l- }7 }1 A8 T# n# o( n- b4 E
function [solution,time,pop,pfitness,site,LeaderAVE] = NSPSO(train_F,train_L)
tic
global maxFES
dim = size(train_F,2);
FES = 1;
sizep = 30;
pop = rand(sizep,dim);
popv = rand(sizep,dim);
pfitness = zeros(sizep,2);
LeaderAVE = zeros(1,2);
while FES <maxFES
Off_P = zeros(sizep,dim);
Off_V = zeros(sizep,dim);
ofitness = zeros(sizep,2);
for i=1:sizep
[pfitness(i,1),pfitness(i,2)] = FSKNN(pop(i,:),i,train_F,train_L);
end
Front = NDSort(pfitness(:,1:2),sizep);
[~,rank] = sortrows([Front',-CrowdingDistance(pfitness,Front)']);
LeaderSet = rank(1:10);
solution = pfitness(LeaderSet,:);
LeaderAVE(1) = mean(solution(:,1));
LeaderAVE(2) = mean(solution(:,2));
for i = 1:sizep
good = LeaderSet(randperm(length(LeaderSet),1));
r1 = rand(1,dim);
r2 = rand(1,dim);
Off_V(i,:) = r1.*popv(i,:) + r2.*(pop(good,:)-pop(i,:));
Off_P(i,:) = pop(i,:) + Off_V(i,:);
end
for i=1:sizep
[ofitness(i,1),ofitness(i,2)] = FSKNN(Off_P(i,:),i,train_F,train_L);
end
temppop = [pop;Off_P];
tempv = [popv;Off_V];
tempfiness = [pfitness;ofitness];
[FrontNO,MaxFNO] = NDSort(tempfiness(:,1:2),sizep);
Next = false(1,length(FrontNO));
Next(FrontNO<MaxFNO) = true;
PopObj = tempfiness;
fmax = max(PopObj(FrontNO==1,:),[],1);
fmin = min(PopObj(FrontNO==1,:),[],1);
PopObj = (PopObj-repmat(fmin,size(PopObj,1),1))./repmat(fmax-fmin,size(PopObj,1),1);
% Select the solutions in the last front
Last = find(FrontNO==MaxFNO);
del = Truncation(PopObj(Last,:),length(Last)-sizep+sum(Next));
Next(Last(~del)) = true;
% Population for next generation
pop = temppop(Next,:);
popv = tempv(Next,:);
pfitness = tempfiness(Next,:);
fprintf('GEN: %2d Error: %.4f F:%.2f\n',FES,LeaderAVE(1),LeaderAVE(2));
FES = FES + 1;
end
[FrontNO,~] = NDSort(pfitness(:,1:2),sizep);
site = find(FrontNO==1);
solution = pfitness(site,:);
LeaderAVE(1) = mean(solution(:,1));
LeaderAVE(2) = mean(solution(:,2));
toc
time = toc;
end
- A. P8 s' x+ ^
' @# A2 v: E' x& u) `5 g- S4 D
; ?5 b( w s6 B1 v2 A1 r9 P5 e% J
拥挤距离代码:
2 N5 l7 q# `' P* j4 o
0 D) n/ |- X! C* H8 p% s
function CrowdDis = CrowdingDistance(PopObj,FrontNO)
% Calculate the crowding distance of each solution front by front
% Copyright 2015-2016 Ye Tian
[N,M] = size(PopObj);
CrowdDis = zeros(1,N);
Fronts = setdiff(unique(FrontNO),inf);
for f = 1 : length(Fronts)
Front = find(FrontNO==Fronts(f));
Fmax = max(PopObj(Front,:),[],1);
Fmin = min(PopObj(Front,:),[],1);
for i = 1 : M
[~,Rank] = sortrows(PopObj(Front,i));
CrowdDis(Front(Rank(1))) = inf;
CrowdDis(Front(Rank(end))) = inf;
for j = 2 : length(Front)-1
CrowdDis(Front(Rank(j))) = CrowdDis(Front(Rank(j)))+(PopObj(Front(Rank(j+1)),i)-PopObj(Front(Rank(j-1)),i))/(Fmax(i)-Fmin(i));
end
end
end
end
( Q# T: q3 E. v% l
3 j. I$ c7 p3 T; @. e
; F- \4 d" x$ B; i1 o7 t8 j0 x; H
Truncation.m代码:
8 ?& U9 C# r$ ^; O }
! q& B% x( @- f$ y
function Del = Truncation(PopObj,K)
% Select part of the solutions by truncation
N = size(PopObj,1);
%% Truncation
Distance = pdist2(PopObj,PopObj);
Distance(logical(eye(length(Distance)))) = inf;
Del = false(1,N);
while sum(Del) < K
Remain = find(~Del);
Temp = sort(Distance(Remain,Remain),2);
[~,Rank] = sortrows(Temp);
Del(Remain(Rank(1))) = true;
end
end
2 A4 x/ v; |) v: E; }+ U& S- h3 D
" v% n& p" E. ]' L9 V
% j0 F O: ]; w4 o8 m8 I& `% {
' T. _7 O- y5 j1 }0 I/ Q
作者:
youOK
时间:
2020-11-12 14:19
基于非支配排序的多目标PSO算法MATLAB实现
欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/)
Powered by Discuz! X3.2