卡片的遗传算法

Genetic Algorithm for Cards

我正在做 here 的练习(注意:不是功课!) 这只是我第二次尝试 GA,遇到以下问题:

如何 "reproduce" 如中,我如何结合我的后代。

我有一个随机生成的种群,我知道其中的个体适应度(这是目标值的总距离)。

但是,我不能在 2 "parents" 之间随意切换卡片,因为可以使用哪些卡片是有规定的(每张卡片只能针对人口中的每个元素使用一次)。

我希望能从你们那里得到一些好的反馈。如果需要,我可以提供更多信息。

问题是每张牌只能使用一次,你必须把它们分成两堆,所以让问题简单一点,只用数字1-10。

例如采用这两个解决方案:

Parent 1:
1 2 5 7 8 - 3 4 6 9 10
Parent 2:
1 4 5 6 9 - 2 3 7 8 10

在这种情况下,我们不能只是将它们拆分并合并,否则您最终会得到重复的数字。那么我们如何从中创造健康的children呢?我通常看到的一种方法是将其中一种解决方案作为 'main' parent.

比如Parent1,我们取一半parent:

Child 1:
1 * 5 * 8 - * 4 * 9 *
Child 2:
* 2 * 7 * - 3 * 6 * 10

接下来我们取第二个 parent 并用它来填补缺失的空白:

Parent 2:
1 4 5 6 9 - 2 3 7 8 10
Child 1:
1 * 5 * 8 - * 4 * 9 *
First we filter out the ones used in child 1:
6 - 2 3 7 10
Next we try to fill the blanks as good as possible:
1 5 6 8 * - 2 3 4 7 9
Now assign the leftovers (they jump side).
The resulting children will be:

Child 1:
1 5 6 8 10 - 2 3 4 7 9
Child 2:
1 2 4 5 7 - 3 6 8 9 10

这个想法有一些问题,例如 child 1 中的 10 有跳边,而 parent 中的两个都在第二堆中。这可以通过首先固定两堆中相同的数字来解决。

发挥创意,您​​会找到最适合您情况的方法。

正如@roy-van-rijn 所提到的,您可以使用 TSP(旅行商问题)中的一些交叉操作来避免后代染色体上的重复数字。在TSP中,子染色体也不能复制城市

一些经典的有序交叉算子:

为了在突变后保持染色体有序,您也需要有序突变算子: