GA中的可变长度染色体

时间:2014-03-25 22:28:47

标签: algorithm artificial-intelligence genetic-algorithm evolutionary-algorithm

如果我有一个如下的矩阵......

test case | branch 1 | branch 2 | branch 3 | branch 4
-----------------------------------------------------
Test1     | x        | o        | x        | o
Test2     | o        | o        | x        | o
Test3     | x        | x        | x        | o
Test4     | x        | o        | x        | x
Test5     | x        | x        | x        | x

我试图优化最大分支覆盖率,但是最小化测试这可能意味着我的GA染色体需要存储100多个测试或仅存储一个。

例如在这个例子中,我只需要Test5,所以我可以得到一个正确的二进制染色体,

101

但是,我可能需要更多...

101001

这是使用的表示吗?如果是这样,我需要使用哪些变异和交叉算子?

1 个答案:

答案 0 :(得分:0)

这可行。

要做突变,您可以包含或排除一些测试(或者通过所有测试并将其从包含更改为排除,反之亦然,但概率很小)。

要进行交叉,你可以浏览两条染色体,如果两者都包括一个测试,则包括它,如果两者都排除它,将其排除,如果包含它,则包括或排除它。

为了有效地执行此操作,您应该对测试进行排序,因此测试1和5将是001101,而不是101001

我当然假设您只能包含一次测试,但如果没有,这不会改变方法。

如果你实际上要将它存储在二进制文件中,我只会选择二进制表示法。你经常在染色体中使用二进制,当二进制级别的突变和交叉是有意义的,但是这里(我的意思是,例如,将测试3(11)更改为测试7({{1} }})需要1位更改(很可能),其中 - 更改测试3(111)到测试12(11)需要4位更改(非常不可能) - 所以有一个某些测试与其他测试之间的关系要强得多,这不太可能代表实际的关系,如果有的话,通常会导致糟糕的结果和/或性能),所以你也可以使用十进制表示(或者其他)是一个足够小和易于使用的组合。)

请记住,这不一定适合您的特定应用,因为测试可能是相互依赖的,这意味着如果包含一个,则还需要包含另一个。如果发生这种情况,您可能希望将测试分组为那些彼此需要的测试,或者如果一个仅依赖于另一个,则有3个选项(例如0/1/2)。或者可能有其他因素会使上述方法不太理想 - 您只需要考虑突变和交叉实际上正在做什么以及这对您的应用是否有意义。