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
|
|
%% fitness.m 文件
function F=fitness(x)
F =
0;
f1 =
x(1).^2+2*x(2).^2-0.3*cos(3*pi*x(1))
-
0.4*cos(4*pi*x(2))
+
0.7;
f2 =
4*x(1).*exp(-x(1).^2-x(2).^2);
F = abs(f1)+ abs(f2);
end
------------------------------------------------------
%% PSO.m 文件
function[xm,fv] =
PSO(fitness,N,c1,c2,w,M,D,a,b)
% c1,c2:学习因子
% w:惯性权重
% M:最大迭代次数
% D:搜索空间维数
% N:初始化群体个体数目
% 初始化种群的个体(可以在这里限定位置和速度的范围)
format
long; for
i = 1:N
for
j=1:D
x(i,j) = unifrnd (a,b)
;% 随机初始化位置
%unifrnd (a,b) ; 产生一个[a,b]的均匀随机数
v(i,j) = randn; % 随即初始化速度
rand是0-1的均匀分布,randn是均值为0方差为1的正态分布;
end
end
% 先计算各个粒子的适应度,并初始化pi和pg for
i=1:N
p(i) =
fitness(x(i,:));
y(i,:) = x(i,:);
end
pg = x(N,:); %
pg为全局最优 for
i=1:(N-1)
if(fitness(x(i,:))
pg
= x(i,:);
end
end
% 进入主要循环,按照公式依次迭代,直到满足精度要求 for
t=1:M
for
i=1:N %
更新速度、位移
v(i,:)=w*v(i,:)+c1*rand*(y(i,:)-x(i,:))+c2*rand*(pg-x(i,:));
x(i,:)=x(i,:)+v(i,:);
if fitness(x(i,:))
< p(i)
p(i)=fitness(x(i,:));
y(i,:)=x(i,:);
end
if p(i) <
fitness(pg)
pg=y(i,:);
end
end
Pbest(t)=fitness(pg);
end
% 输出结果
disp(['PSO粒子群算法目标函数取最小值时的自变量:'
num2str(pg) ]);
xm=pg'; disp(['PSO粒子群算法目标函数的最小值为:'
num2str( Pbest(t))] );
fv=fitness(pg);
plot(1:t, Pbest);
---------------------------------------------
%% main.m 文件
clear
clc
[X ,Y] =
meshgrid(-3:0.1:3,
-3:0.1:3);
L = length(X); for
i = 1:L
for
j = 1:L
Z(i,j) = fitness([X(i,j),Y(i,j)]);
end
end
%作出适应度函数的图像 可见有两个零点 即方有两个解
surf(X,Y,Z)
xlabel('X(1)');
ylabel('X(2)');
zlabel('fitess(x(1),x(2))');
%利用粒子群算法计算方程组 可知方程组有一个解
%指定搜索范围 -1 -
1 之间
使用的是绝对值和 作为fitness
figure
[xm1,fv1] =
PSO(@fitness,100,2,2,0.8,40,2,-1,1);
legend('粒子群算法');
xlabel('迭代次数');ylabel('适应度');
title('粒子群算法求解方程组');
|