一. 内容简介

韩老师多目标优化:多目标粒子群算法
视频: 【2022.2.5韩老师十七课时(中)多目标优化:多目标粒子群算法】
https://www.bilibili.com/video/BV1eS4y157Xg/?share_source=copy_web&vd_source=7b377d4a833a67013df5f95f32b390f8

二. 软件环境

2.1 matlab

三.主要流程

3.1 代码

clear
clcMultiObj.fun = @(x) [-10.*(exp(-0.2.*sqrt(x(:,1).^2+x(:,2).^2)) + exp(-0.2.*sqrt(x(:,2).^2+x(:,3).^2))), ...sum(abs(x).^0.8 + 5.*sin(x.^3),2)];
MultiObj.nVar = 3;
MultiObj.var_min = -5 .* ones(1, MultiObj.nVar);
MultiObj.var_max = 5 .* ones(1, MultiObj.nVar);params.Np = 200;
params.Nr = 150;
params.maxgen = 100;
params.W = 0.4;
params.C1 = 2;
params.C2 = 2;
params.ngrid = 20;
params.maxvel = 5;
params.u_mut = 0.5;REP = MOPSO(params, MultiObj);
function REP = MOPSO(params, MultiObj)Np = params.Np;Nr = params.Nr;maxgen = params.maxgen;W = params.W;C1 = params.C1;C2  = params.C2;ngrid = params.ngrid;maxvel = params.maxvel;u_mut = params.u_mut;fun = MultiObj.fun;nVar = MultiObj.nVar;var_min = MultiObj.var_min(:);var_max = MultiObj.var_max(:);POS = repmat((var_max-var_min)', Np, 1) .* rand(Np, nVar) + repmat(var_min', Np, 1);VEL = zeros(Np, nVar);POS_fit = fun(POS);PBEST = POS;PBEST_fit = POS_fit;DOMINATED = checkDomination(POS_fit);REP.pos = POS(~DOMINATED, :);REP.pos_fit = POS_fit(~DOMINATED, :);REP = updateGrid(REP, ngrid);maxvel = (var_max - var_min) .* maxvel ./ 100;gen = 1;display(['Generation #0 - Repository size: ' num2str(size(REP.pos,1))]);stopCondition = false;while ~stopConditionh = selectLeader(REP);VEL = W .* VEL + C1 * rand(Np, nVar) .* (PBEST - POS) ...+ C2 * rand(Np, nVar) .* (repmat(REP.pos(h, :), Np, 1) - POS);POS = POS + VEL;POS = mutation(POS, gen, maxgen, Np, var_max, var_min, nVar, u_mut);[POS, VEL] = checkBoundaries(POS, VEL, maxvel, var_max, var_min);       POS_fit = fun(POS);REP = updateRepository(REP, POS, POS_fit, ngrid);if(size(REP.pos, 1) > Nr)REP = deleteFromRepository(REP, size(REP.pos, 1) - Nr, ngrid);endpos_best = dominates(POS_fit, PBEST_fit);best_pos = ~dominates(PBEST_fit, POS_fit);best_pos(rand(Np, 1) >= 0.5) = 0;if(sum(pos_best) > 1)PBEST_fit(pos_best, :) = POS_fit(pos_best, :);PBEST(pos_best, :) = POS(pos_best, :);endif(sum(best_pos) > 1)PBEST_fit(best_pos, :) = POS_fit(best_pos, :);PBEST(best_pos, :) = POS(best_pos, :);enddisplay(['Generation #' num2str(gen) ' - Repository size: ' num2str(size(REP.pos,1))]);gen = gen + 1;if(gen > maxgen)stopCondition = true;endendh_rep = plot(REP.pos_fit(:,1),REP.pos_fit(:,2),'ok');
endfunction REP = updateRepository(REP, POS, POS_fit, ngrid)DOMINATED = checkDomination(POS_fit);REP.pos = [REP.pos; POS(~DOMINATED, :)];REP.pos_fit = [REP.pos_fit; POS_fit(~DOMINATED, :)];DOMINATED = checkDomination(REP.pos_fit);REP.pos_fit = REP.pos_fit(~DOMINATED, :);REP.pos = REP.pos(~DOMINATED, :);REP = updateGrid(REP, ngrid);
endfunction [POS, VEL] = checkBoundaries(POS, VEL, maxvel, var_max, var_min)Np = size(POS, 1);MAXLIM = repmat(var_max(:)', Np, 1);MINLIM = repmat(var_min(:)', Np, 1);MAXVEL = repmat(maxvel(:)', Np, 1);MINVEL = repmat(-maxvel(:)', Np, 1);VEL(VEL > MAXVEL) = MAXVEL(VEL > MAXVEL);VEL(VEL < MINVEL) = MINVEL(VEL < MINVEL);VEL(POS > MAXLIM) = (-1) .* VEL(POS > MAXLIM);POS(POS > MAXLIM) = MAXLIM(POS > MAXLIM);VEL(POS < MINLIM) = (-1) .* VEL(POS < MINLIM);POS(POS < MINLIM) = MINLIM(POS < MINLIM);
endfunction dom_vector = checkDomination(fitness)Np = size(fitness, 1);dom_vector = zeros(Np, 1);all_perm = nchoosek(1 : Np, 2);all_perm = [all_perm; [all_perm(:, 2), all_perm(:, 1)]];d = dominates(fitness(all_perm(:, 1), :), fitness(all_perm(:, 2), :));dominated_particles = unique(all_perm(d == 1, 2));dom_vector(dominated_particles) = 1;
endfunction d = dominates(x, y)d = all(x <= y, 2) & any(x < y, 2);
endfunction REP = updateGrid(REP, ngrid)ndim = size(REP.pos_fit, 2);REP.hypercube_limits = zeros(ngrid + 1, ndim);for dim = 1 : ndimREP.hypercube_limits(:, dim) = linspace(min(REP.pos_fit(:, dim)), max(REP.pos_fit(:, dim)), ngrid + 1)';endnpar = size(REP.pos_fit, 1);REP.grid_idx = zeros(npar, 1);REP.grid_subidx = zeros(npar, ndim);for n = 1 : 1 : nparidnames = [];for d = 1 : 1 : ndimREP.grid_subidx(n, d) = find(REP.pos_fit(n, d) <= REP.hypercube_limits(:, d)', 1, 'first') - 1;if(REP.grid_subidx(n,d) == 0)REP.grid_subidx(n,d) = 1;endidnames = [idnames ',' num2str(REP.grid_subidx(n, d))];endREP.grid_idx(n) = eval(['sub2ind(ngrid.*ones(1,ndim)' idnames ');']);endREP.quality = zeros(ngrid, 2);ids = unique(REP.grid_idx);for i = 1 : length(ids)REP.quality(i, 1) = ids(i);REP.quality(i, 2) = 10 / sum(REP.grid_idx == ids(i));end
endfunction selected = selectLeader(REP)prob = cumsum(REP.quality(:,2));sel_hyp = REP.quality(find(rand(1, 1) * max(prob) <= prob, 1, 'first'), 1);idx = 1 : 1 : length(REP.grid_idx);selected = idx(REP.grid_idx == sel_hyp);selected = selected(randi(length(selected)));
endfunction REP = deleteFromRepository(REP, n_extra, ngrid)crowding = zeros(size(REP.pos, 1), 1);for m = 1 : 1 : size(REP.pos_fit, 2)[m_fit, idx] = sort(REP.pos_fit(:, m), 'ascend');m_up = [m_fit(2 : end); Inf];m_down = [Inf; m_fit(1 : end - 1)];distance = (m_up - m_down) ./ (max(m_fit) - min(m_fit));[~, idx] = sort(idx, 'ascend');crowding = crowding + distance(idx);endcrowding(isnan(crowding)) = Inf;[~, del_idx] = sort(crowding, 'ascend');del_idx = del_idx(1 : n_extra);REP.pos(del_idx, :) = [];REP.pos_fit(del_idx, :) = [];REP = updateGrid(REP, ngrid);
endfunction POS = mutation(POS, gen, maxgen, Np, var_max, var_min, nVar, u_mut)fract = Np / 3 - floor(Np / 3);if fract < 0.5sub_sizes =[ceil(Np / 3), round(Np / 3), round(Np / 3)];elsesub_sizes =[round(Np / 3), round(Np / 3), floor(Np / 3)];endcum_sizes = cumsum(sub_sizes);nmut = round(u_mut * sub_sizes(2));if(nmut > 0)idx = cum_sizes(1) + randperm(sub_sizes(2), nmut);POS(idx, :) = repmat((var_max - var_min)', nmut, 1) .* rand(nmut, nVar) + repmat(var_min', nmut, 1);endper_mut = (1 - gen / maxgen) ^ (5 * nVar);nmut = round(per_mut * sub_sizes(3));if nmut > 0idx = cum_sizes(2) + randperm(sub_sizes(3), nmut);POS(idx, :) = repmat((var_max - var_min)', nmut, 1) .* rand(nmut, nVar) + repmat(var_min', nmut, 1);end
end

上边就是全部代码了,
下面说里面有些不太理解的问题

这个函数里面实现的的和视频里面讲的还不太一样,这个还是有可能选到拥挤的点的,(视频里面也是这个)

function selected = selectLeader(REP)prob = cumsum(REP.quality(:,2));% 这块随机取得,有点按概率的意思sel_hyp = REP.quality(find(rand(1, 1) * max(prob) <= prob, 1, 'first'), 1);idx = 1 : 1 : length(REP.grid_idx);selected = idx(REP.grid_idx == sel_hyp);selected = selected(randi(length(selected)));
end

REP.quality = zeros(ngrid, 2);
这网格质量,他实际是把网格分成了400个的,两个方向各20网格,但是这个还是写的20,好像是有点不够的

function REP = updateGrid(REP, ngrid)ndim = size(REP.pos_fit, 2);REP.hypercube_limits = zeros(ngrid + 1, ndim);for dim = 1 : ndimREP.hypercube_limits(:, dim) = linspace(min(REP.pos_fit(:, dim)), max(REP.pos_fit(:, dim)), ngrid + 1)';endnpar = size(REP.pos_fit, 1);REP.grid_idx = zeros(npar, 1);REP.grid_subidx = zeros(npar, ndim);for n = 1 : 1 : nparidnames = [];for d = 1 : 1 : ndimREP.grid_subidx(n, d) = find(REP.pos_fit(n, d) <= REP.hypercube_limits(:, d)', 1, 'first') - 1;if(REP.grid_subidx(n,d) == 0)REP.grid_subidx(n,d) = 1;endidnames = [idnames ',' num2str(REP.grid_subidx(n, d))];endREP.grid_idx(n) = eval(['sub2ind(ngrid.*ones(1,ndim)' idnames ');']);endREP.quality = zeros(ngrid, 2);ids = unique(REP.grid_idx);for i = 1 : length(ids)REP.quality(i, 1) = ids(i);REP.quality(i, 2) = 10 / sum(REP.grid_idx == ids(i));end
end

韩老师多目标优化:多目标粒子群算法相关推荐

  1. 【Matlab多目标优化求解】粒子群算法求解智能微电网多目标优化问题【含源码 383期】

    一.代码运行视频(哔哩哔哩) [Matlab多目标优化求解]粒子群算法求解智能微电网多目标优化问题[含源码 383期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 ...

  2. 【Matlab多目标优化求解】粒子群算法求解配电网抢修优化问题【含源码 777期】

    一.代码运行视频(哔哩哔哩) [Matlab多目标优化求解]粒子群算法求解配电网抢修优化问题[含源码 777期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] ...

  3. 【优化预测】粒子群算法优化BP神经网络预测温度matlab源码

    一.粒子群算法及RBF简介 1 粒子群算法简介 1.1 引言 自然界中的鸟群和鱼群的群体行为一直是科学家的研究兴趣所在.生物学家Craig Reynolds在1987年提出了一个非常有影响的鸟群聚集模 ...

  4. 【微电网优化】基于粒子群算法求解智能微电网调度问题附matlab代码

    1 简介 搭建光伏,风力发电机和储能电池的数学模型.充分考虑对蓄电池的充放电保护,制定优化调度策略.应用粒子群算法(PSO)对其优化调度模型进行求解,在算法中增加了蓄电池满充满放的限制条件,同时使系统 ...

  5. 混合储能系统容量优化matlab 采用粒子群算法编制风光互补发电储能系统的容量优化程序

    混合储能系统容量优化matlab 采用粒子群算法编制风光互补发电储能系统的容量优化程序,程序采用超级电容和蓄电池的方案,得到最佳蓄电池和超级电容个数. YID:5348663612411738爱熬夜的 ...

  6. 【优化求解】粒子群算法的多目标优化matlab源码

    一.简介 粒子群优化(PSO)是一种基于群体智能的数值优化算法,由社会心理学家James Kennedy和电气工程师Russell Eberhart于1995年提出.自PSO诞生以来,它在许多方面都得 ...

  7. 【优化调度】粒子群算法求解水火电调度优化问题【含Matlab源码 1181期】

    ⛄一.粒子群算法简介 1 引言 自然界中的鸟群和鱼群的群体行为一直是科学家的研究兴趣所在.生物学家Craig Reynolds在1987年提出了一个非常有影响的鸟群聚集模型,在他的仿真中,每一个个体都 ...

  8. 【优化求解】粒子群算法求解仓库成本控制优化问题【含Matlab源码 1577期】

    ⛄一.粒子群算法简介 1 引言 自然界中的鸟群和鱼群的群体行为一直是科学家的研究兴趣所在.生物学家Craig Reynolds在1987年提出了一个非常有影响的鸟群聚集模型,在他的仿真中,每一个个体都 ...

  9. 【微电网优化】基于粒子群算法求解混合储能系统容量优化问题含Matlab源码

    1 简介 为了提高供电的稳定性.可靠性,实现日夜发电,在太阳能.风能资源比较丰富的区域,建立风能.太阳能互补发电系统.但是由于系统投入成本过高,风.光又存在间歇性和不稳定性等问题,需要配置储能系统来平 ...

  10. 【微电网优化】基于粒子群算法求解热电联供型微电网经济运行优化问题含Matlab源码

    1 简介 面对全球环境污染和能源危机的双重压力,世界各国将焦点转向太阳能.风能等清洁可再生能源.微电网是组织和利用可再生能源发电的重要途径之一.本文以微电网的能量优化调度为研究对象,建立了微电网能量优 ...

最新文章

  1. (区间dp 或 记忆化搜素 )Brackets -- POJ -- 2955
  2. 利用jquery的imgAreaSelect插件实现图片裁剪示例
  3. 动态规划 BZOJ1584 [Usaco2009 Mar] Cleaning Up 打扫卫生
  4. C# 事件详解附实例分析
  5. 职称计算机承诺书,职称申报承诺书范本
  6. 一文看懂华为云AI新政,这波开发者福利有点硬
  7. ORB-SLAM 解读(二) ORB描述子如何实现旋转不变性
  8. Python学习笔记001——Linux
  9. win10共享打印机搜索不到计算机,win10找不到共享打印机 win10搜不到共享打印机 - 云骑士一键重装系统...
  10. C++中的setw()函数
  11. sap的pod确认_SAP POD 在途库存 SIT
  12. Python爬取曾今的K歌
  13. 为什么公司要用企业邮箱
  14. Windows自带MD5 SHA1 SHA256命令行工具
  15. 《2023游戏行业热点趋势报告》|Party Game游戏成为新趋势,备受消费者瞩目
  16. nbu客户端卸载_在LINUX系统下如何卸载NetBackup
  17. [Python深度学习入门]实战一·Numpy梯度下降求最小值
  18. 国家队ACM论文分类整理(转载)
  19. 怎么建一个新的微信群?微信小技巧
  20. Vue3 怎么使用icon阿里字体图标

热门文章

  1. MSP430——UART(四)
  2. 如何制作性能和效果平衡的UE项目——建模软件篇
  3. 正则表达式匹配大括号
  4. 浅谈 paas、iaas、saas
  5. Linux 补丁管理
  6. 曝支付宝漏洞可随意更改他人密码,回应称在核查
  7. 谷歌guava工具包详解
  8. CSW博客《工作无止境》
  9. 联想企业网盘3.60版本强势升级 大量用户提前体验
  10. 软件开发想说爱你不容易