|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
#技术风云榜#基于非支配排序的多目标PSO算法MATLAB实现; S! E* d$ ]9 y# Y" s8 ~
, j- a9 O0 Z% D- C9 f4 G
这一篇是Xue Bing在一区cybernetics发的论文,里面提出了两个多目标PSO特征选择算法,一个是NSPSO另一个是CMDPSO。5 n& K9 |; Z e% ~4 e* d
3 Q/ N p/ l7 T伪代码
$ V7 p+ `9 e& c8 v3 C' _; z$ B# W7 C- f4 [5 T! d6 r
. @, w' I& |$ {
( T7 } n$ _+ i& z
: o* q! c% D q1 [具体流程
, c1 d% U6 v# ?2 E% F; B9 u# l- ①划分数据集为测试集和训练集
- ②初始化PSO算法
- ③迭代开始
- ④计算两个目标值(论文中是特征数和错误率)
- ⑤非支配排序
- ⑥拥挤距离度量并排序
- ⑥对每个粒子从第一前沿面选择一个粒子作为gbest,更新当前粒子
- ⑦调整粒子群
- ⑧迭代结束返回- v8 ~/ ^2 I# J$ b& H0 {. D) m* @- G6 A
8 p% a; x2 B8 E" U. w- L7 _MATLAB实现: Y% y/ h. ^. k. D
NSPSO:. S# C. {! i2 q7 [) p# g
. j- }. D2 O* v$ I- r( x
注意其中FSKNN是我的问题的评价函数,包含两个目标值,都存入到pfitness中
, R0 K" ^( ?( q1 i: d7 G9 }/ O$ B; c: _
- 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
! A5 i8 h( ~/ {' Y" n0 I , j2 P3 Z+ ?: x) G( n8 U) A
" X8 Y( b: I5 d+ k* c- N- `
拥挤距离代码:
1 f' X2 u9 [4 W* ?9 C- {# Z
, R7 ]6 x7 t& g6 X. v) E% a% `- 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) M# U' |5 k5 P) I# P$ \, p
4 N `% b1 R# Z4 V, d
- {* ~ W/ L+ t; j2 `7 a Truncation.m代码:
+ ?. b' V" d9 H& a6 ~: Z/ o" a
% \$ A$ Q9 j& v9 p' U, O2 u, m" b" p- 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
: }( ^! @) V2 f- k r " s2 S* n' y! x7 A2 I9 w# ]/ g
% W1 [9 M" l5 q, R
6 r' C; _8 T5 l |
|