从旅行推销员问题与遗传算法的启发理解病毒变异

1. 前言

Covid-19病毒在全世界传播了三年之久,然而该病毒的变异毒株依然在全世界肆虐。这种病毒相比于三年前刚出现的时候,传染性有了很大幅度的增强,但是致死率和致病性都有所降低。根据病毒遗传学规律, 更强的传染性和更低的致病性更有利于病毒的传播。今年不一定是Covid-19病毒的变异终点,未来的新型的变异病毒依然会出现在人类社会里。其实不仅仅是病毒会产生变异。细菌, 真菌, 植物和动物等高等生物也会出现变异的现象。生命为什么会发生变异呢?这一个生物学问题的背后也蕴藏着数学的原理。本文章将会根据Yongle Li的启发和讲解,从旅行销售员问题(TSP)逐步讲解生物界遗传和变异的重要的计算机意义。

2. 旅行推销员问题(TSP)

旅行商问题 (TSP) 是计算机科学和运筹学领域中著名的组合优化问题。 TSP 的目标是找到访问给定城市集并返回起始城市的最短路线,同时只访问每个城市一次。 TSP 有许多实际应用,包括车辆路线规划、物流和设施定位。

例如: 现在有[A, B, C, D]这四个城市,A到B假设为3个距离单位,B到C为7个距离单位,A到D为5个时间单位等等…要一次遍历所有城市,并且每个城市只遍历一次。该选择什么策略才能让距离最短呢?
TSP Example

TSP 是 NP-hard,这意味着寻找最佳解决方案的时间复杂度会随着城市数量的增加而快速增长。 因此找到 TSP的最佳解决方案可能是一项具有挑战性且耗时的任务,尤其是对于大型实例。

解决TSP常用的两种方法是暴力搜索算法和贪心算法。

(1). 暴力搜索算法

暴力搜索算法,也称为蛮力或穷举搜索,是一种通过生成所有可能的城市组合并选择最短的组合来求解TSP的方法。

暴力搜索算法可以通过列出所有的路线然后进行比较找到最优解,例如在上一图上所提到的例子,该算法会列出所有的路线(假设从A城市开始搜索):

BFSA
很快,得到了六条路径。但是三种策略分别是35, 39, 28(距离单位和方向的正反没有关系)。按照这样的方法,可以暴力搜索出每一种情况了。这是城市(节点)少的情况。

现在假设有n个城市,该有多少策略呢?现在我们有 n 个城市,那么我从一个城市出发第一次就会有 (n-1) 种选择。第二次面临 (n-2) 种选择…直到最后一次,剩下 1 种选择。又因为一正一反的策略是一样的。所以将其的阶乘再除以 2 :

TSP_BFSA
可以将n取几个数字来进行测试,很快就发现这种方法的时间复杂度是指数级的,对于 TSP 的大实例来说几乎是不可行的。这个算法是准确的,但是速度很慢。由于搜索复杂度太高,只要稍微复杂一点的问题,就无法取得最优解了。

(2). 贪心算法

贪心算法是一种启发式方法,它从初始城市开始,选择最近的未访问过的城市作为下一步行动。 该算法继续进行,直到所有城市都已访问并返回起始城市。 贪心算法每次都会选择局部最优的路线进行遍历。每一次每一个步骤都是最优的。
GreedyTSP
例如,上图所示。贪心算法每一次都在寻找距离单位最小的,反而总体距离是最高的。可见的局部最优不一定代表着全局最优。虽然贪心算法可以为 TSP 的小实例提供良好的解决方案,但它不能保证为大实例提供最优解。贪心算法很快能寻找到解决方案,但是不准确。人类是否能找到一种将暴力搜索算法与贪心算法结合的算法啥妈?可以做到又快又准的寻找到最优解。很快,人类模仿生物的进化找到了遗传算法

3. 遗传变异

遗传变异是进化算法(包括遗传算法)中的一个关键概念。 它指的是一个群体中个体特征在几代人中的随机变化。 这种变异对于种群的进化和适应其环境是必要的。

从查尔斯达尔文的自然选择理论指出,生物物种通过选择过程随着时间的推移而进化。

这种选择的发生是因为一个种群中的个体在繁殖和将其基因传递给下一代方面会取得不同程度的成功。那些更适应环境的个体更有可能生存和繁殖,而那些不太适应环境的个体将难以生存并且后代会更少。 随着时间的推移,这些微小的变化会累积,导致人口的整体特征发生变化。

该理论通常被称为“适者生存”,因为正是那些最适合其环境的个体更有可能生存并将其基因传递给下一代。

达尔文自然选择理论的核心是物种随着时间的推移通过基于特征变化和个体在环境中生存和繁殖的能力的选择过程而进化。

Gregor Mendel 被认为是现代遗传学之父。他对豌豆植物进行了一系列实验,发现了遗传的基本原理,包括性状通过基因的分离和重组从一代传给下一代这一事实。他发现基因成对存在,并且每个父母都为后代贡献一个基因。托马斯亨特摩根是美国生物学家和遗传学家,他对染色体在遗传中的作用进行了开创性研究。他研究了果蝇 Drosophila melanogaster,发现基因位于特定的染色体上,这些基因的突变会导致生物体性状发生变化。他还发现,当来自不同个体的染色体聚集在一起并交换遗传物质时,就会发生基因重组。这个过程允许产生新的基因组合,从而导致新特征的进化和新物种的创造。

总之,孟德尔和摩根关于基因重组的研究对于遗传的基本原理和基因在性状遗传中的作用至关重要。 这些发现使人们对生物体如何随时间进化以及基因突变如何在新物种的发展中发挥作用有了更深入的了解。

这里将会说一下基因重组(交叉)和基因变异,将会引用大量的生物学知识来讲解:

Crossover

基因重组的过程:它是非姐妹染色单体之间遗传物质的交换同源染色体. 同源染色体成对排队,基因沿着它们的整个长度,形成具有四个染色单体的配置,称为四分体。此时,染色单体彼此靠得很近,两条染色单体的一些物质交换染色体,即物质断裂并重新附着在同源染色体的同一位置染色体. 这种遗传物质的交换可以在同一对中发生多次同源染色体,创造独特的基因组合. 基因重组的过程:它是非姐妹染色单体之间遗传物质的交换同源染色体. 同源染色体成对排队,基因沿着它们的整个长度,形成具有四个染色单体的配置,称为四分体。此时,染色单体彼此靠得很近,两条染色单体的一些物质交换染色体,即物质断裂并重新附着在同源染色体的同一位置染色体. 这种遗传物质的交换可以在同一对中发生多次同源染色体,创造独特的基因组合.
Image Reference Biology LibreTexts. (2018). 7.6: Genetic Variation. [online] Available at: https://bio.libretexts.org/Bookshelves/Human_Biology/Book%3A_Human_Biology_%28Wakim_and_Grewal%29/07%3A_Cell_Reproduction/7.6%3A_Genetic_Variation.

Random
在这个阶段,四分体移动到中期动粒面向相反两极的板。同源对在赤道板随机定向。该事件是将变异引入配子或孢子的第二种机制。每一个细胞经历 减数分裂,四分体的排列是不同的。变异的数量取决于组成一个集合的染色体的数量。定位有两种可能中期盘子。因此,可能的比对数等于 2 n,其中 n 是每组染色体的数量。鉴于这两种机制,任何两个都不太可能单倍体产生的细胞减数分裂将具有相同的遗传组成。

减数分裂 I 确保独特的配子 在中期 I 期间随机、独立的分类可以通过考虑具有一组两条染色体 (n = 2) 的细胞来证明。在这种情况下,在中期 I 的赤道平面上有两种可能的排列。不同配子的可能总数为 2n,其中 n 等于一组染色体的数量。在此示例中,配子有四种可能的遗传组合。 人类细胞中的 n = 23,父系和母系染色体的可能组合超过 800 万种。
Image Reference Biology LibreTexts. (2018). 7.6: Genetic Variation. [online] Available at: https://bio.libretexts.org/Bookshelves/Human_Biology/Book%3A_Human_Biology_%28Wakim_and_Grewal%29/07%3A_Cell_Reproduction/7.6%3A_Genetic_Variation.

以上的解释从了分子的角度解释了遗传变异的过程和原理,主要是基于基因的分离组合和置换。“自然界也如此。原始的世界,原始的宇宙,原始的生命与地球。经历了不断的遗传变异和自然选择才有了今天丰富多彩的世界”。

4. 遗传算法(GA)的概述

遗传算法(GA)是对自然选择和进化过程的计算机模拟,用于解决优化问题。 该算法的工作原理是模仿生物体通过突变、选择和重组过程世代进化的方式。GA是一种进化算法,它使用自然选择和遗传学的原理来搜索问题的最佳解决方案。 在 GA 中,候选解决方案的群体通过选择、交叉和变异过程在多代中进化。

遗传算法从一群随机生成的个体开始,每个个体代表优化问题的可能解决方案。 然后根据适应度函数对这些人进行评估,确定每个人解决问题的能力。 然后选择具有最高适应性的个体进行繁殖,并将它们的遗传物质重新组合以产生新的后代。 这个过程重复几代,每次迭代都会产生一个新的个体群体,这些个体具有更高的适应性。
GA
如上图所示,遗传算法的基本流程首先是初始化整个种群,然后计算种群中每个个体的适应度。接着将种群进行遗传变异的处理。然后重新计算每个个体的适应度,并且重复之后的行为直到满足条件。

在人工智能领域,遗传算法已被用于创建可以学习玩游戏、解决难题和执行其他任务的智能体。例如,遗传算法已被用于训练神经网络,神经网络是可以学习识别数据模式的数学模型。遗传算法的另一个应用是在机器学习领域,它们可用于优化决策树、支持向量机和神经网络等算法的参数。通过使用遗传算法,机器学习算法可以以高效和自动化的方式从数据中学习,而无需手动调整参数。在金融领域,遗传算法已被用于优化投资组合、制定交易策略和优化风险管理。 例如,可以使用遗传算法找到最佳资产组合,以最大化回报同时最小化风险。最后,遗传算法也被用于各种工程领域,例如空气动力学、结构工程和电气工程。 例如,遗传算法已被用于优化飞机机翼、桥梁和电路的设计。

使用遗传算法的主要优点之一是它们可以找到全局最优解,即使是在复杂和高度非线性的问题中,传统的优化技术可能会失败。 这使它们成为解决范围广泛的优化问题的强大工具,例如调度、资源分配和路线优化。

5. 遗传算法在TSP上的应用

(1). 思路与原理

GA 在 TSP 上的应用涉及将城市之间的路线表示为染色体,每个城市由一个基因表示。 候选解的适应度是根据路径的总长度来评估的。 然后选择种群中最适合的个体进行繁殖,他们的遗传信息通过交叉组合以产生后代。 最后,应用突变在种群中引入随机变化。

在 TSP 的背景下,GA 已被证明可以为中小型实例提供良好的结果。 然而,对于大型实例来说,它的计算成本可能很高,而且种群大小和变异率等参数的选择会极大地影响算法的性能。

举个例子, 比如说一共有6个城市。有一个旅行商他要去6个城市, 6个城市应该是有60种算法(5!/2==60). 只要遍历这60种,就能找到那个最好的方式了。但是我现在不想这么做。我们想用这种遗传算法:我们可以先设置一个种群,例如先设置4个个体。这4个个体其实就是4个路径。

S₁=[1, 2, 3, 4, 5, 6],最后都会回到1了。第二个路径是132654。第三个路径S₃ = [1, 4, 2, 6, 3, 5], 第四个路径比如说是162534…

我们随机的设这几个路径, 这就好像世界上的原始生命一样。然后我们就要计算它的个体适应度,我们到底想考察什么?我们是想考察哪条路最短,哪条路价格最便宜。那么我们把价格把它列出来。比如说第一条路价格是10,第二条路总票价是20,第三条路总票价是20,第四条路总票价是50。我们看起来好像第一条路它价格是最低的,但是现在也不能确定它是不是最好的。那我们能不能去改进一下,找到更好的呢?

我们找它的适应度,适应度就是价格越低越适应。所以我们可以把这个适应度写成 f= 1/d, 我们把它叫做适应度 1/d。就价格越低 适应度就越高。第一个路线适应度应该是0.1,第二个适应度是0.05,第三个适应度是0.05。第四个适应度是0.02。还是第一条路是最好的。

找到适应度之后下一步干什么呢?根据遗传学的规律,适应自然界的就更有可能遗传,更有可能有下一代。所以我们说适应度越高的越有可能会遗传。我们就让它根据概率进行遗传。这个遗传的概率怎么算呢?我们可以用每一个路径的适应度,再除以所有的适应度之和。这就表示你的适应度在总体中所占的比例。比例越高你就越有可能遗传。把这个问题用概率的观点解释一下呢?

RoundTSP

如上图,画一个圆盘,在这个圆盘上标出一些区域。比如说这个f₁这个概率是最大的,适应度最高的,。那么它的面积也就相应的是最大。这个f₂和f₃的面积要小一点,所以在这个盘子上 它的面积也就会小一些。然后是f₂和f₃,这个f₄它是最小的。所以在这个盘子上它的面积也是最小的,然后我们就用一个指针,然后转动这个指针。让这个指针在这个盘子上去转,转的时候 一停下来,就看它指向谁,指向谁就是选择谁进行遗传。所以适应度越高,所占的比例越大,越适合自然环境。就越有可能被选中。当然这也不是百分百的。

假如说,第一次转的时候我就选中了S₁。那我选中了S₁。我第二次又转了一圈,我就选中了s₂,选完后就进入下一个环节。

我需要让它进行变异互换,变异互换分两种。第一种我们可以是交叉变异,就是S₁和S₂已经有。相当于它的DNA片段,我们可以在中间某个部位我进行截断。然后让它模仿摩尔根的这种基因互换让片段互换。换完了之后,这个 S₁’它就变成了123654。然后S₂它就变成了什么呢?132456。这就是交叉变异。并且我们至少得保证子代和亲代一样多,要不然传几代就没样本了。比如说我又转了两次,我们选出了S₁和S₄。然后我们再进行交叉变异,找到新的S₃’和S₄’。

换完了之后我们再做一步就是变异,就是模仿生物的DNA的变异。举个例子,比如说这S₁’,我们可以让这个365调换顺序。S₁’‘变成125634,就是把365这三个调换顺序。这是一种变异方法,还有其他的变异方法,比如说我也可以让两个数交换。比如说我们让3和6交换,S₂’'等于162453。这也是一种方式。

这就是我们首先选择了优秀的父代,然后我们让她生出子代进行一点变异。下一步重新计算个体适应度,我得到的这些子代它的价格是多少?以及它的适应度是多少。然后再次进入这个轮盘重新进行迭代,只要最开始设置的种群数量足够多,迭代的次数足够多。就应该能找到,接近于最优解的解了。

总的来说,旅行商问题是一个具有许多实际应用的具有挑战性的优化问题。 暴力搜索算法和贪心算法是解决TSP的两种常用方法,但它们可能不适用于大实例。 遗传算法是一种很有前途的方法,它使用自然选择和遗传学的原理来搜索最佳解决方案,但对于 TSP 的大型实例来说,它的计算成本可能很高。

(2). 代码实现

首先生成一个潜在的问题解决方案的随机群体,然后通过应用遗传运算符(如变异和交叉)来迭代进化这个群体,直到找到一个最佳解决方案。下面代码来自ChatGPT构建。

import random
import numpy as np

def tsp_fitness(route, distance_matrix):
    """
    Calculates the total distance of a given route using the distance matrix
    """
    total_distance = 0
    route_length = len(route)
    for i in range(route_length - 1):
        total_distance += distance_matrix[route[i]][route[i + 1]]
    return total_distance

def generate_random_route(num_cities):
    """
    Generates a random route
    """
    route = list(range(num_cities))
    random.shuffle(route)
    return route

def generate_initial_population(num_cities, population_size):
    """
    Generates the initial population of routes
    """
    population = []
    for i in range(population_size):
        population.append(generate_random_route(num_cities))
    return population

def mutate_route(route):
    """
    Mutates a route by swapping two random cities
    """
    i, j = sorted(random.sample(range(len(route)), 2))
    route[i], route[j] = route[j], route[i]
    return route

def crossover_routes(route1, route2):
    """
    Crosses over two routes to generate a new route
    """
    i, j = sorted(random.sample(range(len(route1)), 2))
    new_route = route1[:i] + route2[i:j] + route1[j:]
    return new_route

def select_parents(population, fitness_scores, num_parents):
    """
    Selects the top-scoring routes to serve as parents for the next generation
    """
    parent_indices = np.argsort(fitness_scores)[:num_parents]
    parents = [population[i] for i in parent_indices]
    return parents

def generate_next_population(previous_population, num_cities, num_parents):
    """
    Generates the next population of routes using genetic operators
    """
    population_size = len(previous_population)
    fitness_scores = [tsp_fitness(route, distance_matrix) for route in previous_population]
    parents = select_parents(previous_population, fitness_scores, num_parents)
    next_population = []
    while len(next_population) < population_size:
        parent1 = random.choice(parents)
        parent2 = random.choice(parents)
        child = crossover_routes(parent1, parent2)
        if random

版权声明
本文被以下参考引用内容外均为J0hn原创内容,最终解释权归原作者所有。如有侵权,请联系删除。未经本人授权,请勿私自转载!

6. 参考资料

[1]. Biology LibreTexts. (2018). 7.6: Genetic Variation. [online] Available at: https://bio.libretexts.org/Bookshelves/Human_Biology/Book%3A_Human_Biology_%28Wakim_and_Grewal%29/07%3A_Cell_Reproduction/7.6%3A_Genetic_Variation.

[2]. Clever algorithms : nature-inspired programming recipes. United Kingdom: Lulu.com.Li, Y. (2022).

[3]. Why do viruses keep mutating? Traveling salesman problem and genetic algorithm. [online] Yongle Li. Available at: https://youtu.be/iM-VKHWd_JE [Accessed 9 Feb. 2023].

[4]. OpenAI (n.d.). ChatGPT. [online] chatGPT. Available at: https://chat.openai.com/chat.

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值