遗传算法 - 交叉多维数组

Genetic Algo - Crossing multidimensional arrays

我正在处理GA的这个问题

我曾经通过简单地将数组分成两半并从每个数组的一半中提取新基因来进行常规的一维数组交叉。

但现在我使用的是多维数组。

如何做一个交叉多维数组?

例如:

array1 = [
    [[1, 2],
     [3, 4]],
    [[5, 6],
     [7, 8]]
]

array2 = [
    [[10, 9],
     [8, 7]],
    [[6, 5],
     [4, 3]]
]


Desired_array1 = [
    [[1, 9],
     [3, 7]],
    [[5, 5],
     [7, 3]]
]

Desired_array2 = [
    [[10, 2],
     [8, 4]],
    [[6, 6],
     [4, 8]]
]

当然这种情况最内层数组大小是2个元素,但可以是任意大小,交叉点可以是任意点,不限制其他维度的其他数组的交叉点.

我的想法是制作一个具有相同结构的空数组,并用每个 'chromosome' 填充元素。完全避免 'split' 。但这可能会使执行遗传算法的速度慢很多。

另一个想法是展平数组,进行正常的一维交叉,然后将展平的数组转换为原始结构。

那么,我该怎么办?我似乎没有在 GA 中使用多维数组,我这样做是不是做错了?我应该将输入更改为常规的一维数组并进行简单的交叉吗?

顺便说一句,GA的输入来自神经网络,权重存储在多维数组中,因此数组第一维的第一个元素是第一层的权重,并且最后一个元素是最后一层的权重,第二个维度是每个节点的权重等等。

所有的想法都很好,你的表现也可以。如果 2D 更适合您,则无需使用 1D 数组作为表示。哪种交叉运算符最合适实际上取决于您的矩阵代表什么。总的来说,谁也说不准哪个更合适,这个要看问题了。

例如,您可以根据以任意角度和位置将矩阵分成两部分的直线进行交叉... 您将生成从 0,0 开始的向量的随机参数 dx、dy(双精度),并且可能还沿矩形的边缘(顶部或左侧)移动它。该线会将您的矩阵分为两部分 - 一部分的等位基因来自第一个亲本,另一部分的等位基因来自另一个亲本。

为了简化这一点,您可以只使用与矩形边框平行的线。或者您可以创建自己的运算符,或者根据需要创建实现方法,这完全取决于基因型的哪些部分可以保持在一起。

没有标准的交叉方式。据我所知,关于一种交叉的收敛率 w.r.t 没有明确的结果。另一个或 w.r.t。没有交叉(有时根本不使用交叉,在这些情况下进化仅基于突变)。
由于交叉而提高遗传算法的收敛率是研究的问题。然而,到现在为止,猜测你不能确定你的选择是最好的(你也可以尝试与不同类型的交叉进行比较,但这不会导致一般结果)。然而,遗传算法的强项不是速度,而是适应不同问题的能力,所以我不会太担心性能,只要结果令人满意(除非提高性能实际上是你的目标):)

在你的情况下,因为你的基因代表了神经网络的权重,你可以应用交叉 "layer per layer"(乍一看,应该是 运行 几个并行的 GA,一个对于你的网络的每一层)。不能保证这会比只对整个多维数组应用一个大交叉更好(即使它看起来更合理,因为你正在对 "comparable" 基因应用交叉......否则你可能会让你的算法切换权重最后一层具有第一层的权重,我不明白为什么这会提高整体性能)。

我不会对已经存在的答案添加任何内容,但出于一些奇怪的巧合,我已经用 c# 开发了一个程序来执行您正在尝试执行的操作(在我的情况下,我不使用多维输入,但我在多维权重矩阵上应用交叉)。 该项目已开源here

您可以从 here

下载二进制文件

并且我已经使用 this 纸进行交叉。