65.9K
CodeProject 正在变化。 阅读更多。
Home

AI:道金斯生物形态/以及其他进化生物

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.80/5 (33投票s)

2007年1月29日

CPOL

4分钟阅读

viewsIcon

175287

downloadIcon

988

对道金斯生物形态以及其他一些疯狂的进化生物的实现。

引言

很久以前,我发现了一个名为“生物形态”的东西,它似乎是由某种计算机程序创建的一堆随机图形。我对此进行了进一步调查,发现这实际上是运行一个流行的 AI 类型程序的结果,该程序实现了理查德·道金斯在其《盲眼钟表匠》一书中描述的一个算法,名为“生物形态”。

道金斯研究了仅凭突变和选择的组合所固有的可能性,以及一种非常强大的发展(解码)过程。

这基本上是一个递归算法,它有一些基因,并使用一些突变和一些随机选择。仅此而已。这是产生各种迷人的虚拟生物所需的一切,有些看起来非常具有遗传性。

道金斯基本系统

道金斯系统中的表型(外观)本质上是分支的树状结构。一个扩展是添加片段(本文未包含)。

基本系统有九个基因,控制诸如

  • 分支角度
  • 分支深度
  • 线条数量
  • 等等。

它利用递归算法进行绘制;如下所示

private void draw(Graphics g, int i, int j)
{
    tree(g, i / 2, j, order, 2);
}

/// <summary>
/// Draws the Dawkins bio-morph structure (No segmentation, in this
/// implementation)
/// </summary>
/// <param name="g">The graphics to use</param>
/// <param name="i">The x position to start drawing</param>
/// <param name="j">The x position to stop drawing</param>
/// <param name="k">The y position to start drawing</param>
/// <param name="l">The y position to stop drawing</param>
private void tree(Graphics g, int i, int j, int k, int l)
{
    try
    {
        if (l < 0)
            l += 8;
        if (l >= 8)
            l -= 8;
        int i1 = i + k * dx[l];
        int j1 = j - k * dy[l];

        g.DrawLine(new Pen(new SolidBrush(Color.White), 1.8F), i, j, i1, j1);
        if (k > 0)
        {
            tree(g, i1, j1, k - 1, l - 1);
            tree(g, i1, j1, k - 1, l + 1);
        }
    }
    catch (Exception)
    {
    }
}

使用该算法,可以创作出一些非常有趣的生物,例如

它们看起来非常自然,不是吗?但是,如果我们向算法中引入分段(本文未实现),我们就可以创建出一些真正奇特的生物,例如这些。基本上,我们使用的是相同的想法,但我们正在创建更多相同基本形状的片段。

类设计

下图说明了代码设计。在展示演示屏幕截图之前,我会简要讨论每个类。

基本上,我为本文创建了两种类型的生物形态。它们是

  • BioMorph,它使用了以下类
    • BiomorphPanel:提供原始道金斯生物形态的渲染。
    • IBioEvolvalbe:由 BioMorphPanel 类实现的接口。
    • BiomorphLayoutPanel:托管多个 BiomorphPanel 对象。然后将其托管在 Windows Form 上,它负责选择一个随机的 BiomorphPanel 来生成新一代的道金斯生物形态。
  • EvolvingCritter,它使用了以下类
    • EvolvingCritterPanel:提供牛骨形态生物的渲染。
    • IEvolvalbe:由 EvolvingCritterPanel 类实现的接口。
    • CritterLayoutPanel:托管多个 EvolvingCritterPanel 对象。然后将其托管在 Windows Form 上,它负责选择最适合的 EvolvingCritterPanel 来生成新一代的道金斯生物形态。
    • EvolvingCritterComparator:提供了 IComparer 的简单实现,允许对 EvolvingCritterPanel 对象集合进行排序,以获得最适合的。

还有一个通用的接口

  • ILayoutPanel:由 BiomorphLayoutPanelCritterLayoutPanel 共同实现,它允许托管这两个面板之一的 Windows Form 生成新一代的生物。

运行应用程序的截图

好的,那么应用程序是什么样的呢?嗯,这取决于当前使用的是哪种生物形态。基本上,有两个链接,根据选择哪一个,主面板将切换以显示正确的生物形态面板。它将是 BiomorphLayoutPanel(道金斯生物形态),或者是 CritterLayoutPanel(我自己的牛骨生物形态)。让我们来看看,好吗?

使用道金斯 BiomorphLayoutPanel 生物形态

窗体上有一个定时器,每 1500 毫秒,它会选择一个随机的道金斯生物形态,并用它来生成新一代的疯狂生物。只有随机选择(没有技巧),你可以得到一些非常具有生物学逻辑的生物。基本上,这都归功于我们前面看到的巧妙的基因解码。

使用 CritterLayoutPanel 生物形态(我自己的牛骨设计)

我之所以有能力创建其他风格的生物形态,主要是为了好玩。这里的区别在于,这些家伙会受到评判,看看哪个应该被用于繁殖。基本上,拥有最大面积、偏好的眼睛颜色和偏好的组成部分,得分会更高,因此它更有可能成为用于繁殖的“阿尔法雄性”。

注意:我们实际上在这里选择了最适合的一个,所以人们希望随着时间的推移,我们会得到形状或颜色相似的生物。但大自然有自己的想法,突变非常强大。玩一段时间你就会明白。

选择自由

对于这两个生物形态面板,用户还可以自由点击他们喜欢的生物;然后它将被用作新的“阿尔法雄性”,用于创建新的一代。

您觉得怎么样?

就是这样了。我只想请求一下,如果您喜欢这篇文章,请为它投票。

结论

我非常喜欢构建这篇文章。希望你喜欢。

来源

  1. http://www.informatics.sussex.ac.uk/users/rudil/FAI_WEB_PAGES/DawkinsBiomorphs.htm

历史

  • v1.0: 2007/01/29。
© . All rights reserved.