一、WSN模型
1.1 动机
近年来,随着对等网络、云计算和网格计算等分布式环境的发展,无线传感器网络(WSN)得到了广泛的应用。无线传感器网络(WSN)是一种新兴的计算和网络模式,它可以被定义为一个由称为传感器节点的微小、小型、昂贵和高度智能化的设备组成的网络。传感器节点位于被观测空间内的不同位置,通过无线通信信道交换从监测领域收集的数据。收集的数据被发送到sink节点,sink节点要么本地处理数据,要么将数据发送到处理能力更强的其他网络。
无线传感器网络最基本的挑战之一是节点定位。节点定位问题的实例很多,属于NP难优化问题。传统的确定性技术和算法不能在合理的计算时间内解决NP-hard问题。在这种情况下,最好采用非确定性(随机)算法,如元启发式算法。
群体智能元启发式算法模拟自然界中的生物群体,如鸟和鱼的群体、蜜蜂和蚂蚁的群体、蝙蝠和杜鹃鸟的群体等。这些算法是基于种群的、随机的和迭代的搜索方法,基于四个自组织原则:正反馈、负反馈,多重相互作用和波动。
1.2 无线传感器网络中的定位问题
定位问题是无线传感器网络中研究最多的问题之一,因为如果传感器节点的位置未知,则覆盖、功率和路由都将无法确定最佳。定位是无线传感器网络的关键。一些传感器节点的位置可以由全球定位系统(GPS)来定义,这些节点被称为锚节点或信标节点,而其他传感器节点则随机分布在搜索空间中。这些节点称为未知节点或传感器节点。由于每个节点的电池寿命、成本、气候条件等因素,只有少数节点的位置是由GPS坐标确定的,而其他节点的位置则需要采用定位算法进行估计。
针对无线传感器网络中传感器节点的定位问题,提出了锚节点和未知节点两种定位算法。第一阶段称为测距阶段,算法确定未知节点和相邻锚节点之间的距离。针对无线传感器网络中传感器节点的定位问题,提出了锚节点和未知节点两种定位算法。第一阶段称为测距阶段,算法确定未知节点和相邻锚节点之间的距离。第二阶段通过在第一阶段使用各种方法收集测距信息来估计节点的位置,如到达角(AOA)、到达时间(TOA)、到达时差(TDOA)、往返时间(RTT)、无线信号强度(RSS)等。
1.3 问题陈述
在由M个传感器节点组成的无线传感器网络中,定位问题的目标是利用M-N个锚节点的位置信息,在传输范围为R的情况下,估计N个未知节点的位置,如果一个传感器节点在三个或更多锚节点的传输范围内,则认为它是定位的。这是一个总坐标数为2n的二维定位问题。
本文采用RSS方法估计节点间距离。无论采用何种测距方法,都可能出现不精确的测量。N个未知节点坐标的位置估计可以表示为一个优化问题,涉及表示节点定位误差的目标函数的最小化[19]。该问题的目标函数由N个未知节点和M N个相邻锚节点之间的误差平方和表示[19]。
随着RSS的出现,三边测量将被用来解决WSN中的定位问题。该方法的原理是基于三个锚节点的已知位置。未知节点的位置可以在三个锚节点的传输范围内估计。
每个节点估计到第i个锚点的距离为d̂=di+ni,其中ni是高斯噪声,di是使用以下等式计算的实际距离:
应最小化的目标函数表示为计算节点坐标的实际和估计距离与实际节点坐标之间的均方误差(MSE):
其中di是实际距离,d̂i是估计距离(从噪声范围测量获得的值di),M≥3(传感器节点的位置在传输范围R内至少需要三个锚)。
由于节点定位中的距离测量是有噪声的,为了估计节点之间的足够距离,采用了群体智能元启发式等优化方法。
二、粒子群算法
粒子群算法是在1995年由Eberhart博士和Kennedy博士一起提出的,它源于对鸟群捕食行为的研究。它的基本核心是利用群体中的个体对信息的共享从而使整个群体的运动在问题求解空间中产生从无序到有序的演化过程,从而获得问题的最优解。设想这么一个场景:一群鸟进行觅食,而远处有一片玉米地,所有的鸟都不知道玉米地到底在哪里,但是它们知道自己当前的位置距离玉米地有多远。那么找到玉米地的最佳策略,也是最简单有效的策略就是搜寻目前距离玉米地最近的鸟群的周围区域。
在PSO中,每个优化问题的解都是搜索空间中的一只鸟,称之为"粒子",而问题的最优解就对应于鸟群中寻找的"玉米地"。所有的粒子都具有一个位置向量(粒子在解空间的位置)和速度向量(决定下次飞行的方向和速度),并可以根据目标函数来计算当前的所在位置的适应值(fitness value),可以将其理解为距离"玉米地"的距离。在每次的迭代中,种群中的例子除了根据自身的经验(历史位置)进行学习以外,还可以根据种群中最优粒子的"经验"来学习,从而确定下一次迭代时需要如何调整和改变飞行的方向和速度。就这样逐步迭代,最终整个种群的例子就会逐步趋于最优解。
上面的解释可能还比较抽象,下面通过一个简单的例子来进行说明
在一个湖中有两个人他们之间可以通信,并且可以探测到自己所在位置的最低点。初始位置如上图所示,由于右边比较深,因此左边的人会往右边移动一下小船。
现在左边比较深,因此右边的人会往左边移动一下小船
一直重复该过程,最后两个小船会相遇
得到一个局部的最优解
将每个个体表示为粒子。每个个体在某一时刻的位置表示为,x(t),方向表示为v(t)
p(t)为在t时刻x个体的自己的最优解,g(t)为在t时刻所有个体的最优解,v(t)为个体在t时刻的方向,x(t)为个体在t时刻的位置
下一个位置为上图所示由x,p,g共同决定了
种群中的粒子通过不断地向自身和种群的历史信息进行学习,从而可以找到问题的最优解。
但是,在后续的研究中表表明,上述原始的公式中存在一个问题:公式中V的更新太具有随机性,从而使整个PSO算法的全局优化能力很强,但是局部搜索能力较差。而实际上,我们需要在算法迭代初期PSO有着较强的全局优化能力,而在算法的后期,整个种群应该具有更强的局部搜索能力。所以根据上述的弊端,shi和Eberhart通过引入惯性权重修改了公式,从而提出了PSO的惯性权重模型:
每一个向量的分量表示如下
其中w称为是PSO的惯性权重,它的取值介于【0,1】区间,一般应用中均采用自适应的取值方法,即一开始令w=0.9,使得PSO全局优化能力较强,随着迭代的深入,参数w进行递减,从而使的PSO具有较强的局部优化能力,当迭代结束时,w=0.1。参数c1和c2称为学习因子,一般设置为1,4961;而r1和r2为介于[0,1]之间的随机概率值。
整个粒子群优化算法的算法框架如下:
step1种群初始化,可以进行随机初始化或者根据被优化的问题设计特定的初始化方法,然后计算个体的适应值,从而选择出个体的局部最优位置向量和种群的全局最优位置向量。
step2 迭代设置:设置迭代次数,并令当前迭代次数为1
step3 速度更新:更新每个个体的速度向量
step4 位置更新:更新每个个体的位置向量
step5 局部位置和全局位置向量更新:更新每个个体的局部最优解和种群的全局最优解
step6 终止条件判断:判断迭代次数时都达到最大迭代次数,如果满足,输出全局最优解,否则继续进行迭代,跳转至step 3。
对于粒子群优化算法的运用,主要是对速度和位置向量迭代算子的设计。迭代算子是否有效将决定整个PSO算法性能的优劣,所以如何设计PSO的迭代算子是PSO算法应用的研究重点和难点。
三、代码
clc;clear;close all;
%% 初始化种群
N = 500; % 初始种群个数
d = 24; % 空间维数
ger = 300; % 最大迭代次数
% 设置位置参数限制(矩阵的形式可以多维)
vlimit = [-0.5, 0.5;-0.5, 0.5;-0.5, 0.5;-0.5, 0.5;-0.5, 0.5;-0.5, 0.5;
-0.5, 0.5;-0.5, 0.5;-0.5, 0.5;-0.5, 0.5;-0.5, 0.5;-0.5, 0.5;
-0.5, 0.5;-0.5, 0.5;-0.5, 0.5;-0.5, 0.5;-0.5, 0.5;-0.5, 0.5;
-0.5, 0.5;-0.5, 0.5;-0.5, 0.5;-0.5, 0.5;-0.5, 0.5;-0.5, 0.5;]; % 设置速度限制
c_1 = 0.8; % 惯性权重
c_2 = 0.5; % 自我学习因子
c_3 = 0.5; % 群体学习因子
for i = 1:d
x(:,i) = limit(i, 1) + (limit(i, 2) - limit(i, 1)) * rand(N, 1);%初始种群的位置
end
v = 0.5*rand(N, d); % 初始种群的速度
xm = x; % 每个个体的历史最佳位置
ym = zeros(1, d); % 种群的历史最佳位置
fxm = 100000*ones(N, 1); % 每个个体的历史最佳适应度
fym = 10000; % 种群历史最佳适应度
%% 粒子群工作
iter = 1;
times = 1;
record = zeros(ger, 1); % 记录器
while iter <= ger
for i=1:N
fx(i) = calfit(x(i,:)) ; % 个体当前适应度
end
for i = 1:N
if fxm(i) > fx(i)
fxm(i) = fx(i); % 更新个体历史最佳适应度
xm(i,:) = x(i,:); % 更新个体历史最佳位置
end
end
if fym > min(fxm)
[fym, nmax] = min(fxm); % 更新群体历史最佳适应度
ym = xm(nmax, :); % 更新群体历史最佳位置
end
v = v * c_1 + c_2 * rand *(xm - x) + c_3 * rand *(repmat(ym, N, 1) - x);% 速度更新
% 边界速度处理
for i=1:d
for j=1:N
if v(j,i)>vlimit(i,2)
v(j,i)=vlimit(i,2);
end
if v(j,i) < vlimit(i,1)
v(j,i)=vlimit(i,1);
end
end
end
x = x + v;% 位置更新
% 边界位置处理
for i=1:d
for j=1:N
if x(j,i)>limit(i,2)
x(j,i)=limit(i,2);
end
if x(j,i) < limit(i,1)
x(j,i)=limit(i,1);
end
end
end
record(iter) = fym;%最大值记录
iter = iter+1;
times=times+1;
end
disp(['最小值:',num2str(fym)]);
disp(['变量取值:',num2str(ym)]);
figure
plot(record)
xlabel('迭代次数');
ylabel('适应度值')