【问题标题】:Creating a "crossover" function for a genetic algorithm to improve network paths为遗传算法创建“交叉”函数以改进网络路径
【发布时间】:2009-12-30 20:21:03
【问题描述】:

我正在尝试开发一种遗传算法,该算法将找到在指定位置连接给定数量节点的最有效方法。

网络上的所有节点都必须能够连接到服务器节点,并且网络内必须没有循环。它基本上是一棵树。

我有一个函数可以测量任何给定网络布局的“适合度”。 阻止我的是,我想不出一个交叉函数需要 2 个网络结构(父母)并以某种方式混合它们来创建满足上述条件的后代。

有什么想法吗?

澄清:每个节点都有一个固定的 x,y 坐标位置。只能更改它们之间的路线。

【问题讨论】:

  • 您的主要任务是:编写 GA 代码或使用 GA 解决问题?如果您的任务是后者,您希望用哪种语言编写代码?
  • 使用 GA 解决问题。我正在使用 Java。我已经构建了很多程序和功能。

标签: algorithm genetic-algorithm


【解决方案1】:

Amir- 我认为这个想法是每个生成的树都将包含相同的节点集,以不同的顺序排列。

也许与其使用基于交叉的遗传算法,不如使用受生物学启发较少的hill-climbing 算法?定义一组交换(例如,在节点之间交换子节点)以充当可能的突变,然后迭代地突变并检查您的适应度函数。与所有此类搜索一样,您很容易陷入局部最大值,因此从不同的起始位置进行多次运行是个好主意。

【讨论】:

  • 我假设节点总是相同的,它们的连接方式各不相同。我现在可以看出,这可能是错误的思考方式。
  • 另外,您应该在答案的第一部分使用 cmets :)
  • 哈哈- 我会的,但我仍然需要更多的“声誉点”来评论其他人的解决方案。我会在未来。 :)
  • 好吧,在那种情况下,我会回答你的;)
【解决方案2】:

让我先用一个问题来回答你的问题:

如果您创建的网络布局违反了“无循环”规则和“连接到服务器”规则,适应度函数会如何表现?

如果它只是通过较差的适应度分数来惩罚给定的网络布局,您不需要做任何特别的事情,除了取两个网络布局并将它们交叉,布局 A 的 1/2,布局 B 的 1/2。这是一个非常基本的交叉函数,它应该可以工作。

但是,如果您负责构建一个有效的布局并且不能依赖于简单地清除无效布局,那么您需要做更多的工作。

【讨论】:

    【解决方案3】:

    听起来您需要创建一个Minimum Spanning Tree 网络。我知道这并不能真正回答您的遗传算法问题,但这是一个很好理解的问题。两个经典方法是PrimKrustal。也许这些算法和它们用来选择连接边的方法可能会给你一些线索。也许基因不描述网络,而是通过特定边缘连接节点的可能性?或者一种选择节点连接的方法?

    或者只是查看done this beforethis 的人。

    【讨论】:

      【解决方案4】:

      遗传算法中交叉的目的是潜在地混合来自一个父母的良好部分解决方案与另一个父母的部分解决方案。在这种情况下考虑部分解决方案的一种方法可能是紧密连接节点的子树。如果您的适应度函数在整个树的局部部分的微小变化方面相当平滑,那么这可能是考虑交叉的有用方法。

      鉴于此,一种可能的交叉形式如下:

      从两个父树开始,P1P2。随机选择两个节点(可能对节点之间的最小距离进行某种强制),N1N2

      在逐个节点的基础上,根据P1中的链接从N1向外“生长”一棵树C1,而同时从 N2 向外生长另一棵树,从 P2 开始。不要将相同的节点添加到两棵树 - 保持节点集完全不相交。继续,直到所有节点都添加到 C1C2。这为我们提供了来自每个亲本的“特征”以保证是非循环的形式进行重组。

      重组是通过添加一个额外的链接来完成的,从 C1C2,以创建新的子 C。至于选择哪个链接,可以是随机选择(均匀地或根据某种分布),也可以通过贪心算法选择(基于某种启发式,或者新树的整体适应度C)。

      【讨论】:

      • 这里有很多好的可能解决方案,我希望我们能从 OP 那里得到更多反馈。
      【解决方案5】:

      您可以检查交叉运算符,以确保子染色体中没有重复节点。这些交叉算子中的几个是阶交叉(OX)和边缘交叉算子。这种交叉算子也有助于使用 GA 求解 TSP。

      然后,您必须检查是否有任何周期。如果是,则生成一对新的染色体。这当然是蛮力。

      【讨论】:

        【解决方案6】:

        一个尝试的想法:在度量空间(例如 3 维欧几里得空间)中编码节点的位置。没有“不正确”的分配,因此交叉永远不会具有破坏性。通过这样的分配,您始终可以构建最近邻树、最小生成树或类似树。

        这只是一个更一般的想法的示例:不要直接对树进行编码,而是对一些始终可以构建树的信息进行编码。棘手的部分是要让子树保留父树的重要属性。

        【讨论】:

          【解决方案7】:

          在早期的一次会议上,有一篇论文提出了以下用于旅行推销员的算法,我已经成功地对几个图问题进行了调整:

          在整个POPULATION中,按连接数降序计算并排序节点(也就是说,如果N0在某些个体中连接到N1、N2、N3,它有3个连接,如果N1总是连接到N4,它只有 1)。

          最初,取计数最高的节点。将此称为 current_gene_node。 (比如说,N0)

          循环: 将 current_gene_node 添加到您的后代中。

          从连接列表中删除该节点。 (没有循环,因此不再考虑 N0。)

          如果 current_gene_node 在种群中没有连接,则在种群中随机选择一个未选择的节点(突变)

          否则,从该节点的连接列表中,根据人群中连接的流行程度进行抽签选择(如果 current_gene_node = N0,并且连接 N0 是,例如,N1 = 50%,N2 = 30%, N3 = 20% -- N1 有 50% 的机会成为下一个 current_gene_node)。

          进入循环直到所有节点都连接

          真的从直接从 2 个父母中选择的意义上说,它不是遗传的,但它遵循相同的基于人口流行度选择的数学压力。所以它对我来说“足够遗传”,对我来说效果很好:-)

          【讨论】:

            猜你喜欢
            • 2012-09-23
            • 2014-08-12
            • 1970-01-01
            • 2016-08-31
            • 2015-07-03
            • 2016-09-16
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多