图片缩略图

微分进化

version 1.16.0.1 (64.1 KB) by 马库斯Buehren
利用差分进化的进化算法进行优化。
4.9
48评级

84下载

更新2019年11月13日

视图版本历史

查看许可协议

这个贡献提供了使用差分进化的进化算法寻找最优参数集的函数。简单地说:如果您有一个无法计算其导数的复杂函数,而您想要找到最小化函数输出的参数集,那么使用这个包是一种可能的方法。
优化的核心是差分进化算法。然而,这个包提供的代码比在Differential Evolution主页上提供的要多得多:
http://www.icsi.berkeley.edu/~storn/code.html
以下是一些功能列表:
*优化可以在多个核/计算机上并行运行。
*在优化期间广泛和可配置的进度信息。
*中间结果被储存起来,以备以后对优化进程的审查。
*进度信息可通过电子邮件发送。
*不需要优化工具箱。
*快速入门演示功能。
*优化后显示中间结果。
*可选择不同的结束条件(最大时间,到达值等)。
*每个参数值可以被限制为一个区间。
*每个参数值可以量化(例如整数性质的参数)。
*代码可以很容易地扩展到使用你选择的进化算法。
我花了很多时间来开发这个包。如果你想让我知道你很欣赏我的工作,你可以通过捐款来表达你的感激:
https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=KAECWD2H7EJFN
关键词:优化,进化算法,遗传算法,差分进化,并行处理,分布式计算,多核。

引用作为

Markus Buehren(2021)。微分进化(//www.tatmou.com/matlabcentral/fileexchange/18593-differential-evolution), MATLAB中央文件交换。检索

意见及评分(74

SKRE

你好马库斯,

非常感谢你的包裹。是否有一种聪明的方法来定制脚本以识别Simulink模型的参数?金宝app
我有输入变量和输出变量的测量数据,想要将动态模型的参数与之匹配。

致以最亲切的问候

马库斯Buehren

有一个新的版本,没有(不必要的)声音支持,不会引起任何麻烦的功能波读。金宝app

Giussepi Mamani

你好马库斯!
这是一个强大的包,感谢您的贡献,我怀疑我是否运行了demo2。M,出现这个错误。我不知道发生了什么

未定义函数或变量'wavread'。

差异进化错误>displaybestmember (line 1900)
[x, fs, bits] = wavread('掌声。wav');

差异进化中的错误(第1163行)
displaybestmember(paramDefCell, parameterDimVector, bestval, bestmem,…)

demo2中的错误(第85行)
params, paramDefCell2, objFctHandle, objFctSettings, objFctParams, emailParams,
optimInfo,……

你能帮我一下吗?
的问候!

(Sanjeev Aggarwal

斯蒂芬·施万

你好马库斯,

再次感谢包装!我想我发现了一个错误。我认为,“generatefilesforslaveprocess”功能需要输出有关如何在其自身更新的变量Allmem的信息,或者避免更新Allmem。Allmem在函数中更新,但更新的数组不是输出。当有两个人的量化值相等时,这会导致问题。我认为只有在maxmaSterevals = 0时引起问题。假设我们有10名成员的人口,成员2和8是平等的。在“生成流......”之内,循环以与成员10相反的顺序进行到构件1.当它到达成员8时,构件8被添加到ALLMEM。稍后在循环中,Member 2被标记为不需要评估的重复参数集,并且没有为成员生成从属文件2。但是,未更新主要不同差异函数的Allmem以反映成员的添加2.稍后,ComputEvAlumationValue用于评估群体中的每个参数。它从Member 1进行到成员10.当它到成员2时,它会查找由从过程生成的结果文件,但从未找到一个参数从属文件,首先生成一个结果文件。

我猜从“generate....”输出一个更新的allmem不会解决这个问题,因为computeevaluationvalue不会从当前参数集寻找任何结果。作为一个临时修复,我想我将删除“generate…”中更新allmem的行。当我在同一个总体集合中有多个相等的成员时,它显然会导致低效,但至少对于我的特定问题,我不认为这是一个大问题。

再次感谢你出色的工作。

斯蒂芬。

如果你有兴趣知道,我添加了一些代码,在每次达到边界值时生成一个新成员(使用策略rand/1/bin)。这就解决了我一直遇到的算法总是在边界处卡住的问题。如果其他人遇到边界值问题,将其作为选项添加到代码中可能会很有用。

Isa Hafidz.

(徐

我喜欢这个工具箱,它非常强大和有用。

斯蒂芬·施万

你好马库斯,

在你的网站上,你说在某些情况下,算法会继续猜测边界值。在我的问题中,这种情况似乎经常发生。你有避免这种情况的建议吗?

也感谢伟大的软件包。

——斯蒂芬

斯蒂芬·施万

扎卡里·亨氏Jospeh

马库斯Buehren

嗨,艾伦,
当然取决于你的优化问题。如果您具有自然界的整数值的参数(例如,神经网络中的神经元数),请将量化设置为一个。如果您知道的参数差异小于epsilon(例如epsilon = 0.001)不会影响结果,请将量化设置为epsilon。如果要限制可能的参数向量的整体数量以减少优化的运行时间,则每个参数设置大于0的量化值。如果上面的任何内容适用,您可以将量化值设置为零意义无量化。

艾伦

请问如何在paramDefCell中设置参数量化的值?

马库斯Buehren

你好马库斯,
我很高兴您喜欢我的代码,它正在帮助您!正常情况下,从属计算的数量应该与函数计算的数量差不多。每次迭代执行多少函数评估?也许一些从进程正在空闲,因为没有足够的工作给所有的从进程?是否使用函数检查参数向量的有效性(validChkHandle)?可能大多数生成的参数向量都是无效的,没有什么可计算的。函数求值需要多长时间?这可能与每个函数的计算(加载/保存文件)有一些开销有关。

马库斯Buehren

你好马库斯,
我很高兴您喜欢我的代码,它正在帮助您!正常情况下,从属计算的数量应该与函数计算的数量差不多。每次迭代执行多少函数评估?也许一些从进程正在空闲,因为没有足够的工作给所有的从进程?是否使用函数检查参数向量的有效性(validChkHandle)?可能大多数生成的参数向量都是无效的,没有什么可计算的。函数求值需要多长时间?这可能与每个函数的计算(加载/保存文件)有一些开销有关。

马库斯•穆勒

你好马库斯,

感谢您分享代码。它目前正在帮助我做一些计算非常昂贵的优化。

有一个问题:“从属计算的数量”总是比“函数计算的数量”低得多,即使我使用了7、27甚至47个Matlab实例,运行differalevolution_slave。m代码。当然,机器有足够的核数(8/28/48核)。
从属计算的数量不应该是一个很大的数字吗,因为7个Matlab实例中有6个生成这些?

本Petschel

在R2017B中,除非您将Playsound设置为False,否则程序由于未定义的函数或变量'Wavread'而崩溃。由于未定义的函数或变量'setrandomstate',同时运行没有输入参数的程序在第331线的崩溃 - 假设这应该是'setRandomseed'。

Nitin Muralidhara Athreya


伟大的工作!

瑞安罗萨里奥

Krishanu纳

如何使用包含约束的这个函数?

我尝试创建一个带有所有约束的新脚本,并通过getDefaultParams.m中的validChkHandle参数调用它。但这似乎是错误的。它说显然有太多的输入参数。到底有什么可能是错的?

我只是做了

DEParamsDefault。validChkHandle = @(参数)NonLinearConstraints({参数k, N, D, perror分歧})

看不出有什么问题。

提前感谢大家的关注,BR!!

2质量

看到

嗨,谢谢你的代码。从demo1,它只传递一个数字。我试着给代价函数传递3个额外的向量,但是行不通。我可以知道怎么做吗?如果你能帮忙,我将不胜感激。谢谢。
以下是代码的方式。

optimInfo。title = '使用DE的Fung模型';

objFctHandle = @cost_Fung_v3_brute;
定义参数名称、范围和量化:

paramDefCell = {
'c0', [0.1 10], 0.001
'c1', [0.1 10], 0.001
'c2', [0.1 10], 0.001
};

在struct objFctParams中设置初始参数值
objFctParams。c0 = 0.1;
objFctParams。c1 = 0.1;
objFctParams。c2 = 0.1;
%设置单个附加功能参数
mycell = {lamda,c_stress11,c_stress22};
objfctsettings = {mycell};
% objFctSettings。λ=λ;
% objfctsettings . cstr = cstr;
%objfctsettings.c_stress22 = c_stress22;

DEParams = getdefaultparams;

%设置总体成员数量(通常建议10*D)
DEParams。NP = 30;

%这里不要使用从进程。如果你想,将feedSlaveProc设置为1和
% startmulticoreslave运行。m在至少一个额外的Matlab会话。
DEParams。feedSlaveProc = 0;

%设置时间
DEParams。麦克斯特= 20;
DEParams。maxtime = 30;%在几秒钟内
DEParams。maxclock = [];

设置显示选项
DEParams.infoIterations = 1;
DEParams.infoPeriod = 10;%在几秒钟内

不要发送电子邮件
emailParams = [];

%设置随机状态,以便始终使用相同的总体成员
setrandomseed (1);

启动差异进化
[bestmem, bestval, bestFctParams, nrOfIterations, resultFileName] = differentialevolution(…
params, paramDefCell, objFctHandle, objFctSettings, objFctParams, emailParams, optimInfo);

成本函数:

函数P_error_top = cost_Fung_v3_brute(objFctSettings, objFctParams)
%初始化值

c0 = objFctParams.c0 (1);%(1页);
c1 = objFctParams.c1 (1);%(2页);
c2 = objFctParams.c2 (1);%(3页);
c3 = c2;
c4 = 0;% p (5);
c5 = 0;% p (6);
c6 = 0;% p (7);

纤维取向时负载百分比
Mycell = objFctSettings {:}
[lamda11, c_stress11, c_stress22] = Mycell{:};
lamda22 =√1. / lamda11);
lamda33 = lamda22;

E11 = 0.5 * (lamda11 ^ 2 - 1);
E22 = 0.5 * (lamda22 ^ 2 - 1);
E33 = 0.5 * (lamda33 ^ 2 - 1);

Q = c1 * E22。^ 2 + c2 * E11。^ 2 + c3 * E33。^ 2;
H = c0 * (1 + 2 * E22)。* * E22 (c1)。* exp (Q);

stress_top_comp = c0 * (1 + 2 * E11)。* * E11 (c2)。* exp (Q) + H;

P_error1= stress s_top_comp - c_stressed 11;

P_error_top =总和(√(P_error1)。^ 2))/长度(lamda11);

结束

大家好,

如果你能告诉我你需要把哪些部分注释掉,让脚本发挥作用,我会非常高兴的。我也有wavread声明的问题,但在我尝试注释其相应的行之后,整个脚本停止工作。

提前表示感谢,祝你有一个愉快的一天。

Roshal费尔南德斯

塞缪尔·卡瑟

谢谢你的工作。我也改变了不工作的部分(addbuttons & wavread),在tat之后,它是好的和工作inf fine:)

哈利勒·Bilal

羌族张

霞山叮

非常感谢你的工作和分享,它帮助了我很多。虽然新版本似乎有一些问题(addbuttons和wavread),但在我注释掉它们之后,它工作得很好。

霞山叮

霞山叮

赵yalan

adba

Namit沙玛

感谢你的投稿。这对我的问题很有效。

然而,我注意到,对于约束优化问题,约束函数的评估只发生在一个MATLAB会话中(即。顺序而不是并行),而目标函数的评估是并行进行的(即。在多个MATLAB会话上)。
有什么方法可以并行化约束函数的求值吗?(因为我的约束函数和目标函数的计算成本一样高)

雅各布·西弗斯

我对这个代码有多满意,怎么说都不为过。也就是说,我不得不针对我的特定问题做了一些相对简单的修改,我觉得其中一些可能会在未来的版本中添加:
1)我添加了一个输入参数DEParams.infoOutput,如果设置为0,将抑制所有的视觉输出。这对于经过初始测试阶段的串行应用程序很方便。我自己运行的代码非常多的情况下,我喜欢屏幕留下更一般的输出,如进度报告和估计时间,等等。
2)添加参数DEParams。saveHistoryFilename允许用户将历史记录保存到特定路径。同样,这对于想要统计算法性能的串行应用程序很有用。
3)我已经添加了一个参数deparams.maxitablebest,它定义了具有稳定“最佳解决方案”的允许迭代的数量。那是:如果对于X迭代,解决方案已经稳定,终止优化。
4)最后,也许是最重要的,我必须添加对向量化函数的支持。金宝app也就是说:在当前代码中,对NP成员的求值是在for循环中完成的。对于可以向量化的函数(即:使用所有NP成员同时调用函数,而不是顺序调用),可以显著减少计算时间。在我的例子中,当使用向量化函数计算时,计算时间相对于之前下降到约60%。金宝app应该添加支持,以便用户可以根据问题的类型在顺序应用程序和向量化应用程序之间进行切换。

金立群

我在想这些天该怎么用这个软件包,我和作者发过几封邮件。但仍然有两个问题。

第一个是:在演示文件中,它有以下代码:

%设置时间
DEParams。麦克斯特= 20;
DEParams。maxtime = 30;%在几秒钟内
DEParams。maxclock = [];

为DE设置时间参数(maxiter和maxtime)的正确方法是什么?或者这背后的理论是什么?

第二个问题是:如何在集群(基于Linux)上使用这个包?我可以访问一个集群,但必须使用job = batch(......)从我的本地笔记本或桌面的Matlab中提交作业到集群。

如何在集群上打开尽可能多的matlab会话,使用job = batch(......)?

希望能听到一些反馈!

谢谢!

Pijian Cheng.

百分度

嗨,Markus,我可以询问如果此算法如果多目标优化有效?到目前为止,似乎它只能最大化单个输出的函数。

保罗布兰科

嗨马克,谢谢你的回应。我很遗憾闯入,但我确实有另一个问题。<http://www-optima.amp.i.kyoto-u.ac.jp/member/student/hedar/Hedar_files/TestGO_files/Page506.htm>。我用了你指向我的约束函数。我定义了矩阵AIN(尺寸9x13)和向量仓(维度9x1)写入函数返回值:有效所有(ain * x <= bin)。然而,最佳参数从预期的结果中叠加大量。问题具有硬边界,以及线性不等式约束(其中9个精确)。我希望你能简要介绍一下你的文件中问题的正确制定,因为我怀疑我的约束是问题的核心。

保罗布兰科

你好,Markus,你的算法允许包含线性约束吗?我正在尝试优化一个密度演化的实例,参数必须加起来为1。此外,参数的线性组合必须产生给定的速率。你们有类似于Matlab全局优化工具箱提供的工具吗还是说我只需要处理参数,考虑线性约束?

对于那些买不起工具箱的人来说,这是非常有用的工具。

Behnam seyedi

嗨,亲爱的Markus Buehren
我只是想问关于简单的差分进化算法(单一目标),我如何使用你的代码为这个提议?

雅各布·西弗斯

我对这一提议非常满意。我可能误解了一些东西,但是如果函数在用户定义的阈值内进行了优化,难道不可能在maxiter之前停止优化吗?目前,我只调优maxiter以达到适当的结果,但我怀疑,当固定的maxiter不足(或太多或太少)时,我将失去大量的处理时间和准确性。
干杯

史蒂文·克罗克

这是一个很棒的方法和实现,我经常使用,而且总是成功的。如果我有一个“特性请求”,那么可以选择通过读取optimResult文件并从该文件中的当前填充开始重新启动之前的优化。我偶尔会因为一些与差异进化无关的原因而导致问题提前终止。如果能在我停止的地方继续这些问题就好了。

vijay潘迪特

亲爱的先生,
我使用这个技术来进行优化。你能帮帮我吗我有一大堆问题要处理

弗雷德里克-施

AfanSveta

乔·海斯

非常有用的工具。我也很喜欢并行实现!

Erdal Bizkevelci

乔Ajay

嗨,Markus,它能解决离散优化问题吗?如果没有,就没有解决离散问题的差分进化求解器

非常感谢!

mklcst mklcst

嗨,我需要在objectfunction中调用一个变量,我需要调用它以便将它传递给函数?

马提亚Thul

约翰

在哪里可以找到多目标版本的差分演进算法?

谢谢

以Daems

威廉张

很好,谢谢

Mahmud iwan.

这是一个优秀的代码..
但是,我想知道如何使用此代码进行约束优化问题(不等式约束)。??它在演示中给出了此类问题,但代码需要初始值不违反约束。在真实的实践中,我们不需要知道初始值是否违反它或不违反它。请给出任何初始值.. Right?... PLS,启发!谢谢,,

ardian mohib

谢谢你的分享,马库斯,但你能告诉我为什么当我运行我的电脑代码,代码总是错误。还有一个问题,你能帮我解释一下差分进化算法吗?我是一名对差分进化算法感兴趣的学生,希望用差分进化算法来解决库存供应链的优化问题。
谢谢b4

RMS Danaraj

非常好的算法,我用它来解决三个非线性优化问题,我会马上上传到文件交换中。非常感谢。

詹姆斯·普林

詹姆斯·普林

我通常懒得给代码和提交进行评级,但这是一个例外。非常小的问题:我希望有一个演示文件包含了外部向量/矩阵的使用。除此之外,这是一段非常简洁和可用(更重要的是,非常有用)的代码。谢谢你马库斯。

saradha井斜

你好,
基于上面的评论im在使用代码贴买markus。我一直在研究遗传算法和优化工具箱,我的问题烷基化。微分进化can also be applied to this prob but im not sure of how to handle the code. So could u plz give insights on how to work on it. i ve been using matlab-GA only n am a new user so i request to plz help me in dis regard.Im highly interested in workin on dis.

Olivier Desmaison.

拆开包装完成。
我们的计划是这样的:à修图。我将用modèles éléments的重新定义和我们的功能。
布拉沃

Olivier Desmaison.

马库斯Buehren

谢谢你指着出来,斯科特。我已经纠正了链接。

斯科特

马库斯,

我认为Andrew Koh的观点是,出于某种原因,")"是你摘要中URL的一部分,而不是在Andrew的URL中,所以你的URL不会到达Storn的网站,但Andrew的会。

斯科特

STTAR WDAA

非常感谢

Hom Gharti

感谢非常非常有用的代码。我想把这个代码应用到4-D, 3个空间维度和1个时间维度。我得到了错误'error in bestmem ~= lastbestmem',当我检查时,显然这两个向量有不同的长度,然后我更改了parGridVector = cell2mat(paramDefCell(:,3));

parGridVector = cell2mat (paramDefCell (:, 4));
代码似乎运行良好。我做得对吗?

非常感谢,

詹姆斯勇

我用过的最好的优化器之一。Markus的快速支持金宝app是无价的,非常感谢。一个了不起的包。直接实现,灵活,并提供结果!

大卫•布朗

这个包是难以置信的强大。此外,Markus总是可以回答关于如何正确使用它的大量问题。他甚至会以闪电般的速度修复我发现的小毛病。这东西能把难题分解成小块。

马库斯Buehren

正如它在描述中写入的那样,恰好代码用作核心算法!但是,此包提供了远远超过核心算法。

安德鲁KOH

我认为更好的DE代码出现在

http://www.icsi.berkeley.edu/~storn/code.html

马塞洛P。

你好Markues,这是一个伟大的提交,感谢分享。

我认为它只是缺少关于方法的文档,而不是代码。例如,您使用的是哪种算法?你是从书上还是报纸上得到的?如果有,能否提供参考?

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

启发:ogive优化工具箱

社区寻宝

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

开始狩猎!