EDA365电子论坛网
标题:
基于非支配排序的多目标PSO算法MATLAB实现
[打印本页]
作者:
thinkfunny
时间:
2020-10-22 15:39
标题:
基于非支配排序的多目标PSO算法MATLAB实现
本帖最后由 thinkfunny 于 2020-10-22 15:41 编辑
- C3 A6 z5 F3 A3 S
. R0 n* Z9 q' I! P9 Q
这一篇是Xue Bing在一区cybernetics发的论文,里面提出了两个多目标PSO特征选择算法,一个是NSPSO另一个是CMDPSO。其中NSPSO是参考了NSGA2的框架和思想。
4 O# e& |9 h1 n
3 I7 \, j& ~" X5 T( n; V* J
伪代码
! b7 |2 l$ [7 E( k+ b' S# i9 M
1.jpg
(50.53 KB, 下载次数: 5)
下载附件
保存到相册
2020-10-22 15:37 上传
0 a; C/ G6 M- M1 j$ p) ]1 C, a6 n
具体流程
$ m* D. B$ B( g9 ^9 X& T- h
①划分数据集为测试集和训练集
②初始化PSO算法
③迭代开始
④计算两个目标值(论文中是特征数和错误率)
⑤非支配排序
⑥拥挤距离度量并排序
⑥对每个粒子从第一前沿面选择一个粒子作为gbest,更新当前粒子
⑦调整粒子群
⑧迭代结束返回
5 z6 V' i9 ?' v4 y' n3 t
. V" W5 D/ M$ H- r, G0 e- ^
MATLAB实现:
" y6 j7 l- E3 p! `6 s
NSPSO:
9 c2 a. q' m3 Q' h2 d7 q; a
3 h% J. e3 I3 J6 `
注意其中FSKNN是我的问题的评价函数,包含两个目标值,都存入到pfitness中
! K5 D4 E% Q2 d( j$ A
7 K( }6 H; E0 l$ l
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
1 e3 t7 H' S' T0 o3 ~
- G( Q; F9 T' _5 A* g5 c
$ B; R( i2 C8 @: Y! e0 ~# \* [
拥挤距离代码:
0 `: \% j- {# E: T, K
9 w& f$ g3 T D6 v7 h4 Y
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
- O& w$ \1 h* u/ X
- a! q, U5 U w
* V& f5 M: [5 Y. i
Truncation.m代码:
+ |* n" A6 g# v
. J0 G/ D& i* L7 \( G- `& F
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
, M4 \$ [9 a) _! I
/ E; u+ S0 }/ X) _
& i) x: z$ S* @% L5 S
. c2 T( Y% q* d+ W0 z
作者:
zmmdmn
时间:
2020-10-26 10:57
NSPSO采用NSGA2的框架
欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/)
Powered by Discuz! X3.2