Skip to content

Commit aa92065

Browse files
authored
Add files via upload
1 parent 99c1e83 commit aa92065

File tree

5 files changed

+204
-0
lines changed

5 files changed

+204
-0
lines changed

Main.m

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
%---------------------------------------------------------------------%
2+
% Salp Swarm Algorithm (SSA) source codes demo version %
3+
%---------------------------------------------------------------------%
4+
5+
6+
%---Inputs-----------------------------------------------------------
7+
% feat : feature vector ( Instances x Features )
8+
% label : label vector ( Instances x 1 )
9+
% N : Number of salps
10+
% max_Iter : Maximum number of iterations
11+
12+
%---Output-----------------------------------------------------------
13+
% sFeat : Selected features (instances x features)
14+
% Sf : Selected feature index
15+
% Nf : Number of selected features
16+
% curve : Convergence curve
17+
%--------------------------------------------------------------------
18+
19+
20+
%% Salp Swarm Algorithm
21+
clc, clear, close;
22+
% Benchmark data set
23+
load ionosphere.mat;
24+
25+
% Set 20% data as validation set
26+
ho = 0.2;
27+
% Hold-out method
28+
HO = cvpartition(label,'HoldOut',ho);
29+
30+
% Parameter setting
31+
N = 10;
32+
max_Iter = 100;
33+
34+
% Salp Swarm Algorithm
35+
[sFeat,Sf,Nf,curve] = jSSA(feat,label,N,max_Iter,HO);
36+
37+
% Plot convergence curve
38+
plot(1:max_Iter,curve);
39+
xlabel('Number of iterations');
40+
ylabel('Fitness Value');
41+
title('SSA'); grid on;
42+
43+
44+
45+

ionosphere.mat

57.1 KB
Binary file not shown.

jFitnessFunction.m

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
% Notation: This fitness function is for demonstration
2+
3+
function cost = jFitnessFunction(feat,label,X,HO)
4+
if sum(X == 1) == 0
5+
cost = 1;
6+
else
7+
cost = jwrapperKNN(feat(:, X == 1),label,HO);
8+
end
9+
end
10+
11+
12+
function error = jwrapperKNN(sFeat,label,HO)
13+
%---// Parameter setting for k-value of KNN //
14+
k = 5;
15+
xtrain = sFeat(HO.training == 1,:);
16+
ytrain = label(HO.training == 1);
17+
xvalid = sFeat(HO.test == 1,:);
18+
yvalid = label(HO.test == 1);
19+
Model = fitcknn(xtrain,ytrain,'NumNeighbors',k);
20+
pred = predict(Model,xvalid);
21+
num_valid = length(yvalid);
22+
correct = 0;
23+
for i = 1:num_valid
24+
if isequal(yvalid(i),pred(i))
25+
correct = correct + 1;
26+
end
27+
end
28+
Acc = correct / num_valid;
29+
error = 1 - Acc;
30+
end
31+

jSSA.m

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
function [sFeat,Sf,Nf,curve] = jSSA(feat,label,N,max_Iter,HO)
2+
lb = 0;
3+
ub = 1;
4+
thres = 0.5;
5+
6+
fun = @jFitnessFunction;
7+
dim = size(feat,2);
8+
X = zeros(N,dim);
9+
for i = 1:N
10+
for d = 1:dim
11+
X(i,d) = lb + (ub - lb) * rand();
12+
end
13+
end
14+
% Pre
15+
fit = zeros(1,N);
16+
fitF = inf;
17+
18+
curve = inf;
19+
t = 1;
20+
%---Iteration start----------------------------------------------------
21+
while t <= max_Iter
22+
for i = 1:N
23+
fit(i) = fun(feat,label,(X(i,:) > thres),HO);
24+
if fit(i) < fitF
25+
Xf = X(i,:);
26+
fitF = fit(i);
27+
end
28+
end
29+
c1 = 2 * exp(-(4 * t / max_Iter) ^ 2);
30+
for i = 1:N
31+
if i == 1
32+
for d = 1:dim
33+
c2 = rand();
34+
c3 = rand();
35+
if c3 >= 0.5
36+
X(i,d) = Xf(d) + c1 * ((ub - lb) * c2 + lb);
37+
else
38+
X(i,d) = Xf(d) - c1 * ((ub - lb) * c2 + lb);
39+
end
40+
end
41+
else
42+
for d = 1:dim
43+
X(i,d) = (X(i,d) + X(i-1,d)) / 2;
44+
end
45+
end
46+
XB = X(i,:); XB(XB > ub) = ub; XB(XB < lb) = lb;
47+
X(i,:) = XB;
48+
end
49+
curve(t) = fitF;
50+
fprintf('\nIteration %d Best (SSA)= %f',t,curve(t))
51+
t = t + 1;
52+
end
53+
Pos = 1:dim;
54+
Sf = Pos((Xf > thres) == 1);
55+
Nf = length(Sf);
56+
sFeat = feat(:,Sf);
57+
end
58+
59+
60+
61+

jSSA2.m

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
function [sFeat,Sf,Nf,curve] = jSSA2(feat,label,N,max_Iter,HO)
2+
lb = 0;
3+
ub = 1;
4+
thres = 0.5;
5+
6+
fun = @jFitnessFunction;
7+
dim = size(feat,2);
8+
X = zeros(N,dim);
9+
for i = 1:N
10+
for d = 1:dim
11+
X(i,d) = lb + (ub - lb) * rand();
12+
end
13+
end
14+
% Pre
15+
fit = zeros(1,N);
16+
fitF = inf;
17+
18+
curve = inf;
19+
t = 1;
20+
%---Iteration start----------------------------------------------------
21+
while t <= max_Iter
22+
for i = 1:N
23+
fit(i) = fun(feat,label,(X(i,:) > thres),HO);
24+
if fit(i) < fitF
25+
Xf = X(i,:);
26+
fitF = fit(i);
27+
end
28+
end
29+
% Additional sort in the first iteration to improve the
30+
% initial behavior by divide salps into leader and followers
31+
if t == 1
32+
[fit, idx] = sort(fit,'ascend');
33+
X = X(idx,:);
34+
end
35+
c1 = 2 * exp(-(4 * t / max_Iter) ^ 2);
36+
for i = 1:N
37+
if i == 1
38+
for d = 1:dim
39+
c2 = rand();
40+
c3 = rand();
41+
if c3 >= 0.5
42+
X(i,d) = Xf(d) + c1 * ((ub - lb) * c2 + lb);
43+
else
44+
X(i,d) = Xf(d) - c1 * ((ub - lb) * c2 + lb);
45+
end
46+
end
47+
else
48+
for d = 1:dim
49+
X(i,d) = (X(i,d) + X(i-1,d)) / 2;
50+
end
51+
end
52+
XB = X(i,:); XB(XB > ub) = ub; XB(XB < lb) = lb;
53+
X(i,:) = XB;
54+
end
55+
curve(t) = fitF;
56+
fprintf('\nIteration %d Best (SSA)= %f',t,curve(t))
57+
t = t + 1;
58+
end
59+
Pos = 1:dim;
60+
Sf = Pos((Xf > thres) == 1);
61+
Nf = length(Sf);
62+
sFeat = feat(:,Sf);
63+
end
64+
65+
66+
67+

0 commit comments

Comments
 (0)