置换矩阵的交叉算法

时间:2016-01-19 14:28:49

标签: matrix combinations genetic-algorithm crossover

我正在开发一种遗传算法来找到点之间的最佳连接(最小化距离)。 让我们假设我们有两个点列表:

element.value=value;
element.title = element.options[element.selectedIndex].text;

我决定将基因组表示为2D二进制数组,其中:

  • 行代表源点
  • 列代表目标点
  • 1s表示源和目标之间的连接

这种表示意味着矩阵中的每一列和每行最多只能有一个1。

现在我正在努力寻找能够保持解决方案完整性的交叉运算符。

示例:

parent1:

sources = {s1, s2, s3}

targets = {t1, t2, t3, t4}

parent2:

[0][1][0][0]
[0][0][1][0]
[1][0][0][0]
后代:???

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

保持您的表示并假设目标多于源,您可以使用具有内置修复算法的行交换交叉运算符。

  • 随机选择一行(i
  • 交换父母' i-th
  • 修复儿童(如果需要)将有冲突的1移至免费(随机或近列)列

E.g。

  1. 随机选择第0行

                 PARENT 1                   PARENT 2
        ROW 0  [0][1][0][0] <-crossover-> [0][0][1][0]
        ROW 1  [0][0][1][0]               [1][0][0][0]
        ROW 2  [1][0][0][0]               [0][0][0][1]
    
  2. 修复前的后代

          CHILD 1            CHILD 2
        [0][0][1][0]       [0][1][0][0]
        [0][0][1][0]  and  [1][0][0][0]
        [1][0][0][0]       [0][0][0][1]
    
  3. CHILD2没问题(对于列交换运算符,这不会发生); CHILD1需要修复操作员

          CHILD 1
        [0][0][X][0]
        [0][0][X][0]
        [1][0][0][0]
    
  4. 保持交换的行(第0行)并更改另一个冲突的行(第1行)。将1移动到空闲列(第1列或第3列)

          CHILD 1
        [0][0][1][0]
        [0][1][0][0]
        [1][0][0][0]
    
  5. 后代

          CHILD 1            CHILD 2
        [0][0][1][0]       [0][1][0][0]
        [0][1][0][0]  and  [1][0][0][0]
        [1][0][0][0]       [0][0][0][1]
    

答案 1 :(得分:0)

您可以将BFS推广到这种情况。 (如果我正确理解任务)

在简单的图形遍历任务中,您需要找到从起始节点到结束节点的最短路径,因此您需要存储从该节点的起始节点和前一个节点开始的每个节点距离(来自您来自的单元)。在BFS迭代算法之前,您需要将起始节点添加到队列中。在每次迭代中取一个项目,检查此节点是否为完成节点,并将此节点的邻居节点添加到队列等。因此,我们如何将此算法推广到多个开始和结束节点。非常简单。

  1. 您需要添加队列所有起始节点。
  2. 您需要将从队列中获取的每个节点与每个完成节点进行比较。您可以使用hashset进行O(1)查找。
  3. 此泛化的时间复杂度不依赖于开始和结束节点的数量,与简单的BFS算法相同:O(V + E)