基于范围选择的进化多目标优化PESA-II-可用于(汽车发动机多目标优化设计/飞机机翼多目标外形优化/电动汽车充电设施布局优化)

news/2025/2/24 14:00:55

 基于范围选择的进化多目标优化 PESA-II(Pareto Envelope-Based Selection Algorithm II)是一种经典的多目标遗传算法,以下是对它的详细介绍:基于范围选择的进化多目标优化PESA-II-可用于(汽车发动机多目标优化设计/飞机机翼多目标外形优化/电动汽车充电设施布

算法背景

PESA-II 由 Corne 等人在 2001 年提出,是 PESA 的改进版本。多目标优化问题中通常存在多个相互冲突的目标函数,不存在单一的最优解,而是有一个 Pareto 最优解集,PESA-II 就是为有效找到该解集而设计的算法

算法核心组件

  • 外部存档:用于存储当前找到的非支配解。进化过程中,内部种群中的非支配个体将被添加到外部存档,而外部存档中的支配个体将被淘汰。当外部存档达到预设上限时,删除拥挤系数最小的个体以保持多样性。
  • 范围选择:将目标空间划分为多个超立方体,每个超立方体代表一个范围。选择父代个体时,优先考虑占据较少超立方体的个体,即拥挤系数较小的个体,以鼓励解的多样性;若多个个体拥挤系数相同,则随机选择。
  • 遗传操作:对选定的父代个体进行交叉和变异操作,生成新的个体并添加到内部种群,用于下一轮进化。
  • 适应度分配:个体的适应度基于其占据的超立方体数量分配,占据超立方体越多,适应度越低,即压缩因子越大,促使选择过程优先考虑占据较少超立方体的个体。

算法流程

  1. 初始化:随机生成初始内部种群和外部存档。
  2. 评估:计算内部种群中每个个体的目标函数值,根据 Pareto 支配关系分为非支配解和支配解。
  3. 更新外部存档:将内部种群中的非支配解添加到外部存档,淘汰外部存档中的支配解;若外部存档达到上限,删除拥挤系数最小的个体。
  4. 选择父代:根据范围选择机制从外部存档中选择父代个体。
  5. 遗传操作:对选定的父代个体进行交叉和变异操作,生成新的个体。
  6. 更新内部种群:将新生成的个体添加到内部种群,并清空内部种群中的旧个体。
  7. 重复:重复步骤 2 至 6,直到满足停止条件,如达到最大迭代次数或找到满意的解集。
  8. 输出:最终,外部存档中的个体即为算法找到的 Pareto 最优解集。

算法特点与优势

  • 多样性保持:通过维护外部存档和基于范围的选择机制,能保持解的多样性,避免早熟收敛。
  • 解的质量:优先考虑占据较少超立方体的个体,可找到更接近 Pareto 前沿的解。
  • 易于实现算法流程相对简单,易于理解和实现,且基于 Matlab 等编程语言的模块化实现使其易于修改和扩展。

应用领域

  • 工程设计:在机械设计、电子电路设计等领域,用于优化多个相互冲突的性能指标。
  • 生产调度:在生产计划、车间调度等问题中,可寻找最优的生产计划和资源分配方案。
  • 金融优化:在金融投资、风险管理等领域,用于优化投资组合的风险和收益。
  • 能源管理:在智能电网、能源分配等问题中,可优化能源的使用效率和成本。

汽车发动机多目标优化设计

  • 多目标特征:汽车发动机的设计存在多个相互冲突的目标。例如,为了提升车辆的动力性能,需要提高发动机的功率输出;但从降低使用成本和减少对环境影响的角度,又要降低燃油消耗和尾气污染物排放。这些目标之间难以同时达到最优,需要进行权衡。
  • PESA - II 适用性:PESA - II 是一种多目标优化算法,能够处理多个相互冲突的目标。它可以在搜索过程中同时考虑功率、油耗、排放等多个目标,通过不断迭代找到一组帕累托最优解,为设计者提供多种不同的设计方案,使其能根据实际需求在不同目标之间进行权衡和选择。

飞机机翼多目标外形优化

  • 多目标特征:飞机机翼的设计需要综合考虑多个性能指标。升力系数大可以保证飞机有良好的起飞、巡航和降落性能;而阻力系数小则能降低飞行过程中的能量消耗,提高燃油效率。同时,为了减轻飞机整体重量、降低制造成本,还希望机翼结构重量尽可能轻。这些目标之间相互制约,例如增加机翼面积可能提高升力,但也会增加阻力和结构重量。
  • PESA - II 适用性:PESA - II 能够同时对升力系数、阻力系数和结构重量等多个目标进行优化。它通过对机翼的几何外形参数(如翼型、展弦比等)进行搜索和调整,找到一组在不同目标之间达到较好平衡的最优外形设计方案,满足飞机设计的多方面要求。

电动汽车充电设施布局优化

  • 多目标特征:在规划电动汽车充电设施布局时,存在多个需要优化的目标。建设成本最低是一个重要目标,包括土地购置、设备安装等费用;同时要保证电动汽车用户的充电便利性最高,即充电设施的分布要合理,使车主能够方便快捷地找到充电桩;此外,还需要考虑电网的负荷均衡,避免局部区域充电设施过于集中导致电网压力过大。这些目标之间存在一定的矛盾,例如增加充电设施数量可以提高便利性,但会增加建设成本。
  • PESA - II 适用性:PESA - II 可以同时考虑建设成本、充电便利性和电网负荷均衡等多个目标。通过对充电设施的位置、数量等决策变量进行优化,找到一组帕累托最优解,为充电设施的布局规划提供多种可行方案,帮助决策者在不同目标之间做出合理的选择。

具体代码及实验结果

% 清除命令窗口、工作区变量并关闭所有图形窗口
clc;
clear;
close all;

%% Problem Definition
% 定义目标函数,这里使用 MOP2 函数作为多目标优化问题的目标函数
CostFunction=@(x) MOP2(x);

% 决策变量的数量,这里设定为 3 个
nVar=3;             
% 决策变量矩阵的大小
VarSize=[nVar 1];   
% 决策变量的下限
VarMin=0;           
% 决策变量的上限
VarMax=1;           

% 计算目标函数的数量,通过生成一个随机的决策变量向量并调用目标函数得到
nObj=numel(CostFunction(unifrnd(VarMin,VarMax,VarSize)));   

%% PESA-II Settings
% 最大迭代次数,算法最多运行 100 次迭代
MaxIt=100;      
% 种群大小,即每一代中个体的数量
nPop=50;        
% 存档大小,用于存储非支配解的存档的最大容量
nArchive=50;    
% 每个维度上的网格数量,用于范围选择机制
nGrid=7;        
% 网格膨胀因子,用于扩大网格范围以处理边界情况
InflationFactor=0.1;    
% 删除个体时的参数,控制删除个体的策略
beta_deletion=1;
% 选择个体时的参数,控制选择个体的策略
beta_selection=2;

% 交叉操作的概率
pCrossover=0.5;
% 交叉操作生成的子代数量,确保是偶数
nCrossover=round(pCrossover*nPop/2)*2;

% 变异操作的概率
pMutation=1-pCrossover;
% 变异操作生成的子代数量
nMutation=nPop-nCrossover;

% 交叉操作的参数,gamma 控制交叉的程度,VarMin 和 VarMax 为决策变量的上下限
crossover_params.gamma=0.15;
crossover_params.VarMin=VarMin;
crossover_params.VarMax=VarMax;

% 变异操作的参数,h 控制变异的步长,VarMin 和 VarMax 为决策变量的上下限
mutation_params.h=0.3;
mutation_params.VarMin=VarMin;
mutation_params.VarMax=VarMax;

%% Initialization
% 定义一个空的个体结构体,包含位置、成本、是否被支配和网格索引等属性
empty_individual.Position=[];
empty_individual.Cost=[];
empty_individual.IsDominated=[];
empty_individual.GridIndex=[];

% 初始化种群,每个个体都初始化为空个体
pop=repmat(empty_individual,nPop,1);

% 随机生成初始种群的位置,并计算每个个体的成本
for i=1:nPop
    pop(i).Position=unifrnd(VarMin,VarMax,VarSize);
    pop(i).Cost=CostFunction(pop(i).Position);
end

% 初始化存档为空
archive=[];

%% Main Loop
% 开始主循环,进行迭代优化
for it=1:MaxIt
   
    % 确定种群中每个个体的支配关系
    pop=DetermineDomination(pop);
    
    % 提取种群中的非支配个体
    ndpop=pop(~[pop.IsDominated]);
    
    % 将非支配个体添加到存档中
    archive=[archive
             ndpop]; %#ok
    
    % 确定存档中每个个体的支配关系
    archive=DetermineDomination(archive);
    
    % 从存档中删除被支配的个体
    archive=archive(~[archive.IsDominated]);

    % 创建网格,用于范围选择
    [archive, grid]=CreateGrid(archive,nGrid,InflationFactor);
    
    % 如果存档中的个体数量超过存档大小,进行截断操作
    if numel(archive)>nArchive
        E=numel(archive)-nArchive;
        archive=TruncatePopulation(archive,grid,E,beta_deletion);
        [archive, grid]=CreateGrid(archive,nGrid,InflationFactor);
    end
    
    % 当前存档中的个体即为 Pareto 前沿
    PF=archive;
    
    % 绘制当前的 Pareto 前沿
    figure(1);
    PlotCosts(PF);
    pause(0.01);
    
    % 显示当前迭代次数和 Pareto 前沿的个体数量
    disp(['Iteration ' num2str(it) ': Number of PF Members = ' num2str(numel(PF))]);
    
    % 如果达到最大迭代次数,跳出循环
    if it>=MaxIt
        break;
    end
    
    % Crossover
    % 初始化交叉操作生成的子代种群
    popc=repmat(empty_individual,nCrossover/2,2);
    for c=1:nCrossover/2
        
        % 从存档中选择两个父代个体
        p1=SelectFromPopulation(archive,grid,beta_selection);
        p2=SelectFromPopulation(archive,grid,beta_selection);
        
        % 对父代个体进行交叉操作,生成两个子代个体
        [popc(c,1).Position, popc(c,2).Position]=Crossover(p1.Position,...
                                                           p2.Position,...
                                                           crossover_params);
        
        % 计算子代个体的成本
        popc(c,1).Cost=CostFunction(popc(c,1).Position);
        
        popc(c,2).Cost=CostFunction(popc(c,2).Position);
        
    end
    % 将交叉操作生成的子代个体展开为一维数组
    popc=popc(:);
    
    % Mutation
    % 初始化变异操作生成的子代种群
    popm=repmat(empty_individual,nMutation,1);
    for m=1:nMutation
        
        % 从存档中选择一个父代个体
        p=SelectFromPopulation(archive,grid,beta_selection);
        
        % 对父代个体进行变异操作,生成一个子代个体
        popm(m).Position=Mutate(p.Position,mutation_params);
        
        % 计算子代个体的成本
        popm(m).Cost=CostFunction(popm(m).Position);
        
    end
    
    % 更新种群,将交叉和变异操作生成的子代个体合并
    pop=[popc
         popm];
         
end

%% Results
disp(' ');

% 提取 Pareto 前沿个体的成本矩阵
PFC=[PF.Cost];
for j=1:size(PFC,1)
    
    % 显示每个目标函数的统计信息
    disp(['Objective #' num2str(j) ':']);
    disp(['      Min = ' num2str(min(PFC(j,:)))]);
    disp(['      Max = ' num2str(max(PFC(j,:)))]);
    disp(['    Range = ' num2str(max(PFC(j,:))-min(PFC(j,:)))]);
    disp(['    St.D. = ' num2str(std(PFC(j,:)))]);
    disp(['     Mean = ' num2str(mean(PFC(j,:)))]);
    disp(' ');
    
end

实验结果简述

  • Pareto 前沿可视化:在每次迭代中,代码会绘制当前找到的 Pareto 前沿。随着迭代次数的增加,Pareto 前沿通常会逐渐收敛到真实的 Pareto 前沿,并且解的分布会更加均匀。
  • Pareto 前沿个体数量:在迭代过程中,会显示当前 Pareto 前沿的个体数量。这个数量可能会随着迭代而变化,但最终会趋于稳定。
  • 目标函数统计信息:最后,代码会输出每个目标函数的最小值、最大值、范围、标准差和均值。这些统计信息可以帮助我们了解 Pareto 前沿上解的分布情况,以及不同目标函数之间的权衡关系。例如,较小的标准差表示解在该目标函数上的分布较为集中,而较大的范围则表示解在该目标函数上的变化较大。

需要注意的是,上述代码中的 MOP2DetermineDominationCreateGridTruncatePopulationSelectFromPopulationCrossoverMutate 和 PlotCosts 等函数需要根据具体实现进行定义,代码本身假设这些函数已经存在。

具体完整算法请跳转:基于范围选择的进化多目标优化PESA-II-可用于(汽车发动机多目标优化设计/飞机机翼多目标外形优化/电动汽车充电设施布


http://www.niftyadmin.cn/n/5864431.html

相关文章

在Ubuntu下通过Docker部署Nginx服务器

引言 想要在你的开发环境中快速搭建一个高性能的Web服务器?Nginx是个绝佳的选择。作为一个轻量级的反向代理服务器和负载均衡器,Nginx在处理高并发请求时表现得相当出色。而Docker,作为现代应用的容器化工具,可以让我们以极简的方…

【Qt】桌面应用开发 ------ 绘图事件和绘图设备 文件操作

文章目录 9、绘图事件和绘图设备9.1 QPainter9.2 手动触发绘图事件9.3 绘图设备9.3.1 QPixmap9.3.2 QImage9.3.3 QImage与QPixmap的区别9.3.4 QPicture 10、文件操作10.1 文件读写10.2 二进制文件读写10.3 文本文件读写10.4 综合案例 9、绘图事件和绘图设备 什么时候画&#x…

Deepin(Linux)设置开机自动启动 MySQL

要在系统启动时自动启动 MySQL,可以通过配置 systemd 来实现。由于已经完成了 MySQL 的安装并且能够启动 MySQL 服务,接下来我们将创建一个 systemd 服务单元文件,让 MySQL 在系统启动时自动启动。 1. 创建 systemd 服务文件 首先&#xff…

vscode设置终端复制快捷键(有坑!!!)

vscode的编辑页面和终端的复制粘贴快捷键是不一样的。 vscode的终端复制快捷键为ctrlshiftC,当然,自己可以自定义设置 vscode设置终端复制快捷键(有坑!!!)_vs code 不能复制-CSDN博客文章浏览…

DeepSeek-R1本地部署保姆级教程

一、DeepSeek-R1本地部署配置要求 (一)轻量级模型 ▌DeepSeek-R1-1.5B 内存容量:≥8GB 显卡需求:支持CPU推理(无需独立GPU) 适用场景:本地环境验证测试/Ollama集成调试 (二&a…

【数据分析】4 商业数据分析技能模型总结

以下是针对商业数据分析技能模型的系统性扩展,涵盖工具深化、方法论升级、实战场景适配和职业发展路径规划四大维度: 一、数据分析能力扩展:工具链生态与进阶场景 1. 数据获取技术升级 企业级数据源管理: 数据湖架构&#xff08…

Ubuntu - Redis 安装、远程访问

参考教程: https://blog.csdn.net/houor/article/details/126672577 https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/install-redis-on-linux/ 查看是否安装 redis-cli --versionUbuntu 上安装 更新: sudo apt update …

Idea2024中搭建JavaFX开发环境并创建运行项目

Idea2024中搭建JavaFX开发环境并创建运行项目 本文以Java语言为例演示如何创建JavaFX开发项目和部署开发环境,读者可以根据个人实际灵活选择相关参数。 一、项目创建与环境搭建步骤 新建JavaFX项目,选择适合项目实际的语言、系统和JDK。 项目设置-设置…