1.实验目的

掌握粒子群算法解决背包问题的方法,掌握引入惯性权重的粒子群算法应用。

2.实验环境

Matlab

3.实验内容

使用粒子群算法解决背包问题。假设存在五类物品,每类物品中又包含四种具体物品,现要求从这五种类别物品中分别选择一种物品放入背包中,使得背包内物品的总价值最大,总体积最小,并且背包的总质量不超过92kg。用C表示物品质量,X为选择物品。P为每个物品的价值,R为每个物品的体积。P,R,C的取值如下:

多目标粒子群算法 python源码 多目标粒子群算法实例_背包问题

初始化参数要求为:

Dim=5;     %粒子维数

xSize=50;  %种群个数

MaxIt=200; %迭代次数

c1=0.8;    %算法参数

c2=0.8;    %算法参数

wmax=1.2;  %惯性因子  采用线性递减权值

wmin=0.1;  %惯性因子

  1. 实验过程

算法流程

    基于粒子群算法的多目标搜索算法流程如下图所示。其中,种群初始化模块随机初始化粒子的位置 α 和速度 v,适应度值计算模块根据适应度值计算公式计算个体适应度值,粒子最优更新模块根据新的粒子位置更新个体最优粒子。非劣解集更新模块根据新粒子支配关系筛选非劣解。粒子速度和位置更新模块根据个体最优粒子位置和全局粒子位置更新粒子速度和位置。 每个个体的适应度值有两个,即价值和体积,同时个体需满足质量约束。

  1. 种群初始化

初始化种群并且计算初始粒子的适应度值,程序代码如下:

%% 初始参数

objnum=size(P,1); %类中物品个数

weight=92;        %总重量限制

%初始化程序

Dim=5;     %粒子维数

xSize=50;  %种群个数

MaxIt=200; %迭代次数

c1=0.8;    %算法参数

c2=0.8;    %算法参数

wmax=1.2;  %惯性因子

wmin=0.1;  %惯性因子

x=unidrnd(4,xSize,Dim);  %粒子初始化

v=zeros(xSize,Dim);      %速度初始化

xbest=x;           %个体最佳值

gbest=x(1,:);      %粒子群最佳位置

% 粒子适应度值

px=zeros(1,xSize);   %粒子价值目标

rx=zeros(1,xSize);   %粒子体积目标

cx=zeros(1,xSize);   %重量约束

% 最优值初始化

pxbest=zeros(1,xSize); %粒子最优价值目标

rxbest=zeros(1,xSize); %粒子最优体积目标

cxbest=zeros(1,xSize);  %记录重量,以求约束

% 上一次的值

pxPrior=zeros(1,xSize);%粒子价值目标

rxPrior=zeros(1,xSize);%粒子体积目标

cxPrior=zeros(1,xSize);%记录重量,以求约束

%计算初始目标向量

for i=1:xSize

for j=1:Dim %控制类别

        px(i) = px(i)+P(x(i,j),j);  %粒子价值

        rx(i) = rx(i)+R(x(i,j),j);  %粒子体积

        cx(i) = cx(i)+C(x(i,j),j);  %粒子重量

end

end

% 粒子最优位置

pxbest=px;rxbest=rx;cxbest=cx;

2、种群更新

  种群更新根据全局最优粒子和个体最优粒子更新当前个体的速度和位置,其中全局最优粒子为非劣解集中随机选取的粒子。

    %% 群体更新

for i=1:xSize
%速度更新
        v(i,:)=w*v(i,:)+c1*rand(1,1)*(xbest(i,:)-x(i,:))+c2*rand(1,1)*(gbest-x(i,:));
        
%位置更新
        x(i,:)=x(i,:)+v(i,:);
        x(i,:) = rem(x(i,:),objnum)/double(objnum);
        index1=find(x(i,:)<=0);
if ~isempty(index1)
            x(i,index1)=rand(size(index1));
end
        x(i,:)=ceil(4*x(i,:));        
end

3、更新个体最优粒子

根据新粒子和当前最优粒子的支配关系,更新个体最优粒子,即当两个粒子存在支配粒子时,选择支配粒子,否则从中随机选取一个粒子作为新的个体最优粒子。

    %% 更新粒子历史最佳

for i=1:xSize

%现在的支配原有的,替代原有的

if ((px(i)<pxPrior(i)) &&  (rx(i)>rxPrior(i))) ||((abs(px(i)-pxPrior(i))<tol)...
                 &&  (rx(i)>rxPrior(i)))||((px(i)<pxPrior(i)) &&  (abs(rx(i)-rxPrior(i))<tol)) || (cx(i)>weight) 
                xbest(i,:)=x(i,:);%没有记录目标值
                pxbest(i)=pxPrior(i);rxbest(i)=rxPrior(i);cxbest(i)=cxPrior(i);
end

%彼此不受支配,随机决定

if ~( ((px(i)<pxPrior(i)) &&  (rx(i)>rxPrior(i))) ||((abs(px(i)-pxPrior(i))<tol)...
                &&  (rx(i)>rxPrior(i)))||((px(i)<pxPrior(i)) &&  (abs(rx(i)-rxPrior(i))<tol)) || (cx(i)>weight) )...
                &&  ~( ((pxPrior(i)<px(i)) &&  (rxPrior(i)>rx(i))) ||((abs(pxPrior(i)-px(i))<tol) &&  (rxPrior(i)>rx(i)))...
                ||((pxPrior(i)<px(i)) &&  (abs(rxPrior(i)-rx(i))<tol)) || (cxPrior(i)>weight) )
if rand(1,1)<0.5
                xbest(i,:)=x(i,:);
                  pxbest(i)=pxPrior(i);rxbest(i)=rxPrior(i);cxbest(i)=cxPrior(i);
end
end
end

4、非劣解筛选

非劣解集筛选分为两步,第一步是把新非劣解集和旧非劣解集合并,得到新的非劣解集。

%% 更新非劣解集合
    px=pxPrior;
    rx=rxPrior;
    cx=cxPrior;
%更新升级非劣解集合
    s=size(flj,1);%目前非劣解集合中元素个数
   
%先将非劣解集合和xbest合并
    pppx=zeros(1,s+xSize);
    rrrx=zeros(1,s+xSize);
    cccx=zeros(1,s+xSize);
    pppx(1:xSize)=pxbest;pppx(xSize+1:end)=flj(:,1)';
    rrrx(1:xSize)=rxbest;rrrx(xSize+1:end)=flj(:,2)';
    cccx(1:xSize)=cxbest;cccx(xSize+1:end)=flj(:,3)';
    xxbest=zeros(s+xSize,Dim);
    xxbest(1:xSize,:)=xbest;
    xxbest(xSize+1:end,:)=fljx;
   第二步是根据非劣解集中的支配关系,筛选出新的非劣解集。
%筛选非劣解
    flj=[];
    fljx=[];
    k=0;
    tol=1e-7;
for i=1:xSize+s
        flag=0;%没有被支配
%判断该点是否非劣
for j=1:xSize+s 
if j~=i
if ((pppx(i)<pppx(j)) &&  (rrrx(i)>rrrx(j))) ||((abs(pppx(i)-pppx(j))<tol) ...
                        &&  (rrrx(i)>rrrx(j)))||((pppx(i)<pppx(j)) &&  (abs(rrrx(i)-rrrx(j))<tol)) ...
                        || (cccx(i)>weight) %有一次被支配
                    flag=1;
break;
end
end
end
%判断有无被支配
if flag==0
            k=k+1;
            flj(k,1)=pppx(i);flj(k,2)=rrrx(i);flj(k,3)=cccx(i);%记录非劣解
            fljx(k,:)=xxbest(i,:);%非劣解位置
end
end

仿真结果

多目标粒子群算法 python源码 多目标粒子群算法实例_粒子群算法_02

 实验总结

PSO 算法即 是将鸟群中的每个个体抽象为无体积的粒子,粒子 根据自身的变化经验以及周边粒子的运动经验来调 整自己的运动,每个粒子在运动过程中所经过的最 好位置,就是本身找到的最优解,而整个群体所经 过的最好位置,就是群体当前所找到的最优解。