遗传算法:如何实现小于n的置换染色体!有效的排列

时间:2016-05-06 18:55:31

标签: java graph permutation genetic-algorithm

我目前正在研究一种我想要找到的遗传算法(或在有向,非循环,非基于状态的图中近似最佳置换。可能的图形如下所示: Example-Graph

(注意多个输入节点意味着多个条件。因此,为了选择G,必须首先选择B和F)

与旅行推销员问题相反,并非我的图表上的所有节点都已连接(因此B和E),连接不会在两个方向上工作(A-> B很好,但是B- > A是不可能的)并且没有我可以定义为当前位置的节点(意味着从A到B之后,D仍然是有效选项)。因此,在搜索排列以进行适应度计算时,解空间不是!但更少(上面给出的例子约为145)。 验证排列的规则是"对于位置n的任何节点,其所有前提条件必须位于小于n&#34的位置;

例如" A-B-D-C-E-F-H-G-I"将是一个有效的排列,而" I-G-C-H-E-F-D-B-A"会有很多无效的东西。

通过这些信息,我可以验证适应度函数中的任何给定排列,并指定值0,如果它无效。然而,我希望在你的帮助下我能找到一个更有效的解决方案,因为我正在使用可以拥有大约300个节点的图表,并且计算所有无效的可能性将是不可接受的耗时。因此,我想以一种方式设计染色体,对于随机起始种群和进化操作,只有有效的个体被添加到任何给定的种群中。

至于测试,我在Java中使用JGAP库进行遗传算法和遗传编程,但此解决方案的实现并非强制性。

非常感谢你们的帮助,请原谅我任何愚蠢的表达,因为我不是母语,而且因为我对遗传算法很陌生,所以这个问题都没有愚蠢。

1 个答案:

答案 0 :(得分:0)

你的图表是DAG(有向无环图),如你所说。此外,连接到节点B 的节点A必须位于节点B之前。这基本上是此类图的topological sorting的定义。您只是想根据您选择的度量找到 best 这样的排序(因为可以有多个)。

这是我建议的解决方案。

基因型

为图中的每个节点分配一个数字。这些节点的数量将成为基因型。因此,对于您发布的图表,您将拥有9个数字。我们给它一些表示法:K(n)将是分配给节点n的数字。

解码基因型

要将基因型(数字集)解码为表型(排序),请遵循此程序(基本上Khan's algorithm打破平局):

input: N is a set of all nodes in the graph
S += {r | r in N && r has no incoming connections }  // a set with the root nodes
I := {n -> |predecessors(n)| | n in N}  // a mapping from the nodes to numbers, the numbers being the numbers of incoming edges to the nodes
ordering := []  // a list of nodes
while |S| > 0  // while the open set is non-empty
    n := arg min_q {K(q) | q in S}  // from the open set, select the node with the lowest assigned number (see above)
    S -= {n}  // remove the node from the open set
    ordering += n  // add the node to the ordering
    for each q in successors(n)
        I[q] -= 1  // decrease the number of incoming nodes for each successor of n
    S += {q | I[q] == 0}  // add all nodes that have no incoming edge left to S
return ordering

通过这种方式,始终可以获得有效的解决方案,分配给节点的数字只会决定构建哪些有效解决方案。你可以愉快地改进数字,你会得到不同的排序。

vanilla Khan的算法具有运行时间O(| E | + | V |),即节点数加上图中边数的线性。在这里,我们需要对集合S进行排序,以便复杂性更高,具体取决于S使用的数据结构。如果它是一个基于堆的优先级队列,你会得到类似的东西(我现在猜测,因为我懒得计算/证明它)O(| E | + | V | * log | V | )。您可能希望尽可能地优化此过程,因为它将被称为很多

<强>说明

这种解码技巧称为间接编码,即你进化的东西不是直接评估的,而是转化为其他被评估的东西。这有利于始终产生有效的解决方案,但它也有一个主要缺点:基因型的微小变化可能导致表型的大变化,反之亦然。这可能会使遗传算法变得困难。

我还建议您尝试其他优化框架而不仅仅是GA,例如Simmulated annealing