这是我的遗传算法,一步一步:
随机生成两个初始种群,并从两者中选择最合适的游览。
执行一个有序的交叉,它选择第一个适合的游览的随机部分,并从第二个开始按顺序填充其余部分。
如果这次巡演的效果仅为初始人群中前 10% 巡演的 1.3 倍,则通过随机交换两个城市来改变这次巡演(我实际上只是通过归纳来完成的,挑选出制作不佳的巡演) - 我很乐意改变这一点,但想不出更好的方法。
- 该突变选自若干突变的群体。
返回产生的游览。
然而,突变几乎总是更糟,如果与交叉不同的话。
我非常感谢一些帮助。谢谢!
这是我的遗传算法,一步一步:
随机生成两个初始种群,并从两者中选择最合适的游览。
执行一个有序的交叉,它选择第一个适合的游览的随机部分,并从第二个开始按顺序填充其余部分。
如果这次巡演的效果仅为初始人群中前 10% 巡演的 1.3 倍,则通过随机交换两个城市来改变这次巡演(我实际上只是通过归纳来完成的,挑选出制作不佳的巡演) - 我很乐意改变这一点,但想不出更好的方法。
返回产生的游览。
然而,突变几乎总是更糟,如果与交叉不同的话。
我非常感谢一些帮助。谢谢!
GA 中的一个问题是过快地缩小搜索空间并达到局部最大值解决方案。您需要确保除了选择/适应功能之外,您没有以任何方式领导您的解决方案。所以当你说,
你为什么要采取一个好的解决方案,然后执行一个很可能使它成为一个更糟糕的解决方案的功能
,原因是您希望解决方案有机会退后一步,它可能需要在变得更好之前变得更糟。所以你真的应该从你的遗传算子中删除任何判断逻辑,把它留给选择过程。
此外,交叉和变异应该被视为生成子个体的两种不同方式,您应该使用其中一种。实际上,这意味着您有机会执行单亲的突变或两个亲本之间的交叉。通常突变几率只有 5%,而交叉用于生成其他 95%。
交叉保留来自父母双方的遗传信息(孩子是镜像),因此一个孩子会比父母差,另一个更好(或两者相同)。所以从这个意义上说,有了交叉,如果有变化,你总会得到一个更好的个体。
另一方面,突变并不能保证更好的个体,但它的存在是为了引入新数据,帮助将 GA 从局部最大值场景中移动。如果突变未能改善个体并使其变得更糟,那么无论如何它被选为养育孩子的机会就会减少(即,您不需要突变算子本身的这种逻辑)。
你选择最好的变异
这并非完全正确,优秀的人应该有更高的被选中机会。在这里有一个细微的差别,BAD 个体也可能被选作父母。这再次有助于减少达到局部最大值解决方案的机会。这也意味着一代人中最优秀的人实际上可能(而且经常会)变得更糟。为了解决这个问题,我们通常实施“精英主义”,即最好的个人总是被复制到下一代(当时/不进行任何操作)。
如果我可以评论您正在使用哪些遗传运算符,那也将是有益的。根据我的经验,我发现循环交叉和反转突变效果很好。