当前位置: 首页 > article >正文

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

 基于范围选择的进化多目标优化 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.kler.cn/a/559394.html

相关文章:

  • 【论文解读】《Training Large Language Models to Reason in a Continuous Latent Space》
  • Java即时通讯系统源码 - 仿QQ聊天-SpringBoot后台-JavaSwing桌面前端
  • 《操作系统 - 清华大学》 8 -5:进程管理:进程生命周期管理
  • [HOT 100] 2439. 最小化数组中的最大值
  • pikachu靶场搭建教程
  • Qt ModbusTCP和ModBusRTU读写数据
  • 运维linux日志面试题及参考答案
  • STM32-智能台灯项目
  • 【CS285】高斯策略对数概率公式的学习笔记
  • c语言左值和右值的区别
  • 【GPU驱动】- 状态机
  • CF 13A.Numbers(Java实现)
  • nodejs:vue 3 + vite 作为前端,将 html 填入<iframe>,在线查询英汉词典
  • 常用的性能优化方法和技巧
  • 在Spring Boot中如何使用Freemaker模板引擎
  • Cocos Creator Shader入门实战(一):材质和Effect的了解
  • docker容器网络配置及常用操作
  • 如果二者隔离级别不一致,以哪个为主。例如@Transactional 隔离级别是RC,mysql是RR
  • FunAudioLLM:用语音大模型解锁智能语音交互的无限可能
  • 第六届全球数据库大赛:PolarDB TPC-C性能优化挑战赛方案分享(一)--参数调优