算法原理部分参考文献基于改进多目标粒子群算法的配电网储能选址定容
初学者面对多目标优化问题可能比较困难,写下这篇博客记录一下自己学习的心得,希望能和大家一起交流学习。
采用粒子群求单目标优化问题的原理很好理解,就是通过对粒子群的速度和位置不断来更新粒子群的最优适应度(也就是目标函数),达到寻优的目的。但是多目标优化问题就比较难办了,由于目标函数有多个,如果同样使用粒子群算法,那么适应度怎么设置?怎么确定全体最优的粒子?这些问题都是比较棘手的。
目前采用粒子群算法求解多目标问题主要有两大类处理方式:
1.通过加权求和、灰色关联度分析、topsis、层次分析法等方法对多个目标函数进行处理,将多目标问题转换为单目标问题,然后仿照单目标问题进行求解;
2.在迭代时以一定规则选择全体最优及个体最优的粒子,然后通过迭代求取pareto解集,最后根据需求从pareto解集中选取一个最合适的方案。
第一种方式本质上还是单目标优化问题,这篇主要介绍一下第二种方法:
我们知道在粒子群算法中一个粒子就代表优化问题的一个解(也可以说是方案),如果说在一个多目标优化问题中,解1得到的所有目标函数全部优于解2,那么就说解2被解1支配。啥意思呢,举个例子,比如咱们的优化目标是选房子,目标函数包括房子租金和面积。A租金1800/月,面积100m²,B租金2800/月,面积40m²,显然A完全优于B,那么就说解B被解A支配;再有C租金1600/月,面积80m²,C的租金低于A,但面积比A小,这时候就说不上来C和A哪个更优,也就是C是A(A是C)的非支配解。
清楚了支配与非支配的含义,那么pareto最优解(也叫非劣解)就不难理解了:如果说对于优化问题的一个解A,不存在其他的解可以支配解A,那么解A就是一个pareto最优解。显然pareto最优解不只一个,由这些解组成的集合就称为pareto最优解集。pareto最优解集一个重要的特点就是集合中所有解的互相之间都是非支配的关系,也就是解集中不存在任何一个解完全优于其他解(要和平共处)。所以,和PSO最后要求出唯一一个最优解不同,MOPSO的目标是求出一个互相之间为非支配关系的解的集合,也就是pareto最优解集。
因为粒子群算法在迭代过程中各个粒子的速度和位置都是不断变化的,适应度(目标函数)也随之变化,所以需要一般都需要采用一个外部存档将pareto最优解的数据存储下来。
根据所求问题的具体情况,初始化所有粒子的速度和位置。计算所有粒子的目标函数,将其中的非劣解存在外部存档中,形成pareto解集;
由于是初始化过程,所以每个粒子的个体最优就是其本身;参考文献中群体最优的选取方式是采用密集距离进行排序,在初始化选取的时候为了方便,也可直接从pareto解集随机选取;
惯性权重是粒子群算法的一个重要参数,和算法的局部搜索能力以及全局搜索能力相关,在每次迭代时,将惯性权重按下面的公式更新:



这一步和单目标粒子群算法一样:



这一步也就是参考文献的“改进”所在,也是可以避免算法陷入局部最优的操作:

参考文献中采用动态密集距离对pareto解集进行更新。简单来理解,就是判断一下pareto解集中各个解的距离,把距离较远的解留下(也就是保证解的分布不要太密集),距离比较近的解淘汰,保证外部存档中pareto最优解的数量不超过上限。这一点也比较好理解,还是拿租房子来举例,假设现在pareto解集中有三个选项:A租金1800/月,面积100m²,B租金1600/月,面积80m²,C租金1799/月,面积99m²,三个解互相都是非支配的关系,但如果咱们外部存档最多只能存两个解,该淘汰谁呢?我们注意到,A和C之间两个目标的值都很接近,相似度很高,所以为了保证解的多样性,淘汰的时候就从A和C之中选一个,B可以保留下来(具体该淘汰谁没有具体算,只是举个例子方便理解)。这就是通过密集距离对pareto解集进行更新的原理,密集距离的计算公式如下:

群体最优和个体最优的更新方式也是MOPSO的研究重点,各种花里胡哨的方法都有,参考文献的方法就比较简单粗暴,随机选,具体方法如下:

判断一下是否满足迭代次数要求,如果满足了就输出结果,不满足的话需要返回步骤3。
ZDT函数是多目标优化问题的常用的测试函数,具体公式如下:
%% 清空环境
clc
clear
close all
%% 设置种群参数
sizepop = 200; % 初始种群个数
dim = 10; % 空间维数
ger = 100; % 最大迭代次数
x_max=1*ones(1,dim); % 位置上限
x_min=zeros(1,dim); % 位置下限
v_max=0.8*x_max; % 速度上限
v_min=-v_max; % 速度下限
w_start=0.9; % 惯性权重初始值
w_end=0.4; % 惯性权重结束值
c_1 = 1.5; % 自我学习因子
c_2 = 1.5; % 群体学习因子
set_num_max=100; % pareto解集规模
%% 种群初始化
pop=x_min+rand(sizepop,dim).*(x_max-x_min); % 初始化种群
pop_v=v_min+rand(sizepop,dim).*(v_max-v_min); % 初始化种群速度
fitness=zeros(sizepop,2); % 所有个体的适应度
% 初始的适应度
for k=1:sizepop
[a,b]=ZDT1(pop(k,:));
fitness(k,:)=[a,b];
end
% 更新pareto解集
pareto_set=fitness(1,:);
pareto_pop=pop(1,:);
for k=2:sizepop
nk=length(pareto_set(:,1));
kk=1;
index=0;% 判断是否放入pareto解集中的标志
while kk<=nk
% 如果pareto解集中被第k个个体支配就将其删除
if fitness(k,:)<pareto_set(kk,:)
pareto_set(kk,:)=[];
pareto_pop(kk,:)=[];
nk=nk-1;
kk=kk-1;
% 如果个体k被pareto解集中任意支配就退出循环
elseif fitness(k,:)>pareto_set(kk,:)
break;
else
index=index+1;
end
kk=kk+1;
end
if index>=length(pareto_set(:,1))
pareto_set=[pareto_set;fitness(k,:)];
pareto_pop=[pareto_pop;pop(k,:)];
end
end
% 采用密集距离法更新全局最优和个体最优
I = crowd_dist(pareto_set); % 求所有个体的拥挤距离
% 采用逐一去除法更新pareto解集
while length(I)>set_num_max
pareto_set(I==min(I),:)=[];
I = crowd_dist(pareto_set);
end
% 在拥挤距离较大的前20%解中随机选择全局最优
if floor(0.2*length(I))<1
r1=1;
else
r1=randi([1,floor(0.2*length(I))]);
end
x_zbest=pareto_pop(r1,:); % 全局最优的位置
fitness_zbest=pareto_set(r1,:); % 种群的最优适应度
x_gbest=pop; % 个体的最优位置
fitness_gbest=fitness; % 个体的最优适应度
%% 迭代求pareto解集
iter=1;
while iter <= ger
省略....
iter=iter+1;
end
代码中以动画的形式更新pareto解集,这里只展示最终结果:


完整代码获取方式参见链接:多目标粒子群算法(MOPSO)的原理和matlab实现
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1
目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO
遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg
通常,数组被实现为内存块,集合被实现为HashMap,有序集合被实现为跳跃列表。在Ruby中也是如此吗?我正在尝试从性能和内存占用方面评估Ruby中不同容器的使用情况 最佳答案 数组是Ruby核心库的一部分。每个Ruby实现都有自己的数组实现。Ruby语言规范只规定了Ruby数组的行为,并没有规定任何特定的实现策略。它甚至没有指定任何会强制或至少建议特定实现策略的性能约束。然而,大多数Rubyist对数组的性能特征有一些期望,这会迫使不符合它们的实现变得默默无闻,因为实际上没有人会使用它:插入、前置或追加以及删除元素的最坏情况步骤复
在ruby中,你可以这样做:classThingpublicdeff1puts"f1"endprivatedeff2puts"f2"endpublicdeff3puts"f3"endprivatedeff4puts"f4"endend现在f1和f3是公共(public)的,f2和f4是私有(private)的。内部发生了什么,允许您调用一个类方法,然后更改方法定义?我怎样才能实现相同的功能(表面上是创建我自己的java之类的注释)例如...classThingfundeff1puts"hey"endnotfundeff2puts"hey"endendfun和notfun将更改以下函数定
我目前有一个reddit克隆类型的网站。我正在尝试根据我的用户之前喜欢的帖子推荐帖子。看起来K最近邻或k均值是执行此操作的最佳方法。我似乎无法理解如何实际实现它。我看过一些数学公式(例如k表示维基百科页面),但它们对我来说并没有真正意义。有人可以推荐一些伪代码,或者可以查看的地方,以便我更好地了解如何执行此操作吗? 最佳答案 K最近邻(又名KNN)是一种分类算法。基本上,您采用包含N个项目的训练组并对它们进行分类。如何对它们进行分类完全取决于您的数据,以及您认为该数据的重要分类特征是什么。在您的示例中,这可能是帖子类别、谁发布了该项