历史记录生成算法如何工作?


19

我听说过游戏《矮人要塞》,但只有现在我在YouTube上关注的一个人对此进行了评论……当我注意到矮人要塞实际上如何为世界创造历史时,我感到非常惊讶!

现在,这些算法如何工作?他们通常做什么除了模拟的时间长度,将作为输入?它们的具体程度如何?

更重要的是 可以用Java语言制作,还是Java语言太慢?(我猜这取决于模拟的深度,但以矮人要塞为例。)


3
“它们可以用Java语言制作吗?” 答案显然是肯定的,但这取决于您想要多快的结果以及您想要多复杂的结果。矮人要塞也需要一段时间-随着世界的变老,它的速度会变慢!因此,只要您需要浅薄的历史记录,是的,您可以使用Javascript来完成,因此这取决于您希望历史记录的复杂程度。
doppelgreener 2012年

2
他的意思是“相当于矮人要塞”。
MichaelHouse

2
@Bane是的,我的意思是您可以更改DF中的历史记录数量。创建世界时,它首先随机生成地形,然后在您眼前开始老化该世界并随其生成历史。您会看到它随着帝国的扩张和收缩,地形的变化,森林的生长和后退,随着区域的困扰(或不再被困扰)等等。它逐年(或者实际上一次数年)在您眼前发展。这一直持续到您告诉它停止为止。越远,生成速度就越慢(由于CPU使用率,而不是游戏机制)。
doppelgreener 2012年

1
非常清楚:世界越老,每年计算的速度就越慢。在一个年轻的世界中,它将奔波于最初的几年,在一个拥有数百年历史的世界中,第二年可能会花费一秒钟或几秒钟的时间。
doppelgreener 2012年

1
哦,那我知道。我所说的“深度”不是指年数,而是指事件发生的数量以及模拟的精度。您可以保留一个帝国有多少人,或者您实际上可以拥有一个名为的类Person,该类负责琐事,参军等等。深深地要每个士兵为自己而战。
jcora 2012年

Answers:


27

首先,有一些关于矮人要塞的历史线索。不久前有人在Bay12论坛提问,并分享了笔录,您可以通过搜索“今天的主题是世界的一代和历史的一代”来找到讨论的起点


我不确切知道《矮人要塞》是如何做到的,但是我将解释我打算如何在游戏中实现一个非常基本的初稿。我将使用一个简单的元胞自动机。如果您浏览这些Spore原型,例如细胞培养和生物群落。

在此处输入图片说明

这些是蜂窝自动化及其产生的结果的示例。本质上,我将为不同种族创建规则。规则的一些示例包括:

  • 他们对其他种族的敌意
  • 他们的气候偏好
  • 他们的资源需求
  • 他们的出生率和寿命
  • 他们的愿望(技术研究,商业,和平存在,世界统治)
  • 他们的能力(结构建设,资源搜集,作战等)
  • 等等...

因此,所有这些工作最关键的输入就是将这些种族纳入其中的世界。地形将决定他们的喜好和扩展。因此,一旦您创建了一个世界,请在世界上随机选择这些种族适合生活的地方并让他们放松。现在有趣的事情开始发生。既然您拥有拥有欲望和能力的土地和种族,就可以开始建立历史。这些种族收集资源,然后构建结构:

  • 资源丰富,宜居的城镇
  • 道路连接着较大的城镇。
  • 跨河桥梁
  • 穿越山脉的隧道
  • 为响应战争而在前线附近的堡垒

任何结构都可以被其他种族突袭/征服。历史上存在的建筑物(如城镇或堡垒)时间越长,防御性越强,越难接管。对于需要控制的种族来说,这是更理想的选择。在种族相遇的地方进行战斗(至少有一场是敌对的)。战斗以地标或附近的建筑物命名,或者如果战斗是重要的或未命名地标,则地标以战斗命名。

道路,桥梁和隧道通过商业和资源运输得到扩展。每个都有最大吞吐量,可以随着资源支出而增加。在草原中间建造石头堡垒?这些道路将大量用于运输所需的石材。它们会变大并获得名称。

发生自然灾害,影响人口和历史进程。地震可能会使城镇沦为废墟或使隧道倒塌。洪水可能会冲刷道路或桥梁。


它不像《矮人要塞》那样深入,但这是一个开始。现在,您可以想象,并且(正如Johnathan Hobbs提到的),这些种族越扩展,所模拟的细胞就越多。不仅要模拟更多的单元,而且模拟也更加复杂,因为现在有许多要构建/维护的结构,与工资的斗争,从商业到……的商业等等。这对于任何语言来说都是沉重的负担。Javascript可能会更快变慢。但是,您始终可以牺牲复杂性来提高速度。

这全都是模拟(尽管很复杂),您只是沿途记录了重要事件并称之为历史。

我还刚刚找到了一个Bay12论坛帖子,人们在集思广益,如何使矮人要塞世界更快。我没有读过它,但是如果您遇到实施速度太慢的问题,它可能会提供一些提示。


一如既往,功能强大,内容丰富,@ Byte56。:)
jcora 2012年

1
谢谢贝恩。也许并非总是如此,只是人们问我想知道的问题。感谢您给予我更多思考的机会,并写下一些东西:)
MichaelHouse

4

附带说明一下,JavaScript并没有您想象的那么慢

浏览器开发人员已经花了 大量时间和精力来优化其JavaScript引擎。我链接到的基准测试表明,在基准测试任务中,JavaScript的中值仅比C慢5倍,而对于其他某些解释型语言则不能这么说。而且下界更加令人印象深刻:与C相当

当然,语言基准测试并没有太大意义-您可能会使用其他基准测试找到反例。但是关键是JavaScript 相当快。不,它不是C或C ++,并且也没有尝试这样做。但是最好不要陷入“解释语言==慢”的思维定势中,因为对于非平凡复杂性的任何任务,性能对算法设计的影响更大,而对语言选择的影响则较小。

我本来打算在评论中写所有这些内容,但是我空间不足。


1

是的,它可以基于javascript构建,检查ASM.js之类的程序,它们的速度几乎是C的2倍。如果您照顾多个内核(使用Webworker),它的速度甚至可能比DF快(就资源而言) ,现在是单核。

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.