从具有连接要求的预定义元素生成有向非循环图

时间:2016-02-15 21:33:57

标签: algorithm graph graph-algorithm directed-acyclic-graphs procedural-generation

我正在研究一个系统,当给定一组不同类型的元素时,会创建一个连接部分或全部元素的有向无环图。每个元素都有一些输入A和一个输出B.构建图形时,系统需要确保前一个节点的输出与当前节点的输入相匹配。

节点的输入和输出是为了确保只连接某些类型的元素

元素看起来像这样

ElementName : Input -> Output

可能有多个输入/输出,或没有输出(见下文)。

One : X -> Y
Two : Y -> Z,F
Three : Y, Z -> W
Four : Z -> F
Five : F -> NULL

注意:

我们现在谈论的是很多不同的元素,大约30个左右,但计划是随着时间的推移增加更多元素。

这是进行程序生成叙述的项目的一部分。节点是单独的任务。输入是您开始任务所需的输入。输出是故事状态的实现方式。

问题:

我已经看到了几种不同的生成随机DAG的方法,而不是根据某些预设连接要求制作DAG的方法(有关连接它们的规则)。 我还想要一些限制图的复杂性的方法。即限制他们可以拥有的分支数量。

我想要的想法:

你在垃圾箱里有很多不同类型的连音,比如说30.你有连接乐高积木的规则。

Blue -> Red
Blue -> White
Red -> Yellow
Yellow -> Green/Brown
Brown -> Blue

众所周知,除了颜色外,每个乐高都有一个形状。所以2个蓝色的乐高可能不是同一类型的乐高。所以我们的目标是建立一个符合我们规则的大型结构。即使按照我们的规则,我们仍然可以将lego连接成一堆不同的结构。

P.S。我希望这不是一般问题。如果是,请记下,我会尝试使其更具体。

1 个答案:

答案 0 :(得分:1)

听起来像L-system(又名Lindenmayer系统)方法可行:

  • 您的乐高积木类似于符号字母
  • 您的连接规则对应于将每个符号扩展为更大的符号串的生产规则集合
  • 您的起始乐高代表了开始施工的最初“公理”字符串
  • 生成的几何结构是您的DAG

最简单的方法是:给定乐高,随机选择有效的连接规则&添加一个新的乐高到DAG。从那里你可以根据需要增加更多的复杂性。如果您需要将随机选择倾斜以支持某些规则,那么您实际上是在构建stochastic grammar。如果规则的选择取决于先前生成的DAG部分,则它是context sensitive grammar的类型。

Graph rewriting,从基本图形算法创建一个新图形,可能是一个更直观的解决方案,但我个人发现L系统更容易内化和对它们进行研究产生的结果本质上不是过度的学术/理论。

L系统本身属于formal grammars类。可能值得检查一些相关的想法,但是至少(至少对我来说)以理论上的东西来跟踪核心开发是非常容易的。