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






4.80/5 (33投票s)
对道金斯生物形态以及其他一些疯狂的进化生物的实现。
引言
很久以前,我发现了一个名为“生物形态”的东西,它似乎是由某种计算机程序创建的一堆随机图形。我对此进行了进一步调查,发现这实际上是运行一个流行的 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
:由BiomorphLayoutPanel
和CritterLayoutPanel
共同实现,它允许托管这两个面板之一的 Windows Form 生成新一代的生物。
运行应用程序的截图
好的,那么应用程序是什么样的呢?嗯,这取决于当前使用的是哪种生物形态。基本上,有两个链接,根据选择哪一个,主面板将切换以显示正确的生物形态面板。它将是 BiomorphLayoutPanel
(道金斯生物形态),或者是 CritterLayoutPanel
(我自己的牛骨生物形态)。让我们来看看,好吗?
使用道金斯 BiomorphLayoutPanel 生物形态
窗体上有一个定时器,每 1500 毫秒,它会选择一个随机的道金斯生物形态,并用它来生成新一代的疯狂生物。只有随机选择(没有技巧),你可以得到一些非常具有生物学逻辑的生物。基本上,这都归功于我们前面看到的巧妙的基因解码。
使用 CritterLayoutPanel 生物形态(我自己的牛骨设计)
我之所以有能力创建其他风格的生物形态,主要是为了好玩。这里的区别在于,这些家伙会受到评判,看看哪个应该被用于繁殖。基本上,拥有最大面积、偏好的眼睛颜色和偏好的组成部分,得分会更高,因此它更有可能成为用于繁殖的“阿尔法雄性”。
注意:我们实际上在这里选择了最适合的一个,所以人们希望随着时间的推移,我们会得到形状或颜色相似的生物。但大自然有自己的想法,突变非常强大。玩一段时间你就会明白。
选择自由
对于这两个生物形态面板,用户还可以自由点击他们喜欢的生物;然后它将被用作新的“阿尔法雄性”,用于创建新的一代。
您觉得怎么样?
就是这样了。我只想请求一下,如果您喜欢这篇文章,请为它投票。
结论
我非常喜欢构建这篇文章。希望你喜欢。
来源
历史
- v1.0: 2007/01/29。