将遗传算法与暴力搜索算法做比较,让大家更直观的去了解一下遗传算法:
暴力搜索算法是枚举搜索的一种算法,遍历所有可能的解空间来寻找最优解,因为是盲目的搜索,所以时间的复杂度较高,适用于解空间较小的问题。
而遗传算法是一种模拟生物进化过程的优化算法。通过模拟自然选择、交叉和变异等操作来逐步优化解的质量。遗传算法在种群演化过程中可以很容易地实现并行计算,适用于解空间较大的问题。
即遗传算法是一种更高级的搜索算法。
遗传算法
遗传算法模拟自然进化,基因染色体的自然选择、交叉变异产生良好的基因进入下一代遗传。
遗传算法的目的就是为了解决求全局最优解问题。
遗传算法的原理
要运用遗传算法,首先需将问题构建为数学模型。在遗传算法中,一个问题的一个可行解被称为“一条染色体”,由多个元素组成。
举个栗子,对于问题 X+Y+Z<10,解[1,2,3]和[2,3,4]都是这个函数的可行解,它们在遗传算法中被称为染色体。每个元素被称为染色体上的“一个基因”。
适应度函数是遗传算法中最关键的部分,它可以衡量染色体的优劣程度。
在运行过程中,遗传算法会进行多次迭代,每次迭代都会生成若干条染色体。适应度函数会给本次迭代中生成的所有染色体打分,评判它们的适应度,然后将适应度较低的染色体淘汰掉,只保留适应度较高的染色体。经过若干次迭代后,染色体的质量会逐渐提高,这就是优胜略汰策略。
交叉是遗传算法的核心步骤之一。每次迭代都会生成N条染色体,称为一次进化。
这是指将两条染色体的部分基因进行交叉拼接,生成新的染色体。在每次进化完成后,通过轮盘赌博算法选择上一代基因。然后计算每一条染色体的适应度概率,适应度较大的染色体被选中的概率较高。这就是遗传算法能够保留优良基因的原因。
然而,仅仅通过交叉只能保证结果更接近局部最优解,而无法达到全局最优解。因此,遗传算法引入了变异步骤。当交叉生成一条新的染色体后,需要在新的染色体上随机选择若干个基因,并随机修改它们的值。这样做可以引入新的基因,突破了当前搜索的限制,有助于找到全局最优解,这就是基因突变。
最后一步是复制。为了保留上一代优良的染色体解,每次进化中需要将上一代中适应度最高的几条染色体直接复制给下一代。假设每次进化都需要生成N条染色体,那么在进化过程中,其他M条染色体通过复制上一代适应度最高的M条染色体获得其内容,剩余的N-M条则通过交叉方式生成。
遗传算法流程
准备过程:
在算法的初始阶段,根据目标函数和约束条件的限制,先会随机生成一组可行解,即第一代染色体。然后通过使用适应度函数来计算每一条染色体的适应度,并根据适应度程度计算每一条染色体在下一次进化中被选中的概率。
进化过程:
通过交叉和变异操作,会生成N-M条染色体,再通过复制的方式生成M条染色体。这样,N条染色体就生成完毕了。
接下来,分别计算这N条染色体的适应度和下次被选中的概率。这就是一次进化的过程,紧接着进行新一轮的进化。关于进化次数,可以经过大量实验,得到较优的进化情况下的平均进化次数。
下面这段代码用于执行NSGA-II算法中的交叉操作,它负责根据一定的概率对两个父代个体进行基因交换,产生两个子代个体。
def crossover(a,b):
r=random.random()
if r>0.5: # r大于0.5,执行算术和;r小于0.5,执行算术差
return mutation((a+b)/2) # 返回两个父代个体的平均值,并对其进行变异操作
else:
return mutation((a-b)/2) # 返回两个父代个体的平均值,并对其进行变异操作
下面这段代码用于执行NSGA-II算法中的变异操作,它负责根据一定的概率对每个子代个体进行基因突变,产生新的变异个体。
def mutation(solution):
mutation_prob = random.random()
if mutation_prob <1: # 如果mutation_prob小于1,则执行变异操作,这里的1可以视为变异概率,可以根据需要调整
solution = min_x+(max_x-min_x)*random.random() # 将子代个体的值随机地替换为[min_x, max_x]区间内的一个数,其中min_x和max_x是解向量的取值范围
return solution # 返回变异后的子代个体
其实遗传算法的交叉和变异操作很简单,就是模拟生物进化随机生成染色体,在计算机中生成随机函数进行变异。
遗传算法优点:
全局最优:因为使用了一组候选解,而不是一个候选解,而且在许多情况下,交叉和编译操作将导致候选解与之前的解有所不同。只要设法维持种群的多样性并避免过早趋同就有可能产生全局最优解。
遗传算法的局限性:
超参数调整:遗传算法的行为由一组超参数控制,例如种群大小和突变率等。将遗传算法应用于特定问题时,没有标准的超参数设定规则。
最近需要为自己的研究方向的论文寻找一个合适的搜索算法,比较来比较去,还是觉得遗传算法比较适合,故将学习遗传算法是以笔记形式记录下来,方便自己学习。