DE Solver是一种基于人口的启发式优化方法,旨在找到一组最优的决策变量,从而最大限度地降低给定适应度函数。DE Solver使用启发式策略在问题空间中执行随机搜索。
1. 设置
首先,解压DE Solver,DE解算器的根目录应该是这样的:
图1。包含在DE Solver包中的文件。
解算器中包含五个文件:
b. [DE.m]: DE 算法。
c. [decisionVariables.m]:指定给定问题的决定变量的文件。
c. [constaintHandler.m]: 给定问题的约束处理逻辑文件。
d. [fitnessEvaluator.m]: 给定问题的客观功能文件。
e. [main.m]: 运行解算器的主要文件。
可将DE Solver文件夹的路径添加到Matlab的路径中:单击"主页"菜单中的"设置路径"按钮,然后选择"添加文件夹"在弹出式对话中添加DE Solver的路径。
(a)
(b)
图 2。 将DE Solver的路径添加到 Matlab。
DE Solver中 4 个文件的使用将在本文档的其余部分中解释。
2. 概述
为了解决优化问题,DE 将生成一个个体群,其中每个个体被编码为D维矢量,代表给定问题的潜在解决方案(其中 D 是给定问题的维度数)。然后,DE 反复评估他们的健身值(即客观功能值),以推动进化。除了决策变量的边界限制外,实际问题可能有 1 个或多个限制。因此,在每一代的进化过程中,在评估个人的健身价值之前,DE需要首先处理每个人的制约因素,要么使其变得可行,要么将其标记为"不可行"。
由于不同的实际问题往往有不同的形式的约束和健身评估逻辑,解决者的用户需要在不同的功能中实现自己的约束处理和健身评估逻辑。然后,DE 将在其演进过程中自动调用这些功能(在软件工程领域,这称为"回调")。
总之,要使用DE解算器来解决问题,您需要做4件事:(a) 指定决策变量的数量、边界和数据类型("decisionVariables.m"):(b) 给出候选人解决方案,具体说明如何计算其fitness value("fitnessEvaluator.m"):(c) 如果您的问题包括 1 个或多个限制,请指定如何处理它们("constaintHandler.m"):和 (c) 调用 DE 算法来解决您的问题("main.m")。
DE 解算器中文件的关系显示在 图 3 中。
3. 运行示例
在此教程的以下部分,我们将使用一个简单的约束,混合整数优化问题作为一个例子,学习如何使用DE解算器。
3.1. 问题配方
测试问题假定有 10 个变量,其中前 5 个变量是 [0, 100] 范围内的连续变量;第6、7和8变量是[-10、10]范围内的整数;第9、10变量是二进制变量。问题的目的是
图 3。DE解算器中文件的相互关系。
在满足约束的同时,最大限度地减少变量的正方形的总和。这个问题可以数学上如下:
3.2. 指定 DE 解算器中的决定变量
要解决优化问题,首先需要指定 DE 解算器中的决策变量,包括:
- 决策变量的数量(换句话说,问题的维度)。
- 决策变量的价值边界。对于 D 维问题,这表示为具有 2 行和 D 列的矩阵。在第一行中,条目(1,d)指定了 dth 决策变量的下值边界(d=1:D);在第二行中,条目 (2,d)指定了 dth 决策变量的上值边界。
- 决策变量的数据类型。每个 决策变量均为 3 种数据类型之一:(i)连续值(即数字值):(二) 二进制值(即 0 或 1);和(三)整数值。DE 解算器分别使用 0、1 和 2 表示这 3 种类型。
以上3个属性在"decisionVariables()"函数中指定,即在"decisionVariables.m"文件中。该函数不接受输入参数,并将上述 3 个属性作为输出返回:
function [dimension, boundaries, dataTypes] = decisionVariables()
例如,它们设置为:
3.2. 在 DE解算器中指定约束处理逻辑
其次,您需要在"约束手"功能中实现自己的约束处理逻辑,该函数位于"约束手.m"文件中。该函数具有以下原型:
function [newInd, newUserObj] = constraintHandle(ind, userObj)
输入参数:
ind: 候选人个人(即候选人解决方案),该解决方案将自动通过 DE 算法:
约束处理功能应将更新的个人返回到DE算法:
newInd:更新的个人后,可能的调整受到限制。
例如,问题共有 4 个限制(Eqs. (2)-(5)).但其中3个(Eqs.(3)-5))是决策变量的价值边界约束,在"决策不变性.m"文件中已处理。仅需要额外处理 1 个约束(Eq. (2))。
如何处理约束?
基本上有两种方法来处理约束。最简单的方法是,如果检查个人是否违反约束,只需告诉 DE 将其标记为"不可行",即可忽略它。这是通过将newInd的产值设置为"-1"来实现的:
newInd = -1:
例如,如果我们使用这种"检查和放弃"策略来解决约束 (2), 则约束汉德勒.m 文件应写如下:
处理约束的第二种方法是手动调整策略。即,如果检查个人是否违反约束,则手动调整以满足约束。例如,我们需要限制个人的 1 和 3维值之和等于 80。因此,我们可以使用以下调整策略:
请注意,约束处理逻辑的设计可能是一项非平凡的任务,尤其是对于具有许多约束的优化问题。"检查和放弃"策略易于编码,但它可能会使大量候选人被标记为不可行,并使DE算法难以找到可行的解决方案。 手动调整策略可以使个人成为可行的,但它可能需要非平凡的编码工作。对于一些具有多种复杂约束的问题,梳理这两种策略并将其应用于不同的约束可能是上帝 的选择。
3.3.指定目标功能
在每一代的进化过程中,DE 将调用每个人的约束手()功能。对于标记为不可行的个人,DE 不计算其客观函数值。对于可行的个体,DE在"fitness.m"档案中调用健身功能来评价个体的客观功能价值。应遵循以下原型的健身评估:
function [fitnessValue] = fitness(ind)
输入参数:
ind:候选人个人(即候选人解决方案),该解决方案将自动通过DE算法:
输出:
a.fitnessValue:个人的客观功能价值:
例如,函数如下。
3.4. 运行DE算法
最后一步是设置DE的控制参数并运行算法以获取结果。这是在"main.m"文件中完成的。 首先,调用决策变量规范功能:
其次,将人口规模和最大生成时间设置为您喜欢的任何积极值:
第三,指定 DE 控制参数的值:
最后,调用DE算法进行优化:
优化后,DE 返回 3 个结果:
a. bestFitness:最终最佳解决方案的客观功能值。
b. bestInd:DE 找到的最终最佳解决方案。
c.historicalFitness:具有1× G 大小的列向量 ,其中 G 是最大生成时间。元素 [1, g]是最佳解决方案的客观函数值,直到 g第1 代找到。
d.historicalPopulation:包含 G属性的结构,其中 G 是最大生成时间。 gth元素是DE在第一代产生的整个人口的副本。
通过运行算法来解决示例问题,DE 找到的最佳解决方案是 [40, 0, 40, 0, 0, 0, 0, 0, 0, 0],目标函数值为 3200。 图4绘制了历史的适合度,称为收敛曲线。可以看到,随着进化的进行,DE 不断更新它找到的最佳解决方案,直到大约第 30 代。
图 4。 使用DE来解决示例问题的收敛曲线。