韩老师多目标优化:多目标粒子群算法
一. 内容简介
韩老师多目标优化:多目标粒子群算法
视频: 【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
韩老师多目标优化:多目标粒子群算法相关推荐
- 【Matlab多目标优化求解】粒子群算法求解智能微电网多目标优化问题【含源码 383期】
一.代码运行视频(哔哩哔哩) [Matlab多目标优化求解]粒子群算法求解智能微电网多目标优化问题[含源码 383期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 ...
- 【Matlab多目标优化求解】粒子群算法求解配电网抢修优化问题【含源码 777期】
一.代码运行视频(哔哩哔哩) [Matlab多目标优化求解]粒子群算法求解配电网抢修优化问题[含源码 777期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] ...
- 【优化预测】粒子群算法优化BP神经网络预测温度matlab源码
一.粒子群算法及RBF简介 1 粒子群算法简介 1.1 引言 自然界中的鸟群和鱼群的群体行为一直是科学家的研究兴趣所在.生物学家Craig Reynolds在1987年提出了一个非常有影响的鸟群聚集模 ...
- 【微电网优化】基于粒子群算法求解智能微电网调度问题附matlab代码
1 简介 搭建光伏,风力发电机和储能电池的数学模型.充分考虑对蓄电池的充放电保护,制定优化调度策略.应用粒子群算法(PSO)对其优化调度模型进行求解,在算法中增加了蓄电池满充满放的限制条件,同时使系统 ...
- 混合储能系统容量优化matlab 采用粒子群算法编制风光互补发电储能系统的容量优化程序
混合储能系统容量优化matlab 采用粒子群算法编制风光互补发电储能系统的容量优化程序,程序采用超级电容和蓄电池的方案,得到最佳蓄电池和超级电容个数. YID:5348663612411738爱熬夜的 ...
- 【优化求解】粒子群算法的多目标优化matlab源码
一.简介 粒子群优化(PSO)是一种基于群体智能的数值优化算法,由社会心理学家James Kennedy和电气工程师Russell Eberhart于1995年提出.自PSO诞生以来,它在许多方面都得 ...
- 【优化调度】粒子群算法求解水火电调度优化问题【含Matlab源码 1181期】
⛄一.粒子群算法简介 1 引言 自然界中的鸟群和鱼群的群体行为一直是科学家的研究兴趣所在.生物学家Craig Reynolds在1987年提出了一个非常有影响的鸟群聚集模型,在他的仿真中,每一个个体都 ...
- 【优化求解】粒子群算法求解仓库成本控制优化问题【含Matlab源码 1577期】
⛄一.粒子群算法简介 1 引言 自然界中的鸟群和鱼群的群体行为一直是科学家的研究兴趣所在.生物学家Craig Reynolds在1987年提出了一个非常有影响的鸟群聚集模型,在他的仿真中,每一个个体都 ...
- 【微电网优化】基于粒子群算法求解混合储能系统容量优化问题含Matlab源码
1 简介 为了提高供电的稳定性.可靠性,实现日夜发电,在太阳能.风能资源比较丰富的区域,建立风能.太阳能互补发电系统.但是由于系统投入成本过高,风.光又存在间歇性和不稳定性等问题,需要配置储能系统来平 ...
- 【微电网优化】基于粒子群算法求解热电联供型微电网经济运行优化问题含Matlab源码
1 简介 面对全球环境污染和能源危机的双重压力,世界各国将焦点转向太阳能.风能等清洁可再生能源.微电网是组织和利用可再生能源发电的重要途径之一.本文以微电网的能量优化调度为研究对象,建立了微电网能量优 ...
最新文章
- (区间dp 或 记忆化搜素 )Brackets -- POJ -- 2955
- 利用jquery的imgAreaSelect插件实现图片裁剪示例
- 动态规划 BZOJ1584 [Usaco2009 Mar] Cleaning Up 打扫卫生
- C# 事件详解附实例分析
- 职称计算机承诺书,职称申报承诺书范本
- 一文看懂华为云AI新政,这波开发者福利有点硬
- ORB-SLAM 解读(二) ORB描述子如何实现旋转不变性
- Python学习笔记001——Linux
- win10共享打印机搜索不到计算机,win10找不到共享打印机 win10搜不到共享打印机 - 云骑士一键重装系统...
- C++中的setw()函数
- sap的pod确认_SAP POD 在途库存 SIT
- Python爬取曾今的K歌
- 为什么公司要用企业邮箱
- Windows自带MD5 SHA1 SHA256命令行工具
- 《2023游戏行业热点趋势报告》|Party Game游戏成为新趋势,备受消费者瞩目
- nbu客户端卸载_在LINUX系统下如何卸载NetBackup
- [Python深度学习入门]实战一·Numpy梯度下降求最小值
- 国家队ACM论文分类整理(转载)
- 怎么建一个新的微信群?微信小技巧
- Vue3 怎么使用icon阿里字体图标