在两个二维数组之间执行交叉 (JAVA)

Perform Crossover between two 2D arrays (JAVA)

我正在尝试制作一种遗传算法来优化座位问题,在这个问题中,人们对自己想坐在谁旁边有偏好。我遇到的问题是交叉阶段。我有两个人口成员,我想繁殖并生产一个 child 成员。通常,一个人会从一个 parent 中获取一个 'gene',并从另一个中获取一个不同的基因。问题是在 table.

座位的情况下的安置问题

这是一个随机生成的例子:

i   j   Child Value  Mother Value    Father Value
0   0                  P08             P00
0   1                  P11             P06
0   2                  P02             P05
0   3                  P12             P09  
0   4                  P07             P04
1   0                  P09             P10  
1   1                  P01             P01
1   2                  P03             P13  
1   3                  P06             P03  
1   4                  P13             P11  
2   0                  P00             P12  
2   1                  P10             P07  
2   2                  P04             P02  
2   3                  P05             P08      
2   4                  P14             P14  

我想生成一个 child,它既具有 parent 的特征,又没有重复的 objects(PXX 不应在 child 中出现两次).

i : 代表 Table 号。这里有 3 tables j :表示座位号。这里有5个座位 共15人

有什么好的方法吗?如果我的解释令人困惑,请见谅。 注意我不能使用任何遗传算法库。

对于这类问题,解决方案通常是"repair" child。您需要一个修复函数,它将采用不可行的 child(一个有重复项)并使其可行(删除重复项并用缺失值替换它们)。

对于您的特定情况,解决此问题的另一种方法是从 parents 中取出所有 non-overlapping table 并将它们放入 child,并用其余人填充 child 中缺失的 table(例如,在您的示例中,从母亲那里取 table 1,从父亲那里取 table 2——他们有没有共同点——将其余人放在 table 0).