【发布时间】:2011-04-17 11:45:21
【问题描述】:
大家好,我又带着一个全新的项目回来了。在我之前的帖子中,我习惯于编程来完成某些工作相当容易习惯,但现在我想看看在编程更有创意的东西时可以做些什么。
所以我将提出一系列与算法相关的问题。没有一个史酷比他们真正是什么或如何写一个。但我感兴趣的是 GA(遗传算法)。
我已经分解了我将尝试和实现的目标,但我需要一个起点和一些编程(控制台 c#)才能让我走上自己的道路并以编程方式思考。希望您喜欢阅读并在我的路上为我提供帮助。
所有生物都由细胞组成。在每个细胞中都有相同的染色体组。染色体是 DNA 串,可作为整个生物体的模型。染色体由基因、DNA 块组成。每个基因编码一种特定的蛋白质。基本上可以说,每个基因都编码一个特征,例如眼睛的颜色。性状的可能设置(例如蓝色、棕色)称为等位基因。每个基因在染色体中都有自己的位置。这个位置称为轨迹。
完整的遗传物质(所有染色体)称为基因组。基因组中特定的一组基因称为基因型。基因型是生物体的表型、其生理和心理特征,如眼睛颜色、智力等的出生后发育的基础。
基本遗传算法概述
- [开始] 生成 n 条染色体的随机种群(问题的合适解决方案)
- [适应度]评估群体中每个染色体 x 的适应度 f(x)
- [新人口]通过重复以下步骤创建新人口,直到新人口完成 1. [选择] 根据适应度从种群中选择两条亲本染色体(适应度越好,被选中的机会越大) 2. [交叉] 以交叉概率交叉父母,形成新的后代(子代)。如果没有进行交叉,后代是父母的精确副本。 3. [突变] 以突变概率在每个位点(染色体中的位置)突变新的后代。 4. [接受] 将新的后代放入新的种群中
- [替换]使用新生成的人口进一步运行算法
- [测试]如果满足结束条件,停止,返回当前种群中的最优解
- [循环] 转到第 2 步
染色体编码
染色体应该以某种方式包含有关它所代表的解决方案的信息。最常用的编码方式是二进制字符串。然后染色体可能如下所示:
Chromosome 1 1101100100110110
Chromosome 2 1101111000011110
每条染色体都有一个二进制字符串。该字符串中的每个位都可以代表解决方案的某些特征。或者整个字符串可以表示一个数字 - 这已在基本 GA 小程序中使用。
当然,还有很多其他的编码方式。这主要取决于解决的问题。例如,可以直接编码整数或实数,有时编码一些排列等很有用。
跨界
在我们决定了我们将使用什么编码之后,我们可以迈出交叉的一步。交叉从亲本染色体中选择基因并产生新的后代。最简单的方法是随机选择一些交叉点和该点之前的所有内容从第一个父节点复制,然后从第二个父节点复制交叉点之后的所有内容。
Crossover 可以看起来像这样(| 是交叉点):
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
突变取决于编码和交叉。例如,当我们编码排列时,突变可能是交换两个基因。
【问题讨论】:
-
这里有什么问题?
-
你把问题藏在哪里了?
-
我们不需要解释 GA 来提供帮助。那些可以提供帮助的人已经知道,并且宁愿不必过滤掉噪音。
-
@Garrith Graham:这是一个很好的例子:lalena.com/AI/Tsp
-
你已经有了算法。算法就像食物食谱。它有诸如“将牛奶与面粉混合并搅拌”之类的东西。实现会指定要使用的工具、使用它们的顺序、使用多长时间以及如何判断是否完成。您拥有的分步列表已经是一种算法。现在开始实施它。如果你完全不知道如何构建这个程序,我建议你去找一个看起来与你想做的类似的示例程序并开始阅读代码。
标签: c# algorithm genetic-algorithm biological-neural-network