从我到目前为止看到的它们看起来非常相似.差分进化使用浮点数代替,解决方案称为向量?我不太清楚这意味着什么.如果有人可以提供一些关于两者的优点和缺点的概述.
artificial-intelligence genetic-algorithm differential-evolution
我为我正在做的边项目实现了差分进化算法.因为交叉步骤似乎涉及很多参数选择(例如交叉概率),所以我决定跳过它并仅使用变异.该方法似乎工作正常,但我不确定如果我介绍交叉,我是否会获得更好的性能.
主要问题:将差异引入差异进化的动机是什么?您能提供一个玩具示例,其中介绍交叉超出纯变异吗?
我的直觉是,交叉会在二维中产生类似下面的内容.假设我们有两个父矢量(红色).均匀交叉可以在其中一个蓝点处产生新的试验向量.

我不确定为什么这种探索会被认为是有益的.事实上,如果高适应度解决方案遵循一些线性趋势,这似乎会使性能变差.在下图中,假设红点是当前的总体,最佳解决方案是在右下角.人口正在山谷中行进,使得右上角和左下角产生不良解决方案.左上角产生"好"但不是最理想的解决方案.注意均匀交叉如何产生与改进方向正交的试验(蓝色).我使用了1的交叉概率和忽略的变异来说明我的观点(见代码).我想这种情况可能会在优化问题中经常出现,但可能会误解某些东西.

注意:在上面的例子中,我隐含地假设群体在这个空间中被随机初始化(均匀),并且已经开始收敛到中心谷(正左上到右下)的正确解.
这个玩具示例是凸的,因此差分演化甚至不是合适的技术.然而,如果这个主题嵌入在多模态健身景观中,那么交叉似乎可能是有害的.虽然交叉确实支持探索,这可能是有益的,但我不确定为什么人们会选择在这个特定的方向上进行探索.
以上示例的R代码:
N = 50
x1 <- rnorm(N,mean=2,sd=0.5)
x2 <- -x1+4+rnorm(N,mean=0,sd=0.1)
plot(x1,x2,pch=21,col='red',bg='red',ylim=c(0,4),xlim=c(0,4))
x1_cx = list(rep(0, 50))
x2_cx = list(rep(0, 50))
for (i in 0:N) {
x1_cx[i] <- x1[i]
x2_cx[i] <- x2[sample(1:N,1)]
}
points(x1_cx,x2_cx,pch=4,col='blue',lwd=4)
Run Code Online (Sandbox Code Playgroud)
后续问题:如果交叉在某些情况下是有益的,是否有合理的方法来a)确定您的特定问题是否会受益于交叉,以及b)如何调整交叉参数以优化算法?
一个相关的stackoverflow问题(我正在寻找更具体的东西,例如玩具示例):在差分进化算法中跨越的重要性是什么?
一个类似的问题,但不是特定的差异演化:遗传算法中的交叉效率
optimization r evolutionary-algorithm differential-evolution
问题是,我试图为我的目的设计拟合程序,并希望使用scipy的差分进化算法作为初始值的一般估计,然后将用于LM算法以更好地拟合.我想用DE最小化的函数是分析定义的非线性函数和一些实验值之间的最小平方.我卡住的地方是功能设计.正如它在scipy引用中所述:" 函数必须采用 f(x,*args)形式,其中x是1-D数组形式的参数,args是完全指定所需的任何其他固定参数的元组功能 "
有一个丑陋的代码示例,我为了说明目的而编写:
def func(x, *args):
"""args[0] = x
args[1] = y"""
result = 0
for i in range(len(args[0][0])):
result += (x[0]*(args[0][0][i]**2) + x[1]*(args[0][0][i]) + x[2] - args[0][1][i])**2
return result**0.5
if __name__ == '__main__':
bounds = [(1.5, 0.5), (-0.3, 0.3), (0.1, -0.1)]
x = [0,1,2,3,4]
y = [i**2 for i in x]
args = (x, y)
result = differential_evolution(func, bounds, args=args)
print(func(bounds, args))
Run Code Online (Sandbox Code Playgroud)
我想将原始数据作为元组提供给函数,但似乎不是它的假设,因为解释器对函数不满意.问题应该很容易解决,但我真的很沮丧,所以建议将非常感激.
我正在尝试使用 scipy.optimize. Differential_evolution 运行优化。该代码要求 x 中每个变量的边界。但我想要一个解决方案,其中 x 的一部分必须是整数,而其他部分可以作为浮点数自由变化。我的代码的相关部分看起来像
bounds = [(0,3),(0,3),(0,3),???,???]
result = differential_evolution(func, bounds)
Run Code Online (Sandbox Code Playgroud)
我该如何替换 ??? 来强制这些变量为给定范围内的整数?
python mathematical-optimization scipy differential-evolution
在差分进化算法中用于优化问题。涉及三个进化过程,即突变穿越和选择
我只是一个初学者,但是我尝试过删除交叉过程,并且原始算法没有明显的不同结果。
那么在差分进化算法中交叉的重要性是什么?
我正在尝试对生化过程进行建模,并将我的问题构建为一个优化问题,我使用differential_evolutionscipy解决 了这个问题。
到目前为止,一切都很好,我对具有 15-19 个参数的简化模型的实现感到非常满意。
我扩展了模型,现在有 32 个参数,时间太长了。并非完全出乎意料,但仍然是一个问题,因此是一个问题。
我已经看到:
- 一个几乎相同的 R 并行差分进化问题
- 以及一个关于该主题 的 github 问题https://github.com/scipy/scipy/issues/4864
但它想留在 python 中(模型在 python 管道内),并且拉取请求尚未导致并正式接受解决方案,尽管已经提出了一些选项。
此外,我无法并行化要优化的函数中的代码,因为这是一系列顺序计算,每个计算都需要上一步的结果。理想的选择是有一些东西可以并行评估一些个体并将它们返回到总体中。
总结:
- scipy 中是否有任何选项允许我愚蠢地忽略的差异进化的并行化?(理想的解决方案)
- 是否有关于 scipy 中的替代算法的建议,该算法要么(方式)串行更快或可能并行化?
- 有没有其他好的软件包可以提供并行化的差分进化功能?或者其他适用的优化方法?
- 健全性检查:我是否用 32 个参数重载了 DE,我需要从根本上改变方法?
PS
我是一名生物学家,正式的数学/统计并不是我的强项,任何公式到英语的翻译都会非常感激:)
PPS
作为一个极端的选择,我可以尝试迁移到 R,但我无法编写 C/C++ 或其他语言。
python parallel-processing mathematical-optimization scipy differential-evolution
我正在尝试使用 scipy.optimize 中的different_evolution 找到函数的全局最小值。如 scipy 参考指南中所述,我应该在选项中设置:update='deferred',workers=number of cores
但是,当我运行代码时,它会冻结并且什么也不做。我该如何解决这个问题,或者有没有更好的方法来并行化全局优化器?
以下是我的代码:
scipy.optimize.differential_evolution(objective, bnds, args=(),
strategy='best1bin', maxiter=1e6,
popsize=15, tol=0.01, mutation=(0.5, 1),
recombination=0.7, seed=None,
callback=None, disp=False, polish=True,
init='latinhypercube', atol=0,
updating='deferred',workers=2)
Run Code Online (Sandbox Code Playgroud) 我在使用时不断收到此错误:ES calculation produces unreliable result (inverse risk) for column: 1消息DEoptim。也许我忽略了一些事情,所以我需要一些帮助来解决这个问题。我在网上搜索过但似乎找不到答案。
我有一个xts名为 的对象RETS,包含 127 行和 4 列,其中有日志返回:
library("quantmod")
library("PerformanceAnalytics")
library("DEoptim")
e <- new.env()
getSymbols("SPY;QCOR;CLNT;SRNE", from="2007-06-30", to="2007-12-31", env=e)
# combine the adjusted close values in one xts object
dataset1 <- do.call(merge, eapply(e, Ad))
# calculate returns
RETS <- na.omit(CalculateReturns(dataset1, method="log"))
# objective function
optRR.gt3 <- function(x, ret) {
retu <- ret %*% x
obj <- -CVaR(as.ts(-retu))/CVaR(as.ts(retu))
obj <- ifelse(obj>0,-obj,obj)
weight.penalty <- 100*(1-sum(x))^2
small.weight.penalty <- …Run Code Online (Sandbox Code Playgroud) 解释差分进化基本算法的所有更新.我无法找到此算法的所有版本.解释该算法的所有版本作为调查,我不清楚理解维基百科中给出的该算法背后的理论.维基百科也只定义差分进化的基本算法,但我想要对该算法进行所有更新