Matlab-粒子群算法与蚁群算法

This is my blog.
两个自然启发式的算法
感觉机器学习的算法像模拟,仿生学😳
我瞎说的

粒子群算法(PSO)

来源于鸟觅食,自己的经验以及他人的经验。每只鸟记住的最优位置是局部最优。整个鸟群的觅食中心趋向全局最优。是一种概率算法。也可以用来训练神经网络(🧝🏻‍♀️)

三准则

冲突避免、速度匹配、群体中心

中心算法

p:位置 v:速度
式一:\(v_i^d = \omega v_i^d+c_1 r_1(p_i^d - x_i^d)+c_2 r_2(p_g^d - x_i^d \)
式二:\(x_i^d = x_i^d + \alpha v_i^d \)
其中\(\omega\)是非负数,惯性因子;加速常数\(c_1 \)和\(c_2 \)是非负常数;\(r_1 \)和\(r_2 \)是[0,1]范围内变换的随机数;\(\alpha\)是约束因子,控制速度的权重。

步骤

  1. 初始化;粒子群(速度、位置)、惯性因子、加速常数、最大迭代次数、算法终止最小允许误差
  2. 评价每个粒子的初始适应值
  3. 将初始适应值作为当前局部最优值,最佳初始适应值最为全局最优值
  4. 根据式一更新速度
  5. 根据式二,计算,若更优,则更新
  6. 重复4,5,直到达到终止条件
  7. 输出

参数选择

  1. 粒子数
    一般20~40,对于特殊100~200,粒子数越多,越容易找到全局最优解
  2. 惯性因子
    其大了,更新幅度大了,全局搜索能力增强,但容易错失局部寻优能力;
    一般为0.6~0.7
  3. 加速常数
    一般两者都取2.0;\(c_1 = 0 \)没有自身经验;\(c_2 = 0 \)没有社会经验
  4. 最大飞翔速度
    设定为每维变化的10%~20%

例子

\(max f(x) = 2.1(1-x+2x^2)e^(-\frac{x^2}{2}),x \in \left[ -5,5 \right] \)

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
function main
clc;clear all;close all;
tic;
E0 = 0.001;
MaxNum = 100;
narvs = 1;
particlesize = 30;
c1 = 2;
c2 = 2;
w = 0.6;
vmax = 0.8;
x = -5 + 10 * rand(particlesize,narvs);
v = 2 * rand(particlesize,narvs);
fitness = inline('1/(1+(2.1*(1-x+2*x.^2).*exp(-x.^2/2)))','x');
for i = 1:particlesize
for j = 1:narvs
f(i) = fitness(x(i,j));
end
end
personalbest_x = x;
personalbest_faval = f;
[globalbest_faval i] = min(personalbest_faval);
globalbest_x = personalbest_x(i,:);
k = 1;
while k <= MaxNum
for i = 1:particlesize
for j = 1:narvs
f(i) = fitness(x(i,j));
end
if f(i)<personalbest_faval(i)
personalbest_faval(i) = f(i);
personalbest_x(i,:) = x(i,:);
end
end
[globalbest_faval i] = min(personalbest_faval);
globalbest_x = personalbest_x(i,:);
for i = 1:particlesize
v(i,:) = w * v(i,:) + c1 * rand * (personalbest_x(i,:) - x(i,:))...
+ c2 * rand * (globalbest_x - x(i,:));
for j = 1:narvs
if v(i,j)>vmax
v(i,j) = vmax;
elseif v(i,j) < -vmax;
v(i,j) = -vmax;
end
end
x(i,:) = x(i,:) + v(i,:);
end
if abs(globalbest_faval)<E0,break,end
k = k + 1;
end
Value1 = 1 / globalbest_faval - 1;
Value1 = num2str(Value1);
disp(strcat('the maximum value','=',Value1));
Value2 = globalbest_x;
Value2 = num2str(Value2);
disp(strcat('the corresponding coordinate','=',Value2));
x = -5:0.01:5;
y = 2.1 * (1 - x + 2 * x .^ 2) .* exp(-x .^ 2 / 2);
plot(x,y,'m-','linewidth',3);
hold on;
plot(globalbest_x,1/globalbest_faval-1,'kp','linewidth',4);
legend('目标函数','搜索到的最大值');xlabel('x');ylabel('y');
grid on;
toc;

蚁群算法

自然界蚂蚁寻食的最短路径

TSP

以TSP为例,流程如下:

  1. 初始化
  2. 随机放置蚂蚁
  3. 对每只蚂蚁选择下个城市
  4. 若还有城市可选,则3
  5. 更新信息素表
  6. 未达到最大迭代次数,则2
  7. 输出

步骤如下:

  1. 数据准备
  2. 计算城市距离矩阵,对角线元素因为要保证启发函数不为零,设置为一个足够小的正数,\(10^-3\)以下即可
  3. 初始化参数
  4. 迭代寻找最佳路径
  5. 结果显示

后记

Matlab算法应该算是结束了
小波分析和计算机虚拟涉及到傅立叶函数
我我我 数学太差了
看一堆公式头疼 还需要工具箱呢
就算了吧!
若是空手敲,估计一个都不行
但也算是大概了解原理了
以后也不知道会不会用了
其实感觉在数模中,我也不需要特别会
他们研究完就直接上手了(感觉小菜一碟)
我打杂的~~
不过还是要有备无患么
万一来不及呢
多学习一点呗
不过寒假有一个计划是完蛋了
不知道怎么交差哎
约好的杭图 也被我的迷糊给黄了
下次得规划好才行呢
准备回家踏青啦!!!

转载请注明出处,谢谢。

愿 我是你的小太阳



买糖果去喽