【问题标题】:Creating my first Algorithm [closed]创建我的第一个算法[关闭]
【发布时间】:2011-04-17 11:45:21
【问题描述】:

大家好,我又带着一个全新的项目回来了。在我之前的帖子中,我习惯于编程来完成某些工作相当容易习惯,但现在我想看看在编程更有创意的东西时可以做些什么。

所以我将提出一系列与算法相关的问题。没有一个史酷比他们真正是什么或如何写一个。但我感兴趣的是 GA(遗传算法)。

我已经分解了我将尝试和实现的目标,但我需要一个起点和一些编程(控制台 c#)才能让我走上自己的道路并以编程方式思考。希望您喜欢阅读并在我的路上为我提供帮助。

所有生物都由细胞组成。在每个细胞中都有相同的染色体组。染色体是 DNA 串,可作为整个生物体的模型。染色体由基因、DNA 块组成。每个基因编码一种特定的蛋白质。基本上可以说,每个基因都编码一个特征,例如眼睛的颜色。性状的可能设置(例如蓝色、棕色)称为等位基因。每个基因在染色体中都有自己的位置。这个位置称为轨迹。

完整的遗传物质(所有染色体)称为基因组。基因组中特定的一组基因称为基因型。基因型是生物体的表型、其生理和心理特征,如眼睛颜色、智力等的出生后发育的基础。

基本遗传算法概述

  1. [开始] 生成 n 条染色体的随机种群(问题的合适解决方案)
  2. [适应度]评估群体中每个染色体 x 的适应度 f(x)
  3. [新人口]通过重复以下步骤创建新人口,直到新人口完成 1. [选择] 根据适应度从种群中选择两条亲本染色体(适应度越好,被选中的机会越大) 2. [交叉] 以交叉概率交叉父母,形成新的后代(子代)。如果没有进行交叉,后代是父母的精确副本。 3. [突变] 以突变概率在每个位点(染色体中的位置)突变新的后代。 4. [接受] 将新的后代放入新的种群中
  4. [替换]使用新生成的人口进一步运行算法
  5. [测试]如果满足结束条件,停止,返回当前种群中的最优解
  6. [循环] 转到第 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


【解决方案1】:

看看你的解释。

基本遗传算法概述

  1. [开始] 生成 n 条染色体的随机种群(问题的合适解决方案)
  2. [适应度]评估群体中每个染色体 x 的适应度 f(x)
  3. [新人口]通过重复以下步骤创建新人口,直到新人口完成
    1. [选择]根据适应度从种群中选择两条亲本染色体(适应度越好,被选中的机会越大)
    2. [Crossover] 以交叉概率与父母交叉形成新的后代(子代)。如果没有进行交叉,则后代是父母的精确副本。
    3. [突变] 以突变概率在每个基因座(染色体中的位置)突变新的后代。
    4. [接受]将新的后代放入新的种群中
  4. [替换]使用新生成的人口进一步运行算法
  5. [测试]如果满足结束条件,停止,返回当前种群中的最优解
  6. [循环] 转到第 2 步

这看起来已经很像一个程序了。如果你接受它并将其转换为代码,那么你应该完成了大约 95% 的工作。您将缺少的是您的“健身功能”,它基本上是解决方案的运行+成功的标准。每个问题都会有所不同,因此我们对此无能为力。但它所做的很可能将染色体的位用作标志或操作码,具体取决于问题的复杂性,并查看染色体是否以及多快(即:位/字节/标志/的当前组合) opcodes/whatever)解决了这个问题。

【讨论】:

  • 是否必须有成功的标准?有没有一种方法可以编程“随机性”或“学习”对我来说似乎是在欺骗我给它一个解决方案?
  • 如果您已经有解决方案的代码,则不需要 GA - 您可以直接对解决方案进行编码。但是,如果您这样做完全是为了自己的启蒙,请意识到计算机不会作弊,除非您对其进行编程。 :)
  • 是的,成功必须有一些标准。否则你将永远被无用的算法所困。 :) 困难的部分是确定如何衡量健康。问题是否得到解决是其中的一部分,但如果有办法获得“接近”的分数,那就太好了。
  • 自然有最基本的成功标准,即生存能力。大自然不会把所有的基因组合都扔进帽子里,然后选择它认为最好的那个,它只是把它们全部放到野外。有些动物出生时有 3 条腿,它们不能长期生存,除非出于某种原因,在该地区这是一种良好的生存能力。这就是真正的突变是如何工作的。您需要做的是量化您想要使用 GA 的任何“生存率”。如果您使用 GA 进行时间安排,则需要量化一个时间表与另一个时间表相比要好多少
  • 很有趣,很难不去想宏大,并插入大自然为突变和生存能力或“成功”采取的所有措施,我对生物学感兴趣,所以它将以生物学为基础,尽可能接近现实世界的进化将是我的标准。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-24
  • 1970-01-01
相关资源
最近更新 更多