微分进化2025年6月18日 | 阅读11分钟 引言差分进化算法是一种启发式算法,旨在解决连续变量的非线性、不可微函数的全局优化问题。 与其他进化计算领域算法类似,差分进化算法在许多方面与遗传算法和进化策略等方法有共同之处。它首先创建一个初始的可能解集;这些解通过变异和选择进行演化。该算法通过最小化目标函数值来保留最优的候选解。 差分进化算法的主要优势之一是能够解决具有非线性、不可微和/或多变量目标函数的problem。此外,它使用的控制参数较少,易于实现,并且比许多其他广泛使用的优化方法更有用。 差分进化DE是一种迭代随机优化技术,用于在连续值参数的非线性、不可微空间中搜索全局最优解。 为了使算法实用,它应该满足以下标准:
算法概述DE以实数(也称为基因组或染色体)的决策向量群体开始,这些向量是随机生成的。这些向量是多参数矢量化优化问题的解的候选。该过程涉及三个主要操作:
这些操作会 successive 执行,直到达到停止条件,例如固定的评估次数。 变异策略 DE中的变异策略遵循DE/x/y/z的表示法
例子包括
参数和实用性 DE只需要三个关键参数: 种群大小 (NP) 另一个参数 F,一个范围在 [0, 2] 之间的缩放因子,用于调节变异过程中的差分变化。 交叉率 (CR) 位于 [0, 1] 区间内,并根据经验证据选择。 因此,DE既可行又易于应用。随着时间的推移,出现了几种DE变体,详见《差分进化近期进展:最新调查》(2016)等研究。 有了这些理解,从头开始实现DE的任务就变得相当容易了。 差分进化算法的原始方法DE算法的大部分研究都围绕着创建候选解决方案的种群。这些解决方案表示为随机向量,我们从 [0, 1) 区间上的均匀分布中提取这些向量。 初始化步骤
缩放功能的改进是为了帮助候选解决方案稍微类似于定义的problem空间,以便DE算法能够有效地搜索解决方案空间。 将变异投入差分进化算法的运行对于DE算法初始化,会根据定义的边界来制定候选解决方案。第一个种群通过适应度函数进行评估,然后进行修改以获得最佳解决方案。 种群和目标函数初始化 关键点
接下来是交叉和选择阶段,以进一步提高候选解决方案的质量。 差分进化算法优化以下是差分进化(DE)算法的分步实现: 突变变异步骤通过对两个随机选择的种群基因型和一个第三基因型之间的加权向量差生成一个变异向量。 代码片段 边界检查 为了限制变异因子在其超出规定范围时,请使用剪切变异向量值的方法。 代码片段 交叉 通过将变异向量与目标向量进行交叉操作,根据均匀分布的随机变量和交叉率创建一个试探向量。 代码片段 选拔 取试探向量并减去目标向量,保留目标函数值较低的那个。 代码片段 整合 以下函数将DE算法的所有步骤结合在一起: 该函数包含了整个DE过程,并返回最佳解决方案以及问题相关的适应度。 代码片段 球函数上的差分进化算法此处提供的实现使用DE算法来解决球函数,这是一个基本的优化测试函数。以下是过程的细分: 球函数 目标函数定义为:f(x) = x1^2 + x2^2 它在点 (0,0) 处有一个唯一的全局优化解,对应的函数值为0。 差分进化步骤 初始化
突变
边界检查
交叉
选拔
迭代优化
代码 输出 Iteration: 0 f([[1.00344 0.17044]]) = 1.03594 Iteration: 1 f([[-0.42909 0.64404]]) = 0.59890 Iteration: 3 f([[0.64313 0.16389]]) = 0.44047 Iteration: 5 f([[ 0.11072 -0.18159]]) = 0.04523 Iteration: 9 f([[ 0.11413 -0.05922]]) = 0.01653 Iteration: 10 f([[0.06599 0.00535]]) = 0.00438 Iteration: 12 f([[0.04743 0.03815]]) = 0.00370 Iteration: 13 f([[0.02509 0.00535]]) = 0.00066 Iteration: 18 f([[ 0.01202 -0.00349]]) = 0.00016 Iteration: 21 f([[-0.00661 0.00765]]) = 0.00010 Iteration: 23 f([[0.00323 0.00459]]) = 0.00003 Iteration: 24 f([[-0.00173 0.00267]]) = 0.00001 Iteration: 26 f([[0.00201 0.00231]]) = 0.00001 Iteration: 27 f([[-0.00012 -0.00155]]) = 0.00000 Iteration: 29 f([[0.00095 0.00079]]) = 0.00000 Iteration: 30 f([[-1.2e-04 5.0e-05]]) = 0.00000 Iteration: 39 f([[1.e-05 1.e-05]]) = 0.00000 Iteration: 44 f([[-0.e+00 1.e-05]]) = 0.00000 Iteration: 48 f([[ 0. -0.]]) = 0.00000 Iteration: 53 f([[-0. -0.]]) = 0.00000 Iteration: 56 f([[0. 0.]]) = 0.00000 Iteration: 59 f([[-0. 0.]]) = 0.00000 Iteration: 63 f([[-0. 0.]]) = 0.00000 Iteration: 65 f([[ 0. -0.]]) = 0.00000 Iteration: 66 f([[ 0. -0.]]) = 0.00000 Iteration: 68 f([[0. 0.]]) = 0.00000 Iteration: 69 f([[ 0. -0.]]) = 0.00000 Iteration: 71 f([[0. 0.]]) = 0.00000 Iteration: 72 f([[-0. -0.]]) = 0.00000 Iteration: 76 f([[ 0. -0.]]) = 0.00000 Iteration: 78 f([[ 0. -0.]]) = 0.00000 Iteration: 79 f([[-0. -0.]]) = 0.00000 Iteration: 80 f([[-0. -0.]]) = 0.00000 Iteration: 83 f([[-0. 0.]]) = 0.00000 Iteration: 84 f([[ 0. -0.]]) = 0.00000 Iteration: 86 f([[-0. 0.]]) = 0.00000 Iteration: 87 f([[0. 0.]]) = 0.00000 Iteration: 90 f([[0. 0.]]) = 0.00000 Iteration: 92 f([[ 0. -0.]]) = 0.00000 Iteration: 93 f([[-0. 0.]]) = 0.00000 Iteration: 98 f([[-0. 0.]]) = 0.00000 Solution: f([[-0. 0.]]) = 0.00000 二维球目标函数的差分进化搜索代码 输出 Iteration: 1 f([[-0.22544 -0.38483]]) = 0.19892 Iteration: 5 f([[-0.13006 0.12466]]) = 0.03246 Iteration: 10 f([[-0.03427 0.08677]]) = 0.00870 Iteration: 13 f([[-0.00201 -0.01124]]) = 0.00013 Iteration: 17 f([[-0.0023 -0.00526]]) = 0.00003 Iteration: 21 f([[0.00123 0.00462]]) = 0.00002 Iteration: 22 f([[ 1.00e-05 -3.49e-03]]) = 0.00001 Iteration: 24 f([[ 0.00181 -0.00273]]) = 0.00001 Iteration: 25 f([[0.00028 0.00132]]) = 0.00000 Iteration: 26 f([[ 0.00028 -0.00095]]) = 0.00000 Iteration: 27 f([[ 1.e-05 -4.e-04]]) = 0.00000 Iteration: 28 f([[ 0.00011 -0.00015]]) = 0.00000 Iteration: 29 f([[1.e-05 4.e-05]]) = 0.00000 Iteration: 36 f([[2.e-05 3.e-05]]) = 0.00000 Iteration: 38 f([[-2.e-05 -1.e-05]]) = 0.00000 Iteration: 41 f([[0. 0.]]) = 0.00000 Iteration: 42 f([[-0. 0.]]) = 0.00000 Iteration: 43 f([[-0. 0.]]) = 0.00000 Iteration: 48 f([[-0. 0.]]) = 0.00000 Iteration: 52 f([[-0. 0.]]) = 0.00000 Iteration: 54 f([[ 0. -0.]]) = 0.00000 Iteration: 57 f([[0. 0.]]) = 0.00000 Iteration: 58 f([[0. 0.]]) = 0.00000 Iteration: 59 f([[-0. 0.]]) = 0.00000 Iteration: 60 f([[ 0. -0.]]) = 0.00000 Iteration: 63 f([[0. 0.]]) = 0.00000 Iteration: 66 f([[ 0. -0.]]) = 0.00000 Iteration: 67 f([[-0. 0.]]) = 0.00000 Iteration: 70 f([[ 0. -0.]]) = 0.00000 Iteration: 75 f([[ 0. -0.]]) = 0.00000 Iteration: 76 f([[ 0. -0.]]) = 0.00000 Iteration: 81 f([[-0. -0.]]) = 0.00000 Iteration: 82 f([[0. 0.]]) = 0.00000 Iteration: 83 f([[0. 0.]]) = 0.00000 Iteration: 85 f([[-0. 0.]]) = 0.00000 Iteration: 86 f([[-0. -0.]]) = 0.00000 Iteration: 88 f([[-0. -0.]]) = 0.00000 Iteration: 98 f([[ 0. -0.]]) = 0.00000 Solution: f([[ 0. -0.]]) = 0.00000 ![]() 结论DE是非线性/不可微和多模态目标函数优化的一种有效方法。它易于理解,不复杂,控制参数少,且不需要太多控制。DE具有一个初始的解向量种群,并在分步优化技术中使用变异、交叉和选择。 变异为种群带来变化;交叉允许在解空间中进行搜索;选择只允许最优解向前传递。DE易于实现,可针对各种问题进行优化,并允许并行解决方案以快速计算。由于种群大小、缩放因子、交叉率等参数,该方法收敛于全局最优点/解决方案,在理论和实践问题中都表现出色。 下一主题机器学习的重要性 |
我们请求您订阅我们的新闻通讯以获取最新更新。