-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathssa.m
128 lines (117 loc) · 4.86 KB
/
ssa.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
clear all;
close all;
clc;
%% 参数设置
N=30; %麻雀个数
dim=2; %评估函数维度
N_discoverer=0.7*N; %发现者个数
N_Followers=0.1*N; %追随者个数
N_Vigilant=0.2*N; %警戒者个数
Max_iter=100; %最大迭代次数
ST=0.6; %安全阈值
%% 测试函数
f=@(x) sum(x.^2);
%f = str2func('cec17_func');
ub=10;%边界上限
lb=-10;%边界下限
%% 初始化
x=lb+rand(N,dim).*(ub-lb); %初始化麻雀种群
for i=1:N
%fitness(i)=f(x(i,:)); %计算麻雀种群的适应度值
fitness(i)=f(x(i,:));
end
[A,index]=sort(fitness); %A是排序好的数组 index是下标 [2 1 3 5] index = [2,1,3,4]
x_best=x(index(1),:); %记录所有麻雀走过的位置的最优位置
x_worst=x(index(end),:); %记录所有麻雀走过的位置的最差位置
best_fitness=A(1); %记录所有麻雀走过的位置的最优值
worst_fitness=A(end); %记录所有麻雀走过的位置的最差值
x_best_currently=x(index(1),:); %记录当前麻雀种群最优位置
x_worst_currently=x(index(end),:); %记录当前麻雀种群最差位置
best_fitness_currently=A(1); %记录当前麻雀种群最优值
worst_fitness_currently=A(end); %记录当前麻雀种群最差值
x_discoverer=x(index(1:N_discoverer),:); %发现者位置
x_Followers=x(index(N_discoverer+1:N_discoverer+N_Followers),:); %追随者位置
x_Vigilant=x(index(N_discoverer+N_Followers+1:N),:); %警戒者位置
B=[-1,1];
F=best_fitness; %记录每次迭代的麻雀走过的位置的最优值
iter=1; %初始化迭代次数
%% 开始迭代更新
while iter<Max_iter
for i=1:dim
C(i)=B(round(rand)+1);
end
A=C'*inv((C*C')); %c'表示对于矩阵转置 inv表示对矩阵转置
R2=rand;
%更新发现者位置
for i=1:N_discoverer
for j=1:dim
if R2<ST
x_discoverer(i,j)=x_discoverer(i,j)*exp(-i/rand*Max_iter);
else
x_discoverer(i,j)=x_discoverer(i,j)+randn;
end
end
%边界判断
ub_flag=x_discoverer(i,:)>ub; %取出第i行 看看每一个元素是否超出边界 否为0 是为1
lb_flag=x_discoverer(i,:)<lb;
% 超出边界的 按超出边界处理 小于下边界 -> 下边界 大于上边界 -> 上边界
x_discoverer(i,:)=(x_discoverer(i,:).*(~(ub_flag+lb_flag)))+ub.*ub_flag+lb.*lb_flag;
end
%更新追随者位置
for i=1:N_Followers
for j=1:dim
if i>N/2
x_Followers(i,j)=rand*exp((x_worst_currently(j)-x_Followers(i,j))/i^2);
else
x_Followers(i,j)=x_discoverer(1,j)+abs(x_Followers(i,j)-x_discoverer(1,j))*A(j);
end
end
%边界判断
ub_flag=x_Followers(i,:)>ub;
lb_flag=x_Followers(i,:)<lb;
x_Followers(i,:)=(x_Followers(i,:).*(~(ub_flag+lb_flag)))+ub.*ub_flag+lb.*lb_flag;
end
%更新警戒者位置
for i=1:N_Vigilant
for j=1:dim
if f(x_Vigilant(i,:))~=best_fitness_currently
x_Vigilant(i,j)=x_best_currently(j)+randn*abs(x_Vigilant(i,j)-x_best_currently(j));
else
x_Vigilant(i,j)=x_Vigilant(i,j)+B(round(rand)+1)*(abs(x_Vigilant(i,j)-x_worst_currently(j)))/abs(f(x_Vigilant(i,:))-worst_fitness_currently)+1;
end
end
%边界判断
ub_flag=x_Vigilant(i,:)>ub;
lb_flag=x_Vigilant(i,:)<lb;
x_Vigilant(i,:)=(x_Vigilant(i,:).*(~(ub_flag+lb_flag)))+ub.*ub_flag+lb.*lb_flag;
end
x=[x_discoverer;x_Followers;x_Vigilant]; %得到该次迭代下的所有麻雀的新位置
for i=1:N
%fitness(i)=f(x(i,:)); %计算适应度
fitness(i)=f(x(i,:));
end
[E,index]=sort(fitness);
if f(x(index(1),:))<best_fitness %更新所有麻雀走过的位置的最优位置和最优值
%best_fitness=f(x(index(1),:));
best_fitness=f(x(index(1),:));
x_best=x(index(1),:);
end
if f(x(index(end),:))>worst_fitness %更新所有麻雀走过的位置的最差位置和最差值
worst_fitness= f(x(index(end),:));
x_worst=x(index(end),:);
end
x_best_currently=x(index(1),:); %更新当前麻雀种群的最优位置
x_worst_currently=x(index(end),:); %更新当前麻雀种群的最差位置
best_fitness_currently=E(1); %更新当前麻雀的种群的最优值
worst_fitness_currently=E(end); %更新当前麻雀的种群的最差值
x_discoverer=x(index(1:N_discoverer),:); %重新选择种群中的发现者
x_Followers=x(index(N_discoverer+1:N_discoverer+N_Followers),:); %重新选择种群中的追随者
x_Vigilant=x(index(N_discoverer+N_Followers+1:N),:); %重新选择种群中的警戒者
F=[F,best_fitness];
iter=iter+1; %迭代次数加一
end
%% 结果 作图
display(['最优值是:',num2str(F(end)),'最优麻雀位置:',num2str(x_best)]);
figure(1);
plot(F);
xlabel('迭代次数'),ylabel('适应度值');