多目标优化(三)简单的 MOEA/D

写在前面:

① MOEA/D提供了一个简单但是有效的方法,将分解的方法引入到多目标进化计算中。

② 分解策略主要使用三种聚合函数:1)权重聚合方法;2)切比雪夫方法;3)基于惩罚的边界交叉方法

算法概要:

step1:获取算法参数(包括种群大小、迭代终止条件、函数问题参数、生成权重向量、生成邻居矩阵)

step2:初始化种群(生成NP个初始解,即每个子问题的初始解,每个子问题对应一个权重向量)

step3:生成候选解,更新各目标的最小值(for 最小值问题)

step4:按照MOEA/D的分解策略更新各个子问题的最优解

step5:重复上述过程,直至满足迭代终止条件

clc; clear; close all;
format long
global NP x_num f_num nei_num iter_max fun x_min x_max
global weight_vec f_min  nei pop%% 获取函数参数
fun = 'ZDT1'; test              % 选择测试函数 DTLZ1
weight_vec = gen_weight_vec();  % 产生权重向量
nei_num = NP / 5;               % 邻居规模大小
nei = gen_nei();                % 生成邻居矩阵
iter_max =  250;                % 最大迭代次数
NP = 100;                      % 种群大小,也是子问题 subproblem 的个数%% 初始种群
pop = x_min + (x_max - x_min) .* rand(NP, x_num);
for i = 1:NPpop(i, x_num+1:x_num+f_num) = object_fun(pop);
end
f_min = min(pop(:,x_num+1:x_num+f_num));%% 迭代循环
for iter = 1:iter_max% 生成候选种群cpop = gen_candidate();f_min_y = min(cpop(:, x_num+1:x_num+f_num));f_min = min(f_min, f_min_y);% MOEA/D 分解策略% pop = weighted(cpop);% pop = tchebycheff(cpop);pop = penalty_boundary_intersection(cpop);% 可视化h = scatter(pop(:,x_num+1),pop(:,x_num+2),'*');title(num2str(iter))drawnowif iter < iter_maxdelete(h);endend

子程序:

1、gen_weight_vec:与NSGA-III中产生参考点的方法一样,这里产生的权重向量个数与种群大小相同,意思是每个个体看成是一个子问题,每个子问题对应一个权重向量。

https://blog.csdn.net/weixin_41942547/article/details/114082875?spm=1001.2014.3001.5502

2、gen_nei:对于某个子问题的权重向量,找到离它最近的nei_num个权重向量(欧氏距离)

function Nei_pick = gen_nei()global weight_vec nei_num NPdis = pdist2(weight_vec, weight_vec);for i = 1:NP[~, idx] = sort(dis(i, :));Nei_pick(i, :) = idx(1: nei_num); endend

3、gen_candidate:个人认为能生成候选解就行了。这里用的方法是从该子问题的邻居中选择两个进行交叉变异(这样生成的候选解被“认为”是在子问题附近的,子问题更有机会得到更新)


% 个体更新
function cpop = gen_candidate()global x_num pop NP nei nei_numpc = 0.7; pm = 1 / x_num; yita1 = 2; yita2 = 5; cpop = pop*0;for i = 1:NPpick = randperm(nei_num, 2); % 从邻居中随机挑选两个个体x1 = pop(nei(i, pick(1)), :); x2 = pop(nei(i, pick(2)), :); cpop(i, :) = x1;% crossoverfor j = 1:x_numif rand < pc u = rand;if u < 0.5gama = (2 * u)^(1 / (yita1 + 1));elsegama = (1 / (2 * (1 - u)))^(1 / (yita1+1));endcpop(i, j) = 0.5 * ((1 + gama) * x1(j) + (1 - gama) * x2(j));endend% mutationfor j = 1:x_numif rand < pmu = rand;if u < 0.5delta = (2 * u)^(1 / (yita2 + 1)) - 1;elsedelta = 1 - (2 * (1 - u))^(1 / (yita2 + 1));endcpop(i, j) = cpop(i, j) + delta;endendend% 判界cpop = judge_bound(cpop);end

4、MOEA/D 分解策略:公式参考https://blog.csdn.net/sinat_33231573/article/details/80271801

1)、Weighted Sum Approach

加权求和法,是那个人为设定了各个目标所占的比重,然后将多目标转化为单目标的方法吧!

这里应该更高级一点,设置的比重就是权重向量,对于每个子问题,候选解加权求和小于原子问题解的加权求和的话,就能更新这个子问题的解了。

function rpop = weighted(cpop)global weight_vec x_num f_num f_min nei pop NPrpop = pop;% 计算加权求和后的值 for i = 1:NPy = cpop(i, :); for m = 1:size(nei, 2)weighted_x = sum((weight_vec(nei(i, m), :)) .* (pop(nei(i, m), x_num+1:x_num+f_num) - f_min));weighted_y = sum((weight_vec(nei(i, m), :)) .* (y(x_num+1:x_num+f_num) - f_min));if weighted_y <= weighted_xrpop(nei(i, m), :) = y;endendendend

2)、Tchebycheff Approach

https://blog.csdn.net/jinjiahao5299/article/details/76045936

该方法大致思想就是减少最大差距从而将个体逼近pareto前言面。

function rpop = tchebycheff(cpop)global weight_vec x_num f_num f_min nei pop NPrpop = pop;% 计算切比雪夫值 for i = 1:NPy = cpop(i, :); for m = 1:size(nei, 2)tche_cheff_x = max(weight_vec(nei(i, m), :) .* abs(pop(nei(i, m), x_num+1:x_num+f_num) - f_min));tche_cheff_y = max(weight_vec(nei(i, m), :) .* abs(y(x_num+1:x_num+f_num) - f_min));if tche_cheff_y <= tche_cheff_xrpop(nei(i, m), :) = y;endendendend

3)、Boundary Intersection Approach

子问题的解可以在空间上的任意位置,那么它就有两个因素来评价解的好坏:1)解到权重向量的距离越小越好;2)解在权重向量上的映射点离最优点(所有目标都最小)越小越好。

这里解到权重向量的惩罚因子设置为 2)的值,效果更好点儿!!

function rpop = penalty_boundary_intersection(cpop)global weight_vec x_num f_num f_min nei pop NPrpop = pop;% 计算两个距离值 for i = 1:NPy = cpop(i, :); % penalty = mean(pop(i, x_num+1:x_num+f_num));for m = 1:size(nei, 2)fx = pop(nei(i, m), x_num+1:x_num+f_num); w = weight_vec(nei(i, m), :);boundary_x = norm((f_min - fx) * w') / norm(w);boundary_x = boundary_x + boundary_x * norm(fx - (f_min - boundary_x * w));boundary_y = norm((f_min - y(x_num+1:x_num+f_num)) * w') / norm(w);boundary_y = boundary_y + boundary_y * norm(y(x_num+1:x_num+f_num) - (f_min - boundary_y * w));if boundary_y <= boundary_xrpop(nei(i, m), :) = y;endendendend

完整可执行代码:https://download.csdn.net/download/weixin_41942547/15479604

多目标优化(三)简单的 MOEA/D相关推荐

  1. 多种群协同差分进化多目标优化

    多种群协同差分进化多目标优化 摘要 提出了一种用于多目标优化的多种群协同差分进化算法.对于一个M目标优化问题,该算法有M个单目标优化子种群和一个存档种群.将自适应DE应用于每个子种群,以优化多目标优化 ...

  2. 进化计算(三)——多目标优化基本概念

    多目标优化MOP基本概念 概述 引言 多目标优化问题的数学模型 基本概念 Pareto最优 Pareto支配 Pareto Front-最优边界 Approximation Set-近似解 Appro ...

  3. 简易mysql优化_优化 MySQL:简单三个技巧

    原标题:优化 MySQL:简单三个技巧 技巧#1:为临时表分配足够的内存 在某些情况下,服务器在处理语句时会创建内部临时表.临时表用于内部操作如GROUP BY和distinct,还有一些ORDER ...

  4. 多目标优化(一)简单的 NSGA-Ⅱ

    多目标优化(一)简单的 NSGA-Ⅱ 写在前面: 1.接触到的第一个多目标优化算法,对于2~3个目标真挺有效的: 2.本文主要介绍自己理解的 NSGA-II Matlab 程序实现,在学习中迷糊的地方 ...

  5. 基于多目标算法的冷热电联供型综合能源系统运行优化 综合能源 冷热电三联供 粒子群算法 多目标优化 多目标粒子群 冷热电联供 综合能源系统 运行优化

    多目标粒子群 冷热电联供 综合能源系统 运行优化 关键词:综合能源 冷热电三联供 粒子群算法 多目标优化 参考文档:<基于多目标算法的冷热电联供型综合能源系统运行优化> 仿真平台:MATL ...

  6. 基于多目标算法的冷热电联供型综合能源系统运行优化 关键词:综合能源 冷热电三联供 粒子群算法 多目标优化

    多目标粒子群 冷热电联供 综合能源系统 运行优化 关键词:综合能源 冷热电三联供 粒子群算法 多目标优化 参考文档:<基于多目标算法的冷热电联供型综合能源系统运行优化> 仿真平台:MATL ...

  7. MATLAB实战系列(三十九)-matlab多目标优化之海洋捕食者算法

    前言 文中涉及代码可参见 matlab多目标优化之海洋捕食者算法 海洋捕食者算法(Marine Predators Algorithm, MPA)是Afshin Faramarzi等人于2020年提出 ...

  8. 算法代码_Python进化算法之多目标优化与代码实战

    前言 自从上三篇博客详细讲解了Python遗传和进化算法工具箱及其在带约束的单目标函数值优化中的应用.利用遗传算法求解有向图的最短路径.利用进化算法优化SVM参数之后,这篇不再局限于单一的进化算法工具 ...

  9. 进化算法——多目标优化

    所有的实际优化问题都是多目标的,如果不是显式的至少也是隐式的.接下来讨论多目标优化问题(MOP)如何修改进化算法.实际的优化问题包含多个目标,那些目标常常互相冲突.例如: 在购买汽车时,我们可能想要车 ...

  10. 多目标优化问题概述(基本模型和概念)

    多目标优化问题(MOP)概述 1.数学模型 求解 MOP 的主要目的是:在给定的决策空间内,尽可能找到一系列满足问题约束条件的最优解集,为解决 MOP 的决策者提供相关数据.以最小化的 MOP 为例, ...

最新文章

  1. 【STL源码剖析读书笔记】【第5章】关联式容器之hashtable
  2. 实验1 查看CPU和内存、用机器指令和汇编指令编程
  3. 字符字节Base64编码
  4. 记一次失败的Windows环境编译Nginx源码
  5. 图卷积神经网络(part4)--GNN
  6. mysql_crud
  7. java udp 协议_网络协议 - UDP 协议详解
  8. 法证先锋3中的Apps软件
  9. Selenium API-WebDriver 方法
  10. 索引sql server_SQL Server索引操作
  11. Redis缓存穿透、缓存雪崩和缓存击穿理解
  12. 网络从业人员职业规划路线图
  13. 51nod1355 斐波那契的最小公倍数
  14. 小榕flash管理器xp 是什么
  15. 从dig命令理解DNS
  16. 高等数学——常用不定积分公式
  17. java delphi socket_Delphi跨平台Socket通讯库
  18. axure9实用操作设置鼠标单击交互事件为什么没响应
  19. 适合在企业网站展示企业发展历程的时间轴滑动特效源码
  20. @vue/composition-api/dist/vue-composition-api.mjs in ./node_modules/vue-demi/lib/index.mjs 报错

热门文章

  1. 刘士颉老师——德鲁克“卓有成效”管理理论的践行者,曾任宜信公司培训负责人
  2. 光缆弹性模量计算_光缆的基本常识
  3. KX3552驱动的安装大九
  4. 几款pdf转换成word转换器免费版软件
  5. 百度离线地图开发API
  6. 酒店客房管理系统安排 Java项目 毕业设计项目不用愁
  7. 解决HD3000在OS X 10.10.2上横线和花屏问题
  8. TFT-ST7789 方向调整
  9. ET vs Ad hoc
  10. jabber服务器_最近JavaScript Jabber播客-Microsoft(而非Microsoft)和Web