【问题标题】:Making of Genetic algorithm遗传算法的制作
【发布时间】:2013-05-15 18:29:06
【问题描述】:

我刚刚学习遗传算法时,我被分配了一项任务来设计一种遗传算法,该算法学习预测一个人是否会在给定数据集的情况下投票赞成或反对的规则。

我已经连续 2 天在书籍和互联网上阅读有关 GA 和 GP 的信息。所以现在我有点理解遗传算法关于种群管理、遗传算子、适应度函数和不同类型交叉掩码的交叉的概念。但是我仍然远远没有为给定的数据集制作自己的 GA。我只是不知道如何开始或从什么开始,我有点绝望,因为我觉得我对此很愚蠢。

因此,我们将不胜感激任何形式的帮助,例如提示、技巧或伪代码!

给定的数据集如下(组):

G1 | G2 | G3 | G4

A1 | B1 | C1 |无

A2 | B2 | C2 | D2

A3 | B3 | C3 | D3

A4 | B4 | C4 | D4

A5 | - | - | D5

好吧,数据不是a,b,c。它们是其他更长的东西,但我有点懒所以是的:P - 意味着没有更多的属性。请注意,none 是一个属性。 感谢您的任何帮助!

【问题讨论】:

  • 您必须更具体地了解您的数据代表什么,因为我不知道。我的第一个猜测是 G1-G4 是一个人的属性,但是它缺少一个说明这个人是否投票的字段。顺便说一句,这并不是我所说的从 GA 开始的好人选,这听起来有些先进。
  • 我以前见过一种方法,其中群体中的每个基因组都类似于decision tree。这可能是一个起点。或者,这可能会使您应该做的事情变得过于复杂。

标签: genetic-algorithm


【解决方案1】:

首先,您必须首先确定要使用数据集解决的问题。您通常使用遗传算法来解决非确定性问题:需要很长时间才能解决的问题,但其答案很容易验证。

所以第一个问题是:你的数据集代表什么?

第二个问题:您要解决什么问题?遗传算法是否适合解决您的问题?

无论如何,创建遗传算法是通过以下步骤完成的:

  1. 将问题变量域表示为一条固定长度的染色体,选择种群大小N,交叉概率p(c)和变异概率p(m)
  2. 定义适应度函数 f(x) 以测量问题域中单个染色体的性能或适应度。适应度函数为选择在繁殖过程中交配的染色体奠定了基础
  3. 随机生成大小为 N 的初始染色体群体:x1x2、...、xn
  4. 计算每条染色体的适应度:f(x1), f(x2), ..., f(xn)
  5. 从当前种群中选择一对染色体进行交配。以与其适应度相关的概率选择父染色体。与不太适合的染色体相比,高度适合的染色体更有可能被选中进行交配。
  6. 通过应用遗传算子 - 交叉和变异创建一对后代染色体
  7. 将创建的后代染色体放入新种群中
  8. 重复第 5 步,直到新染色体种群的大小等于初始种群的大小 N
  9. 用新的(后代)种群替换初始(父)染色体种群
  10. 转到第 4 步并重复该过程,直到满足终止条件。

因此,您必须为您的解决方案找到一个符号(例如位数组或字符串),以便您轻松交换部分染色体。然后你必须识别交叉和变异操作。 如果您正在处理有序染色体,那么根据应用的交叉策略,您可能必须在之后修复您的染色体。有序染色体是顺序或基因很重要的染色体。如果您对代表旅行商必须访问的城市的两个解决方案执行标准交叉,您最终可能会得到一个染色体,其中他访问了一些城市两次或更多次,而另一些则根本不访问!

没有关于如何在遗传算法中翻译每个问题的明确描述,因为每个问题都不同。上述步骤不变,但您可能需要引入几种不同的交叉和变异操作以防止过早收敛。

【讨论】:

    【解决方案2】:

    好吧,我对数据集的描述不是很了解,所以我的回答是基于以下假设: 我们有一组属性,比如说 n 个不同的属性。每个属性都有一组不同的可能符号(=非数字)值,比如 m(i) 个不同的可能性。每个人都有相同的属性,但其中一些可能会丢失或没有。

    如果这些假设是正确的并且属性集和可能的值不是太高,那么其中一个可能会起作用:

    • 如果这两个集合非常小,您可以将 n 维数组作为个体/基因型。每个维度的大小都是 m(i),这个结构的每个值都是是/否的答案。这将是固定大小(位)向量的泛化(=更多维度)。如何创建随机/变异/交叉应该很容易。健康状况是它做出良好预测的频率。

    • 如果它们更大,那么您将需要更复杂的东西。一种可能性是拥有规则列表。每个规则可以是一个长度为 n + 是/否标志的向量。在向量的每个位置,您都会有相关属性的可能值。你也可以有一个快乐的小丑属性来接受一切。 规则解释 (p:person, r:rule) : 如果 p1=r1 and p2=r2 and ... pn=rn 那么结果就是规则的标志。 您必须评估规则,直到找到匹配的规则。您还需要一个默认值。 在这种情况下,遗传运算符有点棘手,但我认为如果您搜索可变长度编码,您会发现一些东西。 我使用了类似的编码(针对不同的问题)并且效果很好。

    • 为了使其更通用(但也更复杂),您可以将规则表示为内部节点为和/或/非以及可能的其他逻辑运算符的树,叶是诸如 pi=ri 之类的谓词。这将是一种基因编程,如果您喜欢这种解决方案,请在谷歌上搜索。

    说实话,我不能 100% 确定遗传算法是否是解决这个问题的最佳选择,尤其是在值不是符号而是数字的情况下。这似乎是一个模式匹配问题,为此有更好的解决方案。我会寻找一些替代品,例如数值情况下的神经网络。

    【讨论】:

    • 感谢您的提示。 @Sandor 数据集与最初帖子中描述的数据集一样大,我必须使用 GA,因为这是一项要求。如果我理解你是正确的,所有的值都是象征性的。例如,G1 包含人的颜色,例如黑色、白色、棕色等。这个任务是基于我之前在另一个案例中使用的先验数据集。该数据集投票是/否,我猜测,因为在这个问题中没有提到它,所以由我决定是否使用该分类。仍然不太清楚如何解决这个问题,希望得到更具体的东西。
    猜你喜欢
    • 2021-08-04
    • 2016-09-11
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 2011-07-22
    相关资源
    最近更新 更多