遗传算法:如何在“子集”问题中进行交叉?

时间:2010-12-14 04:42:23

标签: algorithm genetic-algorithm evolutionary-algorithm

我有一个问题,我试图用遗传算法解决。问题是选择100个整数的一些子集(比如4)(这些整数只是代表其他东西的id)。顺序无关紧要,问题的解决方案是一组整数而不是一个有序列表。我有很好的健身功能,但是我遇到了交叉功能问题。

我希望能够配对以下两条染色体:

[1 2 3 4]和 [3 4 5 6]有用的东西。很明显,我不能使用典型的交叉功能,因为我最终可能会在我的孩子身上出现重复,这将代表无效的解决方案。在这种情况下,最好的交叉方法是什么。

5 个答案:

答案 0 :(得分:3)

只要忽略集合中两个中出现的任何元素(即在它们的交集中),即在两个集合中保持这些元素不变。

其余的元素形成两个不相交的集合,你几乎可以应用任何随机变换(例如,随机地交换一些对)而不会产生重复。

这可以被认为是对两个集合进行排序和对齐,以便匹配元素彼此面对并应用其中一个标准交叉算法。

答案 1 :(得分:2)

有时让您的解决方案“超出范围”是有益的,这样您的搜索就会更快收敛。不是将一组4个唯一整数作为染色体的要求,而是将整数(及其唯一性)作为适应度函数的一部分。

答案 2 :(得分:2)

由于顺序无关紧要,只需将所有数字收集到一个数组中,对数组进行排序,抛弃重复项(通过将它们从链表中断开,或将它们设置为负数,或其他)。将阵列洗牌并取前4个数字。

答案 3 :(得分:1)

我真的不知道你对“典型交叉”的意思,但我认为你可以使用类似于通常用于排列的交叉:

  • 从第一个父级获取 m 整数( m < n ,其中n是集合中的整数)
  • 扫描第二个并从中填充您的子集( n-m ),这些是免费的(不在子集中)。

通过这种方式,您将从第一个父项和第二个父项的 n-m 整数中获得 n 整数,而不会重复。

对我来说听起来像是有效的交叉:-)。

我认为不对有序集执行任何步骤(或使用迭代器,其中返回元素的顺序与int的自然顺序以某种方式相关)可能是有益的,否则更小或更高的数字将获得更高的机会在孩子身上让你的搜索有偏见。

如果是最好的方法取决于你想要解决的问题......

答案 4 :(得分:1)

为了组合集A和B,您可以概率地选择结果集S,以便x在S中的概率是(A,B中包含x的集合数)/ 2。这将是保证包含交集并包含在联合中,并且具有预期的基数4.