如何改进TSP的遗传算法?

时间:2017-12-06 17:17:32

标签: python genetic-algorithm traveling-salesman mutation crossover

这是我的遗传算法,一步一步:

  1. 随机生成两个初始种群,并从两者中选择最适合的游览。

  2. 执行有序交叉,按顺序选择第一个适合游览的随机部分并从第二个填充其余部分。

  3. 通过随机交换两个城市来改变这次旅游,如果旅行的次数只是初始人口中前10%旅游的1.3倍(我实际上只是通过归纳完成,挑选出来的差旅) - 我想改变这一点,但想不出更好的方法。

    • 突变选自几个突变的群体。
  4. 返回生成的游览。

  5. 然而,如果与交叉相同,突变几乎总是更糟。

    我非常感谢一些帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

GA的一个问题是缩小您的搜索空间太快并达到局部最大值解决方案。除了选择/适应性功能之外,您需要确保不以任何方式引导您的解决方案。所以,当你说,

  

为什么你会采取一个好的解决方案呢?   执行一项最有可能使其成为更糟糕解决方案的功能

,原因是你有机会让解决方案退后一步,它可能需要在它变好之前变得更糟。所以你应该从遗传算法中删除任何判断逻辑,将其留给选择过程。

此外,交叉和变异应被视为生成儿童个体的两种不同方式,您应该使用其中一种。在实践中,这意味着您有可能执行单个父母的突变或2个父母之间的交叉。通常突变几率仅为5%,交叉用于产生另外95%。

交叉保持父母双方的遗传信息(儿童是镜像),因此一个孩子将比父母更差,另一个孩子更好(或两者都相同)。所以在这种意义上,交叉,如果有变化,你将永远得到一个更好的个人。

另一方面,突变不能保证更好的个体,但它的存在是为了引入新数据,有助于将GA从局部最大值方案中移除。如果突变无法改善个体并使其变得更糟,那么无论如何它被选择为养育孩子的机会较少(即你在变异算子本身中不需要这种逻辑)。

  

你选择最好的一个变异

这并非严格意义上说,好的人应该有更高的选择机会。在这里有一个微妙的区别,也可以为父母选择BAD个体。同样,这有助于降低达到局部最大值解决方案的机会。这也意味着一代人中最好的个体可能(并且经常会)实际上变得更糟。为了解决这个问题,我们通常会实施“精英主义”,即最好的个人总是被复制到下一代(当时正在/不进行任何操作)。

如果我能评论您正在使用哪种遗传算法,那也是有益的。我发现循环交叉和反转变异在我的经验中运作良好。