我建立了一个GA算法来解决TSP。
这是在 Norvig 的书 (AIAMA) 中的一个练习。他建议我们阅读 Larrañaga 对陈述等问题的看法。我在那里学习了一些交叉运算符和突变,并尝试了其中的一些,看看哪个更适合我。我还根据每条路径的成本详细阐述了一个适应度函数。
好吧,尽管我对我的算法设计有很多疑问,但我以前从未使用过 AI,所以我不知道我的方法是否适用于 GA。
这是我所做的:
我采用了路径向量(我的初始人口)
然后在每个循环中,我通过增加成本顺序来组织这个向量,并在这个向量中选取最好的 X 路径并删除其他路径。
然后我应用 XOver 和 Mutation(以一定的速率)并将它们放在向量的旧删除值的位置。
然后我做同样的事情(订单向量 - 提取最佳等)
并继续这样做,直到它稳定下来。
这是一个好方法吗?如果不是给我一些北方。因为当我选择了最好的并且没有保留它们(只是通过 Xover 和突变从它们中创建了一个全新的流行音乐)时,我没有得到好的结果。这样(保留最好的——在一些实验中,我只保留最好的)我有更好的结果,结果总是收敛并且很快
状态表示:对于状态表示,我选择使用路径表示(我从一开始就在使用它,并在我阅读了 Larrañaga 等之后决定坚持使用它),如下所示:假设我们有 5 个城市和访问第一个城市,然后是第二个,然后是第三个......我们的路径表示将是 (1, 2, 3, 4, 5)
初始人口生成:实际上我是生成代表城市的随机点(这就是本书要求我做的,在封闭的正方形中生成随机点) - 但为了比较,我生成了一个人口并在比较时坚持使用它结果——我想如果我不坚持一个特定的人群,我就不会知道我的进步
最适合的人:最适合的人是那些旅行费用最高的人。(我不知道我是否应该 - 在这个问题中 - 使用其他东西作为参数
交叉:我尝试了一些交叉运算符,并将我的结果与书中介绍的结果进行了比较,最后使用了一个 Order CrossOver(Larrañaga 等人(1999)):这个交叉从两个随机切割(形成一个子路径)父路径,然后从另一个父路径(从第二个剪切开始,而不是在位置“0”)复制路径的其余部分(该子路径内尚未访问的城市) - 添加它们出现在另一个路径中的城市父母。
例如:路径 (1 2 3 4 5) (3 4 2 1 5) 选择子路径 (234) 和 (421) 作为后代 (5 |2 3 4| 1) (5 |4 2 1| 3) <- | 里面的部分 | 来自父母一方,另一部分来自另一方父母
突变:对于突变,我选择了 IVM(反转突变)方法。它从原始路径中获取一个子路径,并将其插入(反转)到一个随机点。
示例:路径(1 2 3 4 5)子路径(2 3 4)和5后随机插入
生成:(1 5 | 4 3 2)