我构建了一个GA算法来解决TSP。
这是Norvig的书(AIAMA)中的练习。他建议我们阅读Larrañaga关于表达等问题的观点。我在那里学到了一些跨越运算符和突变,并尝试了其中一些,看看哪个更适合我。我还根据每条路径的成本详细说明了适应度函数。
好吧,尽管我对我的算法设计有任何疑问,但我之前从未使用过AI,因此我不知道我的方法是否适用于GA。
这就是我的所作所为:
我采用了一个路径向量(我的初始人口)
然后在每个循环中,我通过增加成本顺序来组织此向量,并在此向量中获取最佳X路径并删除其他路径。
然后我应用XOver和Mutation(以一定的速率)并将它们放在向量的旧删除值的位置。
然后我做同样的事情(订购矢量 - 提取最佳等)
并继续这样做直到它稳定下来。
这是一个好方法吗?如果不是给我一些北方。因为当我选择最好的并且没有保留它们时(刚刚通过Xover和变异创建了一个全新的流行音乐)我没有得到好的结果。这样(保持最好的 - 在一些实验中我只保留最好的一个)我有更好的结果,结果总是收敛和快速
状态表示:对于状态表示,我选择使用路径表示(我从一开始就使用它并决定在阅读Larrañaaga等所有之后坚持使用它), 它如下:如果我们有5个城市参观第一个城市,然后是第二个城市,那么第三个城市......我们的路径表示将是(1,2,3,4,5)
初始人口生成:实际上我生成代表城市的随机点(这是本书要求我做的,在一个封闭的正方形中生成随机点) - 但为了比较,我生成了一个群体并坚持使用它在比较结果时 - 我想如果我没有坚持一个特定的人口,我就不会对我的改进有太多了解
最适合个人:最合适的个人是拥有最佳旅行费用的人。 (我不知道我是否应该 - 在这个问题中 - 使用其他东西作为参数
crossover:我尝试了一些交叉操作符,并将我的重复与本书中提到的重新比较,并最终使用了一个Order CrossOvers(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(Inversion Mutation)方法。它从原始路径获取一个子路径,然后将其插回(倒置)到一个随机点。
示例:路径(1 2 3 4 5)子路径(2 3 4)和5之后的随机插入
生成:(1 5 | 4 3 2)
答案 0 :(得分:1)
首先,避免使用所有这些缩写(GA,TSP,XOver)。这很难读,有些人可能不知道你在说什么。 遗传算法的第一个问题是如何您选择初始种群,如何您执行交叉,如何您执行突变。第二个问题是对描述的天真理解可能是一个可怕的。
对于你来说,最合适的人是那些已经成本更高的人。你可以说最好采取最多样化的个体,即更有可能探索问题空间不同部分的个体。描述如何进行以下操作:
您还需要评估您的解决方案如何随着运行时间而改善。例如,您提供n
而不是100n
次迭代,解决方案是否会变得更好,多少?当算法停止时,上一代的个体彼此之间的相似程度等等。
另一个问题,您是否尝试针对固定拓扑或可变拓扑来解决它?
编辑: 您正在使用已发布的算法,因此似乎问题不在于特定操作。对于健身,你是正确的坚持路径成本。你说
因为当我选择最好并且没有保留它们时(刚刚通过Xover和变异创建了一个全新的pop)我没有得到好的结果。这样(保持最好的 - 在一些实验中我只保留最好的一个)我有更好的结果,结果总是收敛和快速。
你应该保持最适合的个人和他们的孩子。它遵循一种邪恶的自然原则, 只有最好的才有权重现 。必须更换的是最不适合的人。
您可以调整3个参数:有孩子的最适合个体的比例(也将丢弃个体的数量),变异概率和运行次数。
要测试算法的执行方式,您可以通过迭代对最佳解决方案进行采样,即每次t
次迭代都可以节省更低的成本。一旦绘制,它应该看起来像: