韩老师多目标优化:多目标粒子群算法

一. 内容简介

韩老师多目标优化:多目标粒子群算法
视频: 【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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/4774.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

libevent:windows环境配置+QT使用

目录 libevent是什么 编译 QT使用 测试代码 libevent是什么 Fast portable non-blocking network programming with Libevent http://www.wangafu.net/~nickm/libevent-book/TOC.html 这篇文档讲的很清楚&#xff0c;尤其是Chapter 1: A tiny introduction to asynchro…

大数据面试基础回答

以下是Hive大数据领域的一些常见问题&#xff1a; 数据倾斜&#xff1a;在Hive中&#xff0c;数据倾斜是一个常见的问题&#xff0c;它会导致查询结果不准确或查询过程异常。为了解决数据倾斜问题&#xff0c;可以尝试以下方法&#xff1a; 使用更高效的数据倾斜处理工具&…

cURL error 1014: SSL verify failed 报错

报错 [ERROR] cURL error 1014: SSL verify failed (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) for https://mgobe.tencentcloudapi.com/[247] in /www/wwwroot/*.net/vendor/ [ERROR] #0 /www/wwwroot/tencentgame.net/vendor/tencentcloud/tencentcloud-sdk…

matlab入门

命名规则&#xff1a; clc&#xff1a;清除命令行的所有命令 clear all&#xff1a;清除所有工作区的内容 注释&#xff1a;两个% 空格 %% matlab的数据类型 1、数字 3 3 * 5 3 / 5 3 5 3 - 52、字符与字符串 s a %% 求s的ascill码 abs(s) char(97) num2str(65) str I…

代码随想录第48天|198.打家劫舍, 213.打家劫舍II ,337.打家劫舍III

LeetCode198.打家劫舍 题目链接&#xff1a;198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; class Solution { public:int rob(vector<int>& nums) {if(nums.size() 0) return 0;if(nums.size() 1) return nums[0];vector<int> …

家政小程序开发-H5+小程序

移动互联网的发展&#xff0c;微信小程序逐渐成为商家拓展线上业务的重要手段。家政服务作为日常生活中不可或缺的一部分&#xff0c;也开始尝试通过小程序来提高服务质量和效率。 下面是一篇关于家政小程序开发的H5小程序的文章&#xff0c;希望对您有所帮助。 家政服…

Redis进阶底层原理- 缓冲区

Redis中使用了很多缓冲区&#xff0c;在redis各个环节起到了非常核心的作用。下面来一一介绍一下&#xff1a; 输入输出缓冲区&#xff08;客户端缓冲区&#xff09; Redis中的输入输出缓冲区是为了平衡客户端发送命令和服务端处理命令的速度差异&#xff0c;如果客户端发送指…

一本通1910:【00NOIP普及组】计算器的改良题解

今天是编程集训的第二天&#xff0c;也是我来到CSDN整整1年。感谢所有阅读过我的文章的人&#xff0c;谢谢。 今天的比赛难度略低于昨天&#xff0c;但这道题也卡了我好久。 进入正题 题目&#xff1a; 题目描述&#xff1a; NCL是一家专门从事计算器改良与升级的实验室&a…

手把手带你实现ChatGLM2-6B的P-Tuning微调

参考文献&#xff1a;chatglm2ptuning 注意问题1&#xff1a;AttributeError: ‘Seq2SeqTrainer’ object has no attribute is_deepspeed_enabl torch.distributed.elastic.multiprocessing.errors.ChildFailedError: 可能是版本太高&#xff0c;可以参考chatglm2的环境

mysql笔记

目录 1、root用户密码忘记 2、SQL的分类 2.1、DQL数据查询语言 前言 2.1.1、设置别名 2.1.2、去除重复行 2.1.3、空值参与运算 2.1.4、着重号 2.1.5、显示表结构 2.1.6、算数运算符 2.1.7、比较运算符 2.1.8、逻辑运算符 2.1.9、位运算符 2.1.10、 模糊查询 2.1.…

深信服社招linux岗位面试题汇总

1、结构体变量是否能直接比较&#xff1f; A&#xff1a; 2、static关键字的用法&#xff1f;static修饰的变量和普通局部变量有什么区别&#xff1f;各自存放在哪里&#xff1f; 3、函数参数是怎么传递的&#xff08;网上也有小伙伴分享这个问题&#xff09; 我回答了调用…

基于Java+SpringBoot+Vue前后端分离校园管理系统详细设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

sqli-labs 堆叠注入 解析

打开网页首先判断闭合类型 说明为双引号闭合 我们可以使用单引号将其报错 先尝试判断回显位 可以看见输出回显位为2&#xff0c;3 尝试暴库爆表 这时候进行尝试堆叠注入&#xff0c;创造一张新表 ?id-1 union select 1,database(),group_concat(table_name) from informatio…

分布式应用之zookeeper集群+消息队列Kafka

一、zookeeper集群的相关知识 1.zookeeper的概念 ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Google的Chubby一个开源的实现&#xff0c;是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件&#xff0c;提供的功能…

[刷机] 9008 刷机救砖笔记

前几日, 我拿着手里的 OnePlus 8T 作死, 成功的把它作成了砖, 系统分区嗝屁, recovery 和 bootloader 分区也都嗝屁, 换言之, 只能使用 9008 进行刷机了… 什么是 9008 深刷 按照网上的介绍, 9008 是骁龙系列处理器的手机专有的, 用于为手机硬件下载数据的模式. 只要手机还能…

一级分类全覆盖!安全狗入选《嘶吼2023网络安全产业图谱》

7月10日&#xff0c;嘶吼安全产业研究院联合国家网络安全产业园区&#xff08;通州园&#xff09;正式发布《嘶吼2023网络安全产业图谱》。作为国内云原生安全领导厂商&#xff0c;安全狗入选图谱中的多个细分领域。 据悉&#xff0c;本次《嘶吼2023网络安全产业图谱》采用了市…

JavaScript——基础知识及使用

初识 JavaScript JavaScript (简称 JS) 是世界上最流行的编程语言之一.一个脚本语言, 通过解释器运行.主要在客户端(浏览器)上运行, 现在也可以基于 node.js 在服务器端运行. JavaScript 的能做的事情: 网页开发(更复杂的特效和用户交互)网页游戏开发服务器开发(node.js)桌…

ReLU激活函数

ReLU&#xff08;Rectified Linear Unit&#xff09;激活函数是一种常用的非线性激活函数&#xff0c;其原理是在输入小于等于零时输出为零&#xff0c;在输入大于零时输出等于输入值。ReLU激活函数的作用是引入非线性变换&#xff0c;使得神经网络可以学习更复杂的模式和特征。…

新手学c#常用到的语法记录

C# 是一种面向对象的编程语言。在面向对象的程序设计方法中&#xff0c;程序由各种相互交互的对象组成。相同种类的对象通常具有相同的类型&#xff0c;或者说&#xff0c;是在相同的 class 中。 例如&#xff0c;以 Rectangle&#xff08;矩形&#xff09;对象为例。它具有 l…

Pandas Groupby:在Python中汇总、聚合和分组数据

GroupBy是一个非常简单的概念。我们可以创建一个类别分组&#xff0c;并对这些类别应用一个函数。这是一个简单的概念&#xff0c;但它是一种在数据科学中广泛使用的非常有价值的技术。在真实的的数据科学项目中&#xff0c;您将处理大量数据并一遍又一遍地尝试&#xff0c;因此…