图片缩略图

多目标粒子群算法(MOPSO)

版本1.3.2.0 (433 KB) 维克多Martinez-Cagigal
多目标粒子群优化算法(MOPSO)的可忍受和压缩实现
4.7
27日评级

93下载

更新2019年11月27日

视图版本历史

查看许可协议

该函数执行多目标粒子群优化(MOPSO)最小化连续函数。实现是可忍受的,计算便宜,并且压缩(算法只需要一个文件:MPSO.m)。一个的例子。M '脚本的提供是为了帮助用户使用实现。值得一提的是,为了便于理解,对代码进行了高度注释。该实现基于Coello et al.(2004)的论文“用粒子群优化处理多个目标”。

重要提示:指定的目标函数必须向量化。这意味着它将整个人口(即,一个矩阵x据nVar Np, Np是粒子的数量,据nVar是变量)的数量,它期望获得一个健身价值为每个粒子(例如,一个向量Np x 1)。如果函数没有vectoriyed和接收只有一个值,代码将明显上升一个错误。

引用作为

维克多Martinez-Cagigal(2021)。多目标粒子群算法(MOPSO)(//www.tatmou.com/matlabcentral/fileexchange/62074-multi-objective-particle-swarm-optimization-mopso), MATLAB中央文件交换。检索

意见及评分(67

瑞安·麦凯

Upama戴伊

非常感谢你的代码。它对我帮助很大。我还需要一个MOPSO来最大化连续函数。你能告诉我怎么做吗?

莫里茨Schappler

Chengtao徐

Yuanqing刘

伟大的工作

扎基dahia

你好,@ naf_001@yahoo.com,我不明白如何实现我的问题在多目标粒子群优化,因为我不理解代码正确。
%%%%%%%%%%%%%%%% example.m
Tp = 140; Tf = 600; Cp = 5000; Cf = 35000; m = 3; n = 8000;
f = @(x) (Cp+Cf*((x/n)^m))/(x+Tp+Tf*((x/n)^m));
g = @(x) x/(x+Tp+Tf*(x/n)^m)
MultiObj。Fun = @(x) [f(x), g(x)];
MultiObj。据nVar = 1;%根据你的变量数来改变这个
MultiObj。var_min = 1。* 1 (1,MultiObj.nVar);写下你的下限,而不是零
MultiObj。var_max = 25000。*的(1,MultiObj.nVar);%而不是1写上限
先谢谢你,纳菲斯·阿哈马德

瓦格纳沙尔丹哈

我想寻求帮助。我不明白为什么zd4函数不收敛。先谢谢你。

例“ZDT4”
F = @(x) x(:,1);
g = @ (x) 1 + 10。*(10 - 1)+总和(((x(:, 2:结束)。^ 2)-10。* cos(4。*π。* x(:, 2:结束))),2);
H = @(x) 1 -√(f(x)./g(x));
MultiObj。Fun = @(x) [f(x), g(x).*h(x)];
MultiObj。据nVar = 10;
MultiObj。var_min =[0、5、5、5、5、5、5、5、5、5];
MultiObj。Var_max = [1, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5];

的孩子叫mahata

你好先生,
如何调用MOPSO结果?如何得到最优的函数值及相应的自变量?

理查德•李

Nafees Ahamad

谢谢@Víctor Martínez-Cagigal,在正确理解你的代码后,我已经解决了我的问题。如果有人像我一样面对这个问题,请给我发消息@ naf_001@yahoo.com。这是一个很好的MOPSO代码。我的问题是这样的……
______________________________________
MultiObj。Fun = @(x) [f1(x), f2(x), f3(x), f4(x)];
MultiObj。据nVar = 5;
MultiObj。Var_min = [0, 2, 1, 1];
MultiObj。Var_max = [1, 10, 5, 5, 2000];

Nafees Ahamad

@Rahul Chaurasiya,它可以很容易地应用于3个目标函数,正如你看到的,有一些3个目标函数的例子。就像这样……
F = @(x) 1 - exp(-4.*x(:,1)).*sin(6.*pi.*x(:,1));
g = @ (x) 1 + 9。*(和(x(:, 2:结束),2)。/(大小(x, 2) 1))。^ 0.25;
H = @(x) 1 - (f(x)./g(x)) ^2;
MultiObj。Fun = @(x) [f(x), g(x), h(x)];
MultiObj。据nVar = 10;%根据你的变量数来改变这个
MultiObj。var_min = 0。* 1 (1,MultiObj.nVar);写下你的下限,而不是零
MultiObj。var_max = 1。* 1 (1,MultiObj.nVar);%而不是1写上限

快乐MOPSO

拉胡尔chaurasiya

我想优化一个3目标优化问题(f1,f2,f3)。是否有可能应用相同的代码。当前版本需要哪些主要的更改(包括帕累托最优解决方案的3D散射)?金宝搏官方网站

Huaiyu王

它是完善的,易于应用一个新的函数优化。
我应该做什么,如果我想得到主导的适合和fit_pos,并画一个新的数字。
我总是使用你的nsga2演示相同的功能,但我找不到类似的'REP'像MOPSO REP。

Parvesh Raheja

@Victor Martinez-Cagigal

我已经发邮件给你了:victor.martinez@gib.tel.uva.es

关于这个问题。
谢谢

Parvesh Raheja

@Victor Martinez-Cagigal

长官,你的密码是为了两个目标。我如何为6个目标而改变。你能帮忙吗?

维克多Martinez-Cagigal

很抱歉,如果示例有效,那么您遇到的问题是由于您的代码造成的。这个函数是完全注释的。至少读标题;并根据指令执行代码。如果你一直得到一个错误,你完全迷失了,电子邮件与我的代码,以便我可以复制它。

Parvesh Raheja

@Victor Martinez-Cagigal
@ahmad eldeep
我也遇到了同样的问题,在MOPSO期间,如果你有任何解决办法,请告诉我。

你也可以给我发邮件
raheja.parvesh@gmail.com

ahmad eldeeb

这个错误的解决方案是什么?
它出现在若干次迭代之后。
我希望有一个解决办法

无法执行赋值,因为左边和右边的元素数量不同。

GetGridIndex错误(第40行)
分指数(j) =我;

MOPSO错误(第113行)
(代表(我)。GridIndex代表(i) .GridSubIndex] = GetGridIndex(代表(i), G);

ahmad eldeeb

@Victor Martinez-Cagigal

我不明白你说的矢量化是什么意思。

ahmad eldeeb

@维克多Martinez-Cagigal

我给你发了一封邮件。

维克多Martinez-Cagigal

请查看前面的评论。

ahmad eldeeb

这个错误的解决方法是什么?
使用nchoosek时出错(第65行)
K必须是0到N之间的整数。

错误在MOPSO2>checkDomination(第186行)
all_perm = nchoosek (1: Np, 2);%的可能排列

MOPSO2错误(第27行)
主导= checkDomination (POS_fit);

RUN错误(第22行)
代表= MOPSO2 (params, MultiObj);

维克多Martinez-Cagigal

PF仅在示例中使用。它代表了最优解,只是为了直观。

ahmad eldeeb

如果我要用自己的目标函数来优化PF是多少

维克多Martinez-Cagigal

没有丢失的文件,你需要下载整个。zip文件夹,而不是从网络编辑器复制脚本。

ahmad eldeeb

在主文件“MOPSO”中,文件夹中有未识别或缺失的功能。

T Kalog

维克多Martinez-Cagigal

@sim_892 MATLAB现在抱怨,因为你不能做位操作(与点。)如果矩阵的大小不一样…我猜你的目标函数还没有正确定义。

不管怎样,你可以把你的目标函数写在文件里,如果它更适合你的话。例如,一个名为myFunction的文件,它声明了一个函数out = myFunction(x),该函数接受矩阵“x”并返回向量“out”。然后可以这样调用目标函数:@(x) myFunction(x);

sim_892

谢谢@Víctor Martínez-Cagigal,现在我明白了,但不幸的是,我的问题仍然存在。我用正确的形式指定了目标函数的所有变量:x(:,1), x(:,2), x(:,3)等等。我也到处用。操作符,但现在我得到以下错误:
矩阵维数必须一致。

错误示例> @ (x) 1。* w。* C2_25 (x) + G3_25 (x)

错误示例> @ (x)中(Y_qw_25 (x) * Y_ser_25 (x))。/ (Y_qw_25 (x) + Y_ser_25 (x))

错误的例子> @ (x) Y_1_25 (x) + 1我。* w。* C1_25 (x) + G1_25 (x)

错误示例> @ (x)中(Y_tb_rtd_25 (x) *(1. /(1我。* w。* x(:, 11))))。/ (Y_tb_rtd_25 (x) +(1. /(1我。* w。* x (:, 11))))

错误的例子> @ (x) Y_1p_25 (x) + 1我。* w。* x (: 12)

错误的例子> @ (x) ((1. / Y_tot_25 (x)) -50)。/ ((1. / Y_tot_25 (x)) + 50)

错误示例> @ (x)和((abs(真实(S11(:, 25)起源于(S_tot_25 (x))) + abs(图像放大(S11(:, 25)图像放大(S_tot_25 (x)))) ^ 2)。

错误的例子> @ (x) [f1 (x) f2 (x))

正如你所看到的,我需要一些函数的函数来指定我的目标函数,否则它太大了,不能用一个表达式来写。但我认为现在真正的问题是我的最后一个目标函数是一个值,而是一个数组(一个函数与频率点),我猜的向量w当我使用频率在我的目标函数,混乱了你的定义变量x (: 1), (:, 2), x (:, 3)

维克多Martinez-Cagigal

@sim_892正如评论中所述,我的目标函数执行一个矢量化方法,一次性评估所有粒子,并返回每个粒子的适合度。因此,由于输入必须是总体(n_particles x n_variables的矩阵),x(:,1)只是一次取所有粒子的第一个变量。

关于第二个问题,您没有使用数组操作(。^, .*, ./等),因此MATLAB抱怨它。这是MATLAB的一个非常基本的概念,所以我建议你参加一些课程或教程(//www.tatmou.com/help/matlab/matlab_prog/array-vs-matrix-operations.html).

sim_892

如果我使用你的格式(从例子)的目标函数,我得到以下错误:
使用^出错(第51行)
将矩阵提为幂的不正确的维度。检查矩阵是方阵,幂是标量。为了计算矩阵幂,
使用”。^”。

sim_892

嗨,我不知道如何正确地编程目标函数,而且我对Matlab相当陌生:在我以前的PSO实现中,我将简单地将我的目标函数的变量表示为x(1), x(2), x(3), .....但是你有时会用x(:,1)的形式来表示这些变量,而其他的只是x。你能举个例子,在这个例子中,目标函数是用单元素变量的函数(x(1), x(2),…等)?
谢谢你!

萨米拉Saiara Sajid

维克多Martinez-Cagigal

对于那些在nchoosek中有问题的人。错误提示您在更新存储库时使用了<2个粒子。这通常是因为你指定了一个编程错误的目标函数。

指定的目标函数必须向量化。这意味着它将整个人口(即,一个矩阵x据nVar Np, Np是粒子的数量,据nVar是变量)的数量,它期望获得一个健身价值为每个粒子(例如,一个向量Np x 1)。如果函数没有vectoriyed和接收只有一个值,代码将明显上升一个错误。

萨米拉Saiara Sajid

你好,
非常感谢你的代码。然而,我正面临着与斯里尼瓦斯·科卢鲁同样的问题。
我的objective函数包含for循环。所以我不确定如何解决它。

使用nchoosek时出错(第65行)
K必须是0到N之间的整数。

错误在MOPSO>checkDomination(第179行)
all_perm = nchoosek (1: Np, 2);%的可能排列

MOPSO错误(第23行)
这导致了问题

Flowshop错误(第20行)
代表= MOPSO (params, MultiObj);

瓦格纳沙尔丹哈

谢谢你!
我不能使用带有if条件的函数,可以在函数句柄中使用if吗?

嘿,我是非常新的matlab,如何开始使用工具箱?

yujin

专业刘

张小傅

感谢您提供的这段非常好的代码。
但是当我运行'例子。M ',它有如下的误差。你能给我一些建议吗?

错误使用负载
无法读取文件“ParetoFronts/Kursawe.mat”。没有这样的文件或目录。

Xiancai魏

Parmod Yadav

Sir在单目标“人工蜂群优化”中,我们使用公式fit_i=1/1+f_i计算适应度,其中f_i是成本函数值。请问在多目标人工蜂群优化中,我们如何计算适应度?

Fodhil Fadhila

感谢您提供的这段非常好的代码

嗨,尼玛,

请参考Kursake函数的例子。可以注意到,该函数有3个变量(nVar参数)。极限在var_min和var_max中定义为向量,在这种情况下,分别为[-5 -5 -5]和[5 -5 -5]。你应该这样定义你的极限。

尼玛rezaee

首先是很棒的代码和算法。谢谢你!
但不幸的是,我也有和RAVI MANDAVA一样的问题。我想对mopso中的每个变量有不同的varmin和varmax。
我可以修改代码,但我不确定它是否有效。我不知道,也许我错过了什么。
有人能帮帮我吗?
提前谢谢。

shdotcom shdotcom

干得好,非常感谢

亲爱的斯Kolluru,

由于您的错误是从一个名为“MOPSO_new”的函数返回的,我认为问题在于您自己的算法版本。给我发封电子邮件,也许我能帮你。

的问候。

斯Kolluru

你好马丁,

谢谢你的代码。但是当我运行代码时,我面临一个类似的错误,由Devin早些时候报告。
粒子数= 200;

使用nchoosek时出错(第65行)
K必须是0到N之间的整数。
错误在MOPSO_new>checkDomination(第226行)
all_perm = nchoosek (1: Np, 2);%的可能排列
错误在MOPSO_new(第67行)
主导= checkDomination (POS_fit);

你能帮我一下吗

郧阳王

作品易于理解和修改。

徐Shuhui

干得好,非常感谢

偏离

如预期的那样,它的性能优于Matlab中的gamultiobj
我不明白为什么他们只有一个PSO,而没有MOPSO ....
感谢这段漂亮的代码!

实际上,代码用红色表示当前的生成位置,用黑色表示Pareto Front粒子。因此,帕累托阵线只是黑点。

@Ali Chamseddine,实际上,这里没有实现约束,因为它是一个“简单”的例子。为了添加它们,你需要创建一个可行性函数,在每一代中,如果考虑到给定的约束条件,粒子的位置是可行的。如果有些人不是,你应该调整他们的立场。

zkl

你好,谢谢分享。我想问个问题。为什么不是所有的粒子在帕累托前,当我运行你的例子?大多数人在前面,而只有一小部分不在前面,这是正确的吗?

阿里Chamseddine

谢谢分享!但是我想问关于设置约束的问题,我没有在任何示例中发现任何实现的约束!对于如何做到这一点,我们将非常感激,再次感谢!
阿里

安德烈斯·阿布里尔

天顶周

太棒了!谢谢分享。我现在正在研究MOPSO,在编码方面遇到了一些麻烦…

米兰joshi

我如何测试新功能…我对MATLAB很陌生…任何帮助都将不胜感激。我不知道如何检查MOPSO的新功能…

海丰路

郝刘

维克多Martinez-Cagigal

@bulin wen,谢谢你的反馈。参考资料在MOPSO内部的评论中有说明。m函数。我的算法主要基于:
Coello, c.a.c., Pulido, G. T., & Lechuga, M. S.(2004)。用粒子群算法处理多个目标。计算机工程与应用,32(3),353 - 356。
[2] m.r., & Coello, c.a.c.(2005年3月)。利用拥挤、变异和e-优势改进基于pso的多目标优化。演化多准则优化国际会议(第505-519页)。施普林格柏林海德堡。

@Mengying Zhang,感谢您的反馈。没有理由不包括ZDT4问题,也许我在编写代码时没有找到方程。但是,它很容易实现,可以随意添加;)

bulin温

非常感谢!这是非常有用的。你能告诉我你用了哪些参考资料吗?

Mengying张

感谢您上传此代码。但是我发现您在这段代码中排除了ZDT4测试问题。你用它测试过ZDT4吗?

穆罕默德Gulec

伟大的工作。

维克多Martinez-Cagigal

编辑:错误提示“K必须是0和N之间的整数”。因为K = 2,这表明Np = 1或0。换句话说,您指定的粒子数量小于2,因此,MOPSO不能运行。

维克多Martinez-Cagigal

嗨Devin,

我已经用我在“示例”中提供的5个函数再次测试了算法。它不会抛出任何错误。也许,你正在使用的MultiObj函数是不正确的。你能给我提供更多关于你跑步的信息吗?

尽管如此,虽然我不认为这是问题的原因,但您使用的是哪个版本的MATLAB ?在我的例子中,我用大于2015a的版本测试了算法。

问候,
胜利者。

德温

使用nchoosek时出错(第65行)
K必须是0到N之间的整数。

错误在MOPSO>checkDomination(第218行)
all_perm = nchoosek (1: Np, 2);%的可能排列

MOPSO错误(第67行)
主导= checkDomination (POS_fit);

示例中的错误(第76行)
MOPSO (params, MultiObj);

MATLAB版本兼容性
创建R2016a
与任何版本兼容
平台的兼容性
窗户 macOS Linux

社区寻宝

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始狩猎!