当前位置: 首页 > 知识库问答 >
问题:

应用遗传算法中的变异算法求解旅行商问题

章盛
2023-03-14

我正在做一个小型学术作业,用遗传算法解决旅行推销员问题。我遵循一个非常简单的经典表示,将城市和旅游存储在数组中,例如,10个城市的旅游可以表示为9-1-0-4-3-8-6-5-2-7等等。对GAs有相当基本的了解,我有点困惑你会遵循什么样的方法来将不同类型的突变应用于TSP。假设我们的路由表示为路由,突变率表示在变量m_rate中。

[1]简单插入突变

说我们有:1-2-3-4-5-6-7-8-9。然后我们随机选择一个城市,说指数5然后随机选择一个像2这样的插入指数,那么突变的染色体是:1-2-6-3-4-5-7-8-9。

现在我要做的是应用变异:

for (int i=0; i<route.length; i++) {
 if (m_rate<Math.random()) {
 // Pick a random city
 int randomCity =  0 + (int)(Math.random() * ( ((route.length-1) - 0) + 1));
 // Do the insertion and shift the array where appropriate
 }
}

换句话说,我在路线中的每个城市循环,看看突变条件是否成立(m_rate

[2] 互换突变。

在染色体中选择一个随机城市,然后选择第二个随机城市,并将两者交换。例如,在路由1-5-2-8-0-9-3-7-4-6。如果我们最终选择指数2和指数7,那么突变的染色体是:1-5-7-8-0-9-3-2-4-6。

我遵循与上述插入突变相似的方法,遍历路线中的每个城市,检查概率条件,然后直接选择一个随机城市进行交换,而不应用任何类型的突变率。上面同样的问题也适用于这里。

[3] 反转突变。

这是最棘手的一个。给定一个类似于1-2-3-4-5-6-7-8-9的染色体,我们选择一个类似于指数2到指数5的突变切割,然后反转该子序列==

但是你如何应用这个呢?你是否在路线中循环,然后根据变异率选择一个城市,然后直接选择另一个指数来确定子路线的长度?你会变异一次然后退出吗?在这种实现中,如果我们将突变切割为0-9或0-(长度-1),整个染色体或路径是否会发生突变,从而逆转整个过程?在这种情况下,突变率的实际值是多少?我有点迷路了。。。

我提前为这件事做得太长表示歉意。。但是,如果您能对这些问题发表任何意见,或者有人能告诉我详细讨论这些问题的任何资源,我将不胜感激。我看了很多研究论文,但没有多少研究过这种细节。

非常感谢。

共有3个答案

周浩博
2023-03-14

反演通常是求解TSP问题的最佳变异算子。您可以下载并使用HeuristicLab进行实验,其中包括更多此类变异运算符和交叉。它允许您定义实验,您可以在其中使用每个操作符运行GA几次,并查看哪一个运行得最好。有一些视频教程可以帮助您开始学习。它是开源的,因此您还可以查看实现。

赖运珧
2023-03-14

我认为最好的选择是对变异使用反转,对交叉使用OX(有序)。我写了一个求解TSP的遗传算法,效果非常好。在我的例子中,当应用反转时,我选择两个随机点(可能是整个字符串),但不是相同的点。最好的结果是变异率为0.2/0.3,交叉率为0.8,但这取决于你的选择机制。

王成化
2023-03-14

选择突变时,您有两个选择:

  • 您可以允许突变产生无效/非法的染色体,并对它们进行不良评分。这意味着GA将搜索正确性(剔除非法结果)和最佳结果。
  • 您可以编写一个只产生有效/合法输出的变异函数。

第一个选项可以让你写出一个更简单、更自然的染色体突变。但是,您可能需要扩展表示(例如,为您的10个城市之旅允许12或15个时段),并且算法需要更长的时间才能收敛。如果必须评估正确性,您的分数函数可能会更昂贵。您可以灵活地解释染色体的解释方式(例如,忽略目的地的第二次出现)。

出于同样的原因,第一个选项还可以简化交叉的实现。

第二种选择通常会收敛得更快,但要避免变异函数中影响结果的细微偏差可能会更困难。

您建议的表示和突变与TSP的非GA近似类似,后者依赖于交换,然后进行改进测试。模拟退火是决定接受哪种换位的一种方法。

遗传html" target="_blank">算法的实现可能需要一种完全不同的染色体,使交叉和变异变得自然。

 类似资料:
  • 在程序里生宝宝, 杀死不乖的宝宝, 让乖宝宝继续生宝宝 所有的遗传算法 (Genetic Algorithm), 后面都简称 GA, 我们都需要一个评估好坏的方程, 这个方程通常被称为 fitness 在 GA 中有基因, 为了方便, 我们直接就称为DNA吧. GA 中第二重要的就是这DNA了, 如何编码和解码DNA, 就是你使用 GA 首先要想到的问题. 传统的 GA 中,DNA我们能用一串二进

  • 前言 蚁群算法也是一种利用了大自然规律的启发式算法,与之前学习过的GA遗传算法类似,遗传算法是用了生物进行理论,把更具适应性的基因传给下一代,最后就能得到一个最优解,常常用来寻找问题的最优解。当然,本篇文章不会主讲GA算法的,想要了解的同学可以查看,我的遗传算法学习和遗传算法在走迷宫中的应用。话题重新回到蚁群算法,蚁群算法是一个利用了蚂蚁寻找食物的原理。不知道小时候有没有发现,当一个蚂蚁发现了地上

  • 几周前,我问了一个关于如何在R中进行优化(使用Optimize R优化向量)的问题。现在我已经掌握了R中的基本优化,我想开始使用遗传算法来解决问题。 考虑到目标函数: 我使用genalg软件包进行优化,特别是“rbga.bin”函数。但问题是一个人似乎不能传递多个参数,即不能传递vol和cov。小地毯是我遗漏了什么,还是理解错误了。 编辑:在genalg包中,有一个名为rbga的函数。垃圾箱就是我

  • 我的数据挖掘算法库:https://github.com/linyiqun/DataMiningAlgorithm  我的算法库:https://github.com/linyiqun/lyq-algorithms-lib 前言 遗传(GA)算法是一个非常有意思的算法,因为他利用了生物进化理论的知识进行问题的求解。算法的核心就是把拥有更好环境适应度的基因遗传给下一代,这就是其中的关键的选择操作,遗

  • 希望这是有意义的,我基本上是在寻找一些关于如何开始在Python 3中处理这个任务的见解。提前感谢您能提供的任何东西!

  • 参考资料:http://blog.csdn.net/b2b160/article/details/4680853/(冒昧的用了链接下的几张图) 百度百科:http://baike.baidu.com/link?url=FcwTBx_yPcD5DDEnN1FqvTkG4QNllkB7Yis6qFOL65wpn6EdT5LXFxUCmv4JlUfV3LUPHQGdYbGj8kHVs3GuaK 算法介绍

  • 我想做一个递归算法来解决做出改变的问题。是否可以使用非动态方法,不仅返回最小数量的硬币,还返回用于构成给定值的硬币集, 例如,给定值6和硬币组=[1,3,4]。有没有可能创建一个不记忆的递归算法,可以返回最小数量的硬币(2)和硬币集(3,3)? 编辑:这是我当前的算法,但它只返回硬币总数: 将返回3,但我希望它也提供集合{5,5,1}。第二个参数(2)是硬币的数量减去1。

  • 我正在尝试用实数遗传算法初始化我的种群。npop是我的人口规模。我创建了一个包含npop行和2列的矩阵。我想用第一列(0,5)和第二列(7,14)之间的随机数填充这个矩阵。问题是,每当我运行这个函数时,我得到的矩阵中充满了零,我有任何语法或逻辑错误吗?