- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我为我正在做的一个业余项目实现了差分进化算法。因为交叉步骤似乎涉及很多参数选择(例如交叉概率),所以我决定跳过它并只使用突变。该方法似乎工作正常,但我不确定如果引入交叉是否会获得更好的性能。
主要问题:将交叉引入差异进化的动机是什么?您能否提供一个简单的示例,其中引入交叉的性能优于纯突变?
我的直觉是,交叉会在二维中产生如下所示的结果。说我们有两个父向量(红色)。均匀交叉可以在其中一个蓝点处产生一个新的试验向量。
我不确定为什么这种探索会是有益的。事实上,如果高适应度解决方案遵循某种线性趋势,这似乎可能会使性能变得更糟。下图中,红点是当前种群,最优解位于右下角。人口正在沿着山谷移动,因此右上角和左下角会产生糟糕的解决方案。左上角产生“还可以”但不是最优的解决方案。请注意均匀交叉如何产生与改进方向正交的试验(蓝色)。我使用了 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)
后续问题:如果交叉在某些情况下是有益的,是否有明智的方法来 a) 确定您的特定问题是否会从交叉中受益,以及 b) 如何调整交叉参数优化算法?
相关的 stackoverflow 问题(我正在寻找更具体的内容,例如玩具示例):what is the importance of crossing over in Differential Evolution Algorithm?
类似的问题,但不特定于差异进化:Efficiency of crossover in genetic algorithms
最佳答案
我不是特别熟悉 DE 算法的细节,但总的来说,交叉点是,如果你有两个非常不同的个体,并且适应度很高,那么它会产生一个介于它们之间的后代,而不会与任何一个特别相似。突变仅探索每个个体的局部邻域,而不考虑群体的其余部分。如果您将基因组视为某些高维向量空间中的点,那么突变就会向随机方向移动。因此,突变需要采取小步骤,因为如果你从一个明显优于随机位置的位置开始,那么朝随机方向迈出一大步几乎肯定会让事情变得更糟,因为它本质上只是将熵引入进化的基因组中。您可以将交叉视为从 parent 一方迈向另一方的一步。由于另一方 parent 也比随机的更好,因此更有希望朝这个方向迈出更远的一步。这样可以更快地探索健身领域有前途的部分。
在真实的生物有机体中,基因组通常以这样的方式组织:相互依赖的基因在同一条染色体上靠近在一起。这意味着交叉不太可能破坏协同基因组合。真正的进化实际上会移动基因来实现这一点(尽管这比单个基因的进化慢得多),有时基因组的高阶结构(DNA 的 3 维形状)会进化以防止特别敏感区域的交叉。这些机制很少在进化算法中建模,但如果您以一种将可能相互作用的基因彼此靠近的方式对基因组进行排序,您将从交叉中获得更多。
关于r - 交叉何时以及为何对差异进化有益?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21221005/
我想使用单个(交叉)编译器来编译不同 ARM 调用约定的代码:因为我总是想使用浮点和 NEON 指令,所以我只想选择硬浮点调用约定或软浮点(softfp)调用约定。 我的编译器默认为硬浮点,但它支持我
假设我正在构建一个依赖于两个库的 java 应用程序:A 和 B。A 和 B 都依赖于库 C。管理 A 和 B 使用相同版本的最佳方法是什么所以他们不冲突?我正在使用 Gradle。 最佳答案 从 G
我想在按钮的文本上添加图像。如果我将图像添加为按钮的背景,它就会添加到文本下方。预期结果作为图像添加。请帮忙 更新:我需要以编程方式执行此操作。 最佳答案 在 XML 中, * 在代码中
我已经开始使用 CSS3 制作动画了。 我尝试创建一个动画汉堡菜单,但结果有点难看。顶部和底部的条向右平移一点。所以旋转动画不是很流畅和正确。 这是结果 => 这是我的代码: /* HTML */
给定一个具有2条相交曲线的图像,如下图所示,我如何使用opencv或python检测和区分2条曲线? (所以我需要2条单独的曲线) 最佳答案 您可以扫描每一列,并从连接的零件中识别出簇。 伪算法: l
我正在尝试在 redhat 集群(x86_64 主机)上设置 cross-mingw。我没有 root 访问权限,并且可用的 mingw 二进制文件不起作用(坏 glibc 版本等)。我正在阅读本教程
我正在尝试在javaFX中开发一个游戏,当两个图像相交时,分数将被更新,并且障碍物将不可见。但不幸的是,在游戏中分数不断更新。 我想我无法在游戏中正确地使图像不可见。 以下是相关类的完整代码: pac
pikastar dot com 是网站,当向下滚动它然后在导航菜单展开固定位置时它 > 将穿过主 div。我该如何修复它。 #topNav.sticky { box-shadow: 0 10
我正在使用 Eclipse为 ARM 处理器交叉编译 g++ 项目。我在 Windows 环境中使用 yagarto 工具链。我对 C 项目没有问题,但是对于 C++,我一直收到错误: libc.a(
我想从两个哈希数组中获取并集/交集/差集,例如: array1 = [{:name =>'Guy1', :age => 45},{:name =>'Guy2', :age => 45}] array2
有没有办法在调用任何 Controller 操作之前执行一些代码? 我需要根据 get 参数的值设置 session 变量,而不考虑调用哪个 Controller 。 当然,一旦这个处理完成,请求需要
我刚开始使用 3D 网格,面向用于有限元分析。我想在立方体状矩阵中模拟 Material 的夹杂物(任何形状,但主要对球体和椭圆体感兴趣)。这些夹杂物不应彼此重合。 所以我想为python使用某种包,
我想知道以跨平台方式操作应用程序设置的最佳解决方案是什么。 在 iOS 中,我们可以在设置屏幕中更改应用程序外部的设置,但在 windows phone 和 android 中我们没有。 所以,我的想
var barcodeNum = ko.observable(""); VelocityMeetings.scan = function (params) { var errorMessage = k
这个问题在这里已经有了答案: Transforming data.frame in R (2 个答案) 关闭10 年前。 过去我问过一个关于如何create cross tables from a
我有两个共享同一个工厂的 Controller 。其中一个 Controller 正在更新工厂变量。其他人应该注意该变化并稍后显示。 我是这样尝试的: http://plnkr.co/edit/q1N
标题不好,但这是我发现的将我的问题与简单的表格交叉区分开来的方式,因为我之前的研究总是让我接触到这类主题。 我有几个表 - 为了简化起见,我们只用 3 个表来命名它们:A、B、C。我想将它们全部放在一
我需要做这样的事情(在 MySQL 中),我使用 UNION 的尝试直到现在才奏效。 理论上: SELECT * FROM tableA A JOIN tableB B ON A.tableAId =
注意:使用SDL 2.0,Cross header class问题 我在类之间进行交叉引用,主要是我的类初始化渲染器和我的纹理类引用渲染初始化。现在,我已经能够运行该程序,直到我开始放入纹理类,代码也
我有一个这样的字母数组 var letters = ["Y", "X", "A", "Y", "O", "H", "A", "O", "O"]; 我创建了一个循环来
我是一名优秀的程序员,十分优秀!