不断发展的地形生成器


12

我最近才问这个问题,得出的结论似乎是,尚未真正使用基因编程(GP)进行程序游戏内容创建。我想改变那个。

我相当确定可以部署GP来帮助查找新的地形生成器。我要解决的问题是如何实现?

所有GP都有一些可以归纳为所有GP的基本部分(父母选择,重组,突变,存活)。我可以自己解决这些问题。问题出现在特定问题部分。这些就是您在代码中表示问题的方式(通常使用一棵树),以及如何评估生成器的性能(可以是一个或多个值)。

简而言之,这些问题是:

  • 您将如何以可以解析为树的方式表示地形生成器?

  • 这将产生什么样的地形?(高度图,顶点图...)

    基于hightmap的信息越少越好。

  • 用什么来评估解决方案的适用性?

    例如:我们想要有趣的地形,因此我们可以让其中一个值为地形上每个顶点的法线平均变化。


1
我真的觉得您不想要GP,而是GA。例如,创建噪声的算法实际上很难即时生成,并且创建适应性函数要比创建满足该要求的系统更难。GA更适合调整现有系统的参数。
DampeS8N 2011年

GP提供了人们从未真正想到的有趣的解决方案。那就是我要找的东西。GP很难使用,这可能不是行业中使用它的最佳方法,但事实证明,它会显示出一些重大的可行性。
亚历克斯·谢泼德

Answers:


11

使用类似于卡尔·西姆斯(Karl Sims)的遗传图像的方法可能会有些运气。

他使用一组类似于LISP的语言的简单运算符,以便可以使用任何运算符的输出来影响图像,这与某些着色器语言类似(例如,标量将是灰度值,a vector3将是RGB等)。 )。

尽管我猜这是实现的东西,所以您可能想要的是他的关键字,该关键字(iirc)包含所有基本知识:

  • 触发函数(sin, cos, tan等)。
  • 位置(x, y
  • 基本数学运算符(sqrt, pow, abs, inverse
  • 噪音功能(fBm, noise2, noise3
  • 其他分形(mandelbrot, julia
  • 插值功能(lerp, quad, step, smoothstep

(以上某些内容可能未在他的实现中实现;我很久以前就发现了他的工作,并且多年来实际上已经对您所描述的内容进行了一些尝试,因此回忆可能会泄漏:)

保持趣味性(快速)

我对多层方法有一点运气,这种方法极大地减少了死角演化的数量。

  1. 为每个运算符生成一组范围(或从前一轮进行了变异)
    • 理想情况下,这些值会将每个函数的值保持在“合理”的范围内,但可以演变为产生令人惊讶的有用结果的范围,这似乎是“正确”的事情
  2. 生成一些算法树
    • 为每一个在随机位置生成一些高度图并评估适合度
    • 如果我们有很多很好的匹配项,那么请稍微扩展该分支,以稍微干扰每个孩子从第1步开始的范围
    • 否则,我们的量程可能很差,请回到步骤1

然而...

现在,我方便地跳过了适应度算法,我主要使用Karl Sims的“非自然选择”方法,在该方法中,您可以看到一堆后代的中间方框中的当前一代(在今天,Kai的Power Tools对其进行了流行-这是我的意思图片)。

但是,您可能会拥有一组训练图像,可能是来自卫星图像的一些训练图像,还有一些具有特定质量的人造图像,然后可能会对它们与要测试的地形进行小波或2D FFT分析?

这是一个有趣的话题,但我怀疑您需要什么答案:)

编辑:啊。因为我是新用户,所以不得不删除一堆链接:-|


这似乎导致了我所遇到的同样的事情,这些算法并不是为了不断随机生成内容,而是在训练针对单一或有限结果集的生成……并且仍然需要人工进行选择。
詹姆斯

据我所知,适应性必须基于对结果的一些统计分析。我可以想出的因素是,在单个生成的地形内,在一定数量的生成地形上平均的方差量(最大化),以及对标准偏差(最小化,以确保方差的稳定性)的值。但是后来我想我们也必须最大化两个生成的地形之间的平均高度变化。
亚历克斯·谢泼德

1
@Alex也许本文也会引起关注。我想如果您将上面提到的某些技巧转为头脑,可以使用它来指导健身。(或者也可能正是您想要的:)
pentaphobe

@phobius WOAH!凉。我需要对其进行更多探索,但是看起来确实很有希望。现在将其变成搜索问题...
Alex Shepard

2

我不确定您是否可以回答这个问题,但是我对为什么可能是一个有用的答案有一个解释。因此,简而言之,答案:

  • 您将需要选择一个地形生成,其中某些方面可以仅基于数据值。这并非难事,但确实需要您选择地形生成。由于我正在工作的区域是体素生成区域,因此采样率,隧道通过,高程等都可以放入数据中并“演变”。
  • 与第一部分密切相关。只要您可以设置生成的不同属性,那么生成的形式实际上并不重要。这个选择应该与您要制作的游戏类型有关。
  • 这是它分解的地方。除了一个人实际观察世界并走向“哦,太好了”之外,我想不出一种方法来衡量这一点。但这消除了计算机进行自己的自我迭代的能力。这也意味着您将要使用这种形式的生成最终创建一个单一的世界,寻找“最佳”一个世界,而不是每次都寻找一个随机世界。

遗传算法通常用于解决已知问题,您可以通过规则定义环境。然后,您可以创建代表不同属性的数据集,这些属性会影响事物对规则的反应。然后,计算机使用初始数据集进行“回合”,选择前X个数字,将它们配对在一起后混合它们的值,然后再进行回合。一个常见的示例是“繁殖更好的巨魔”(进行育种找到一套巨魔在其环境中通常表现出色的价值观(能够狩猎和进食,杀死或远离村民,可以收集战利品并积聚其想要的所有闪亮物体,等等)。

我只是不确定您要完成的工作是否适用于地形生成领域。我唯一能想到的就是游戏内容评估,您不想规划一个世界,但想要使AI路径可以很好地计算出来。即使这样,您仍在寻找一个或至少一个有限的世界。


啊...我想您正在将进化算法与遗传程序混淆。EA用于优化和调整算法的输入。GP用于构建算法本身,这就是我要寻找的。很好的答案。需要注意的是:这些地形不必现实,只需有趣即可。
Alex Shepard

如果您不能以编程的方式定义“有趣”,那么您将遇到我试图解决的问题。
詹姆斯

0

这将产生什么样的地形?(高度图,顶点图...)

绝对是顶点图(网格),在存储上是紧凑的,并且可以根据需要进行栅格化(镶嵌)。

您将如何以可以解析为树的方式表示地形生成器?

细胞自动机。我可以想到两个实现:

  1. 规则集自动机,可能带有有限自动机的元素(当考虑当前状态(如尝试计数器或空闲时间)时)。

    • 每个节点都以随机状态初始化
    • 每个节点都附加有一个求解器实例
    • 每个求解器都会继续计算下一个状态,直到用完规则或达到理想状态为止(我在这里完成了)
    • 首先计算所有下一个状态,然后在下一次计算开始之前一次全部应用,因此计算顺序无关紧要

规则集本身可以表示为分支决策树或简单的命令批处理(不确定是否可以使用)

这只是每个节点的一个规则集

  1. 世界建设者。可以为每个节点创建一堆并允许它们导航网格,而不是为每个节点应用求解器。

    • 每个构建器都有自己的规则集
    • 防止它们进入另一个构建器占用的节点
    • 每个构建器都可以表示为树的一个分支
    • 在发展过程中,建设者可能会重复

不过,我仍然担心第二种方法需要第一种方法的支持:初始随机性需要平滑,而且我不确定建造者是否可以做到这一点。毕竟,每个活细胞确实都有线粒体。

用什么来评估解决方案的适用性?

最终地形的完整性-它看起来不应该像泥泞的土豆泥。多样性-通常我们希望尽可能多地表示可用的变化(从一个边缘到另一个边缘的平坦荒地很无趣)。也许更复杂的东西,例如相邻节点之间如何相互适应(沙漠中央的苔原,是什么?)

如果有空闲时间,可以用网格生成器为自己尝试一下

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.