为遗传算法创建“交叉”功能以改善网络路径

时间:2009-12-30 20:21:04

标签: algorithm genetic-algorithm

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

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

我有一个可以衡量任何给定网络布局“适应性”的功能。 阻止我的是我无法想象一个交叉功能会占用2个网络结构(父母)并以某种方式将它们混合起来创造满足上述条件的后代。

有什么想法吗?

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

7 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

首先让我回答一个问题:

如果您创建违反“无循环”规则和“连接到服务器”规则的网络布局,健身功能如何表现?

如果它只是通过较差的健身分数惩罚给定的网络布局,除了采用两个网络布局并交叉它们之外,你不需要做任何特殊的事情,1/2来自布局A,1/2来自布局B.这是一个非常基本的交叉功能,它应该可以工作。

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

答案 3 :(得分:1)

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

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

从两个父树开始, P1 P2 。随机选择两个节点(可能在节点之间的最小距离上有某种强制执行), N1 N2

在逐个节点的基础上,根据 P1 中的链接,从 N1 向外“增长”树 C1 ,同时同时从 P2 开始,从 N2 向外生长另一棵树。不要将同一节点添加到两个树中 - 保持节点集完全不相交。继续,直到所有节点都已添加到 C1 C2 。这给了我们每个父母重新组合的“特征”,保证是非循环的形式。

通过添加从 C1 C2 的附加链接来完成重组,以创建新的子 C 。至于选择哪个链接,可以随机选择(统一或根据某种分布),或者可以通过贪心算法(基于某种启发式或新树的整体适应性 C < / em>的)。

答案 4 :(得分:0)

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

这只是一个更一般的想法的例子:不要直接编码树,编码一些信息,从中可以始终构造树。棘手的部分是以子树保留父母的重要属性的方式进行。

答案 5 :(得分:0)

您可以检查交叉运算符,确保子染色体中没有重复节点。这些交叉运算符中的几个是Order Crossover(OX)和Edge Crossover运算符。这些交叉算子也有助于使用GA解决TSP问题。

之后你将不得不检查你是否有任何周期。如果是,则生成一对新的染色体。这当然是蛮力。

答案 6 :(得分:0)

在其中一个早期会议中有一篇论文为旅行推销员提出了以下算法,我已经针对几个图形问题进行了调整并取得了成功:

在整个人口中,通过降序连接数来计算和排序节点(换句话说,如果N0在某些个体中连接到N1,N2,N3,则它有3个连接,如果N1始终连接到N4,它只有1)。

最初,获取具有最高计数的节点。将此名称称为current_gene_node。 (说,N0)

LOOP: 将current_gene_node添加到您的后代。

从连接列表中删除该节点。 (没有周期,所以从进一步的考虑中删除N0。)

如果current_gene_node在总体中没有连接,请在群体中选择一个随机的非选择节点(变异​​)

否则,从该节点的连接列表中,根据总体中连接的普遍程度进行抽奖选择(如果current_gene_node = N0,连接N0,例如,N1 = 50%,N2 = 30%, N3 = 20% - N1有50%的机会成为下一个current_gene_node。

转到LOOP直到所有节点连接

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