嘿,伙计们再次为我自己带来了一个全新的项目。在我之前的帖子中,我习惯了编程来完成某些工作很容易习惯,但现在我想看看在编程更有创意的东西时可以做些什么。
所以我会问一系列与算法相关的问题。没有一个史酷比他们真正是什么或如何写一个。但我感兴趣的是GA(遗传算法)。
我已经分解了我将尝试实现的目标,但我需要一个起点和一些编程(控制台 c#)来让我走上自己的道路并以编程方式思考。希望你喜欢阅读,并能在我的路上帮助我。
所有的生物都是由细胞组成的。在每个细胞中都有相同的染色体组。染色体是 DNA 串,可作为整个生物体的模型。染色体由基因、DNA 块组成。每个基因编码一种特定的蛋白质。基本上可以说,每个基因都编码一个特征,例如眼睛的颜色。性状(例如蓝色、棕色)的可能设置称为等位基因。每个基因在染色体中都有自己的位置。这个位置称为轨迹。
一套完整的遗传物质(所有染色体)称为基因组。基因组中特定的一组基因称为基因型。基因型是生物体的表型及其生理和心理特征,如眼睛颜色、智力等的出生后发育的基础。
基本遗传算法概述
- [开始]生成n条染色体的随机种群(问题的合适解决方案)
- 【适应度】评估种群中每条染色体x的适应度f(x)
- [新种群]重复以下步骤创建新种群,直到新种群完成 1. [选择]根据适应度从种群中选择两条父染色体(适应度越好,被选中的机会越大) 2. [交叉]以交叉概率交叉双亲形成新的后代(子代)。如果没有进行交叉,后代是父母的精确副本。3. [突变]以突变概率在每个基因座(染色体中的位置)突变新的后代。4. [接受] 在新种群中放置新的后代
- [替换]使用新生成的种群进一步运行算法
- 【测试】如果满足结束条件,停止,返回当前种群中的最优解
- [循环]转到第 2 步
染色体的编码
染色体应该以某种方式包含有关它所代表的解决方案的信息。最常用的编码方式是二进制字符串。染色体可能看起来像这样:
Chromosome 1 1101100100110110
Chromosome 2 1101111000011110
每条染色体都有一个二进制字符串。该字符串中的每个位都可以代表解决方案的某些特征。或者整个字符串可以表示一个数字 - 这已在基本 GA 小程序中使用。
当然,还有很多其他的编码方式。这主要取决于解决的问题。例如,可以直接编码整数或实数,有时编码一些排列等很有用。
分频器
在我们决定了我们将使用什么编码之后,我们可以迈出交叉的一步。交叉从亲本染色体中选择基因并产生新的后代。如何做到这一点的最简单方法是随机选择一些交叉点和该点之前的所有内容从第一个父节点复制,然后从第二个父节点复制交叉点之后的所有内容。
交叉可以看起来像这样(| 是交叉点):
Chromosome 1 11011 | 00100110110
Chromosome 2 11011 | 11000011110
Offspring 1 11011 | 11000011110
Offspring 2 11011 | 00100110110
还有其他方法可以进行交叉,例如我们可以选择更多的交叉点。交叉可能相当复杂,并且非常依赖于染色体编码的编码。针对特定问题进行的特定交叉可以提高遗传算法的性能。
突变
执行交叉后,发生突变。这是为了防止人口中的所有解决方案陷入已解决问题的局部最优。突变随机改变新的后代。对于二进制编码,我们可以将一些随机选择的位从 1 切换到 0 或从 0 切换到 1。然后可以进行以下突变:
Original offspring 1 1101111000011110
Original offspring 2 1101100100110110
Mutated offspring 1 1100111000011110
Mutated offspring 2 1101101100110110
突变取决于编码以及交叉。例如,当我们编码排列时,突变可能是交换两个基因。