2

我正在尝试为 Rhino 开发一个插件,它可以生成建筑平面图(基于 Shape Grammars)。该插件是使用 RhinoCommon API 用 C# 编写的。使用不同的规则,表示为染色体中的基因,我转换了起始几何。使用 GA,适应度函数确定变换规则的最佳序列,以生成符合参数标准(面积、视图、最小构造等)的几何图形。

由于几何代表建筑,因此需要遵守一些建设性的规则。我的问题是关于遗传算法的一般方法: 我什么时候检查染色体创建的几何形状的有效性?在基因插入点还是我只是给无效的几何图形一个不好的适应值?

当我向染色体添加一个基因(代表几何变换操作)时,我可以检查这是否会导致无效的几何形状。例如:我的起始形状是一个矩形:

长方形

一种转换选项是将一个矩形边分成两部分。该基因看起来像这样:[DIVIDE:TOP:0.25]。这将创建一个包含两个段的边,在四分之一处拆分:

分割矩形

如果我已经知道一个片段必须有一定的长度,那么这个基因可能会创建无效的几何图形。在上面的示例中,顶部的红色部分太短。我是在基因插入点实施此几何检查(对于其他规则可能比所示示例更复杂),还是等到适应度函数验证它?在这个例子中,检查将是当我添加一个片段分割基因时,我检查结果片段是否在允许的范围内?不检查可能会导致由生成无效几何形状的染色体组成的群体,或适应度非常差的个体。检查可以保证具有“有效”染色体的种群,但染色体的生成可能需要更长的时间。

什么是更好的策略?

4

2 回答 2

4

我认为这两种方法实际上都应该可以正常工作,并且取决于您的其他参数,它们的行为几乎相同。只要永远不会选择无效基因组作为父母,让无效基因组通过将与在基因插入点移除它们相同,只要在第一种情况下您的人口显着大于第二种情况。假设您估计大约 33% 的基因插入会导致无效的基因组。然后,您希望让无效基因组通过时的种群数量是产生无效基因组时拒绝无效基因组的 3 倍。在这两种情况下,该算法将只允许选择有效的基因组作为父母,从而导致非常相似的结果。

不过,在您的情况下,在插入点拒绝无效基因组可能更容易,这将确保所有潜在的父母都是有效的。

最后我想指出的是,如果您使用大量评估时间来拒绝无效基因组,您可能需要考虑更改遗传算子的方法,以便它们只能产生有效的基因组。我不确定在您的 GA 中执行此操作的最佳方法,但通常在遗传编程中使用开发方法,该方法仅强制对“胚胎”解决方案进行有效更改。

于 2013-02-06T14:59:26.913 回答
0

我认为检查必须在胚胎(映射)功能和适应度中,因为两个有效父母(DIVIDE:TOP:0.25)和(DIVIDE:BOTTOM:0.05)之间的交叉可能会产生像(DIVIDE:TOP)这样的后代:0.05) 这会创建太短的段,即使语法是允许的。由于这必须通过适应度函数进行评估,因此在基因创建或突变点进行检查是多余的。

于 2013-02-08T14:01:03.080 回答