【问题标题】:Variable length chromosome in GAGA中的可变长度染色体
【发布时间】:2014-03-25 22:28:47
【问题描述】:

如果我有如下矩阵...

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

这是要使用的表示吗?如果是这样,我需要使用什么突变和交叉运算符?

【问题讨论】:

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


    【解决方案1】:

    这可以工作。

    要进行突变,您可以包含或排除一些测试(或通过所有测试并将它们从包含更改为排除,反之亦然)。

    要进行交叉,您可以遍历两条染色体,如果两者都包含测试,则包含它,如果都排除它,则排除它,如果包含它,则包含或排除它。

    要有效地执行此操作,您应该保持测试排序,因此测试 1 和 5 将是 001101,而不是 101001

    我当然假设每个测试只能包含一次,但如果不是,这不会对方法有太大的改变。

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

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

    【讨论】:

      猜你喜欢
      • 2016-04-01
      • 1970-01-01
      • 2018-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-27
      • 1970-01-01
      • 2015-02-26
      相关资源
      最近更新 更多