基于粒子群算法的多目标优化

简介: 在实际工程优化问题中,多数问题是多目标优化问题。相对于单目标优化问题,多目标优化问题的显著特点是优化各个目标使其同时达到综合的最优值。然而,由于多目标优化问题的各个目标之间往往是相互冲突的,在满足其中一个目标最优的同时,其他的目标往往可能会受其影响而变得很差。因此,一般适用于单目标问题的方法难以用于多目标问题的求解。

1 理论基础

       在实际工程优化问题中,多数问题是多目标优化问题。相对于单目标优化问题,多目标优化问题的显著特点是优化各个目标使其同时达到综合的最优值。然而,由于多目标优化问题的各个目标之间往往是相互冲突的,在满足其中一个目标最优的同时,其他的目标往往可能会受其影响而变得很差。因此,一般适用于单目标问题的方法难以用于多目标问题的求解。

       多目标优化问题很早就引起了人们的重视,现已经发展出多种求解多目标优化问题的方法。多目标优化问题求解中最重要的概念是非劣解和非劣解集,两者的定义如下。

       非劣解(noninferior solution):在多目标优化问题的可行域中存在一个问题解,若不存在另一个可行解,使得一个解中的目标全部劣于该解,则该解称为多目标优化问题的非劣解。所有非劣解的集合叫做非劣解集(noninferior set)。在求解实际问题中,过多的非劣解是无法直接应用的,决策者只能选择其中最满意的一个非劣解作为最终解。最终解主要有三种方法,第一种是求非劣解的生成法,包括加权法、约束法、加权法和约束法结合的混合法以及多目标遗传算法,即先求出大量的非劣解,构成非劣解的一个子集,然后按照决策者的意图找出最终解。第二种为交互法,主要为求解线性约束多目标优化的Geoffrion法,不先求出很多的非劣解,而是通过分析者与决策者对话的方式,逐步求出最终解。第三种是事先要求决策者提供目标之间的相对重要程度,算法以此为依据,将多目标问题转化为单目标问题进行求解。

       利用进化算法求解多目标优化问题是近年来的研究热点,1967年,Rosenberg就建议采用基于进化的搜索来处理多目标优化问题,但没有具体实现。1975年,Holland提出了遗传算法,10年后,Schaffer提出了矢量评价遗传算法,第一次实现了遗传算法与多目标优化问题的结合。1989年,Goldberg在其著作《Genetic Algorithms for Search, Optimization, and Machine Learning》中,提出了把经济学中的Pareto理论与进化算法结合来求解多目标优化问题的新思路,对于后续进化多目标优化算法的研究具有重要的指导意义。目前,采用多目标进化算法求解多目标问题已成为进化计算领域中的一个热门方向,粒子群优化、蚁群算法、人工免疫系统、分布估计算法、协同进化算法、进化算法等一些新的进化算法陆续被用于求解多目标优化问题。本案例采用多目标粒子群算法求解多目标背包问题。

2 案例背景

2.1 问题描述

       假设存在五类物品,每类物品中又包含四种具体物品,现要求从这五种类别物品中分别选择一种物品放入背包中,使得背包内物品的总价值最大,总体积最小,并且背包的总质量不超过92 kg。背包问题的数学模型为

image.gif

2.2 算法流程

       基于粒子群算法的二维多目标搜索算法流程如图10-1所示。其中,种群初始化模块随机初始化粒子的位置x和速度v,适应度值计算是指根据适应度值计算公式计算个体适应度值,粒子最优更新模块根据新的粒子位置更新个体最优粒子。非劣解集更新模块根据新粒子支配关系筛选非劣解。粒子速度和位置更新模块根据个体最优粒子位置和全局粒子位置更新粒子速度和位置。

image.gif

2.3 适应度计算

       粒子适应度值参考式(10-1),每个个体的适应度值有两个,即价值和体积,同时个体须满足质量约束。

2.4 筛选非劣解集

       筛选非劣解集主要分为初始筛选非劣解集和更新非劣解集。初始筛选非劣解集是指在粒子初始化后,当一个粒子不受其他粒子支配(即不存在其他粒子的Px,Rx,均优于该粒子)时,把粒子放入非劣解集中,并且在粒子更新前从非劣解集中随机选择一个粒子作为群体最优粒子。更新非劣解集是指当新粒子不受其他粒子以及当前非劣解集中粒子的支配时,把新粒子放入非劣解集中,并且每次粒子更新前都从非劣解集中随机选择一个粒子作为群体最优粒子。

2.5 粒子速度和位置更新

       粒子更新公式如下:

image.gif

2.6 粒子最优

       粒子最优包括个体最优粒子和群体最优粒子,其中个体最优粒子的更新方式是从当前新粒子和个体最优粒子中选择支配粒子,当两个粒子都不是支配粒子时,从中随机选择一个粒子作为个体最优粒子。群体最优粒子为从非劣解集中随机选择的一个粒子。

3 MATLAB程序实现

       根据多目标搜索算法原理,在MATLAB中实现基于粒子群算法的多目标搜索算法。

%% 该函数演示多目标perota优化问题
%清空环境
clc
clear
load data
%% 初始参数
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;
%% 初始筛选非劣解
flj=[];
fljx=[];
fljNum=0;
%两个实数相等精度
tol=1e-7;
for i=1:xSize
    flag=0;  %支配标志
    for j=1:xSize  
        if j~=i
            if ((px(i)<px(j)) &&  (rx(i)>rx(j))) ||((abs(px(i)-px(j))<tol)...
                    &&  (rx(i)>rx(j)))||((px(i)<px(j)) &&  (abs(rx(i)-rx(j))<tol)) || (cx(i)>weight) 
                flag=1;
                break;
            end
        end
    end
    %判断有无被支配
    if flag==0
        fljNum=fljNum+1;
        % 记录非劣解
        flj(fljNum,1)=px(i);flj(fljNum,2)=rx(i);flj(fljNum,3)=cx(i);
        % 非劣解位置
        fljx(fljNum,:)=x(i,:); 
    end
end
%% 循环迭代
for iter=1:MaxIt
    % 权值更新
    w=wmax-(wmax-wmin)*iter/MaxIt;
    %从非劣解中选择粒子作为全局最优解
    s=size(fljx,1);       
    index=randi(s,1,1);  
    gbest=fljx(index,:);
    %% 群体更新
    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
    %% 计算个体适应度
    pxPrior(:)=0;
    rxPrior(:)=0;
    cxPrior(:)=0;
    for i=1:xSize
        for j=1:Dim %控制类别
            pxPrior(i) = pxPrior(i)+P(x(i,j),j);  %计算粒子i 价值
            rxPrior(i) = rxPrior(i)+R(x(i,j),j);  %计算粒子i 体积
            cxPrior(i) = cxPrior(i)+C(x(i,j),j);  %计算粒子i 重量
        end
    end
    %% 更新粒子历史最佳
    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
    %% 更新非劣解集合
    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
    %去掉重复粒子
    repflag=0;   %重复标志
    k=1;         %不同非劣解粒子数
    flj2=[];     %存储不同非劣解
    fljx2=[];    %存储不同非劣解粒子位置
    flj2(k,:)=flj(1,:);
    fljx2(k,:)=fljx(1,:);
    for j=2:size(flj,1)
        repflag=0;  %重复标志
        for i=1:size(flj2,1)
            result=(fljx(j,:)==fljx2(i,:));
            if length(find(result==1))==Dim
                repflag=1;%有重复
            end
        end
        %粒子不同,存储
        if repflag==0 
            k=k+1;
            flj2(k,:)=flj(j,:);
            fljx2(k,:)=fljx(j,:);
        end
    end
    %非劣解更新
    flj=flj2;
    fljx=fljx2;
end
%绘制非劣解分布
plot(flj(:,1),flj(:,2),'o') 
xlabel('P')
ylabel('R')
title('最终非劣解在目标空间分布')
disp('非劣解flj中三列依次为P,R,C')

image.gif

3.1 仿真结果

       本案例问题中,每类物品的价值、体积和质量如表10-1所列。

image.gif

       从每类物品中选择一个物品放入背包,使背包的总价值最大,体积最小,并且背包总质量小于92kg。粒子群算法参数为:粒子个数为50,迭代次数为200,最终得到的非劣解在目标空间中的分布如图10-2所示。

image.gif

由图10-2可知,算法搜索到的非劣解构成了Pareto面,算法搜索取得了很好的效果。

4 延伸阅读

       多目标搜索算法相对于单目标算法来说,更加贴近于实际问题,求解结果更具有参考价值。通过多目标搜索算法最终得到的不是一个最优解,而是一个非劣解集,需要从非劣解集中根据实际问题的需要选择一个解作为该问题的最终解。常用的基于进化算法的多目标搜索算法除了本案例介绍的方法之外,还有基于遗传算法的多目标搜索算法、基于免疫算法的多目标搜索算法等。

相关文章
|
10天前
|
算法 调度
基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图
车间作业调度问题(JSSP)通过遗传算法(GA)和模拟退火算法(SA)优化多个作业在并行工作中心上的加工顺序和时间,以最小化总完成时间和机器闲置时间。MATLAB2022a版本运行测试,展示了有效性和可行性。核心程序采用作业列表表示法,结合遗传操作和模拟退火过程,提高算法性能。
|
10天前
|
人工智能 算法 大数据
Linux内核中的调度算法演变:从O(1)到CFS的优化之旅###
本文深入探讨了Linux操作系统内核中进程调度算法的发展历程,聚焦于O(1)调度器向完全公平调度器(CFS)的转变。不同于传统摘要对研究背景、方法、结果和结论的概述,本文创新性地采用“技术演进时间线”的形式,简明扼要地勾勒出这一转变背后的关键技术里程碑,旨在为读者提供一个清晰的历史脉络,引领其深入了解Linux调度机制的革新之路。 ###
|
21天前
|
人工智能 算法 数据安全/隐私保护
基于遗传优化的SVD水印嵌入提取算法matlab仿真
该算法基于遗传优化的SVD水印嵌入与提取技术,通过遗传算法优化水印嵌入参数,提高水印的鲁棒性和隐蔽性。在MATLAB2022a环境下测试,展示了优化前后的性能对比及不同干扰下的水印提取效果。核心程序实现了SVD分解、遗传算法流程及其参数优化,有效提升了水印技术的应用价值。
|
20天前
|
存储 缓存 算法
优化轮询算法以提高资源分配的效率
【10月更文挑战第13天】通过以上这些优化措施,可以在一定程度上提高轮询算法的资源分配效率,使其更好地适应不同的应用场景和需求。但需要注意的是,优化策略的选择和实施需要根据具体情况进行详细的分析和评估,以确保优化效果的最大化。
|
21天前
|
并行计算 算法 IDE
【灵码助力Cuda算法分析】分析共享内存的矩阵乘法优化
本文介绍了如何利用通义灵码在Visual Studio 2022中对基于CUDA的共享内存矩阵乘法优化代码进行深入分析。文章从整体程序结构入手,逐步深入到线程调度、矩阵分块、循环展开等关键细节,最后通过带入具体值的方式进一步解析复杂循环逻辑,展示了通义灵码在辅助理解和优化CUDA编程中的强大功能。
|
21天前
|
存储 缓存 算法
前端算法:优化与实战技巧的深度探索
【10月更文挑战第21天】前端算法:优化与实战技巧的深度探索
18 1
|
22天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于贝叶斯优化CNN-LSTM网络的数据分类识别算法matlab仿真
本项目展示了基于贝叶斯优化(BO)的CNN-LSTM网络在数据分类中的应用。通过MATLAB 2022a实现,优化前后效果对比明显。核心代码附带中文注释和操作视频,涵盖BO、CNN、LSTM理论,特别是BO优化CNN-LSTM网络的batchsize和学习率,显著提升模型性能。
|
24天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
9天前
|
算法 数据挖掘 数据安全/隐私保护
基于FCM模糊聚类算法的图像分割matlab仿真
本项目展示了基于模糊C均值(FCM)算法的图像分割技术。算法运行效果良好,无水印。使用MATLAB 2022a开发,提供完整代码及中文注释,附带操作步骤视频。FCM算法通过隶属度矩阵和聚类中心矩阵实现图像分割,适用于灰度和彩色图像,广泛应用于医学影像、遥感图像等领域。
|
11天前
|
存储 算法 决策智能
基于免疫算法的TSP问题求解matlab仿真
旅行商问题(TSP)是一个经典的组合优化问题,目标是寻找经过每个城市恰好一次并返回起点的最短回路。本文介绍了一种基于免疫算法(IA)的解决方案,该算法模拟生物免疫系统的运作机制,通过克隆选择、变异和免疫记忆等步骤,有效解决了TSP问题。程序使用MATLAB 2022a版本运行,展示了良好的优化效果。