寻找用于对节点中的集合进行排序以满足布局约束的算法

时间:2013-12-30 15:51:06

标签: algorithm topology

首先,我为糟糕的头衔道歉;我想不出这个算法的好名字。

我有阶段的有序列表。每个阶段都有 字符,无序。角色可以分多个阶段发生。

当两个连续的阶段无法连接其强制转换时,会发生交叉,允许重叠,以便在两个强制转换中统一相同的字符,从而在连接中留下重复的字符。或者,非正式地,交叉是指角色需要在组合演员的阵容中同时处于两个不同的位置。在代码中:

uncrossed = [D, F], [N, V, S]
overlap = [D, F, V], [V, N, S]
crossed = [D, V, F], [N, V, S]

在第一个例子中,V不是D和F,所以没有任何交叉。在第二个例子中,V是D和F,然后是N和S,但这不是问题,因为排序允许(重叠)无交叉连接。然而,在第三个例子中,排序强迫交叉。

就我的目的而言,过境可以在非连续的舞台上进行,就好像角色在演员表演时没有“在舞台上”时实际上没有偏离他们先前的演出顺序。

我想订购每个阶段的演员阵容,以便尽可能少的交叉点,理解绝对有可能遇到交叉不可避免的情况。需要交叉的示例系列:

required = [A, B], [B, C], [A, C], [A, B]

这听起来非常抽象和愚蠢,所以我将提供一个人类解决这个算法的具体例子,其目的与我的相似:http://xkcd.com/657/在这种情况下,出于美学目的,故意忽略约束,但是仍然可以直观地了解我在说什么。

我已经有了一些关于如何解决这个问题的粗略想法,但没有什么可以承受的,我想知道这是否与文献中已经涵盖的某些问题同构。它听起来也很模糊。

自从人们问到,这个算法似乎是自动为故事中的人物故事板生成漂亮时间表的关键,而这正是我打算用它来做的。

1 个答案:

答案 0 :(得分:0)

这不是一个答案,但我认为可能是一个更准确甚至更正确的你正在寻找的方式:

字符有一个集合,称之为C场景有一个有限的有序序列S_1, ... S_n,其中a scene 是由一些字符组成的集合。字符可能(通常也会)出现在多个场景中。

我想用与你的措辞略有不同的方式表达你想要的结果,因为我认为它可以让人更清楚如何寻找解决方案(或者至少,它使得如何粗暴地说明 - 强制解决方案):

我们算法的输出是一系列字符的排列。字符的排列只是有序元组[c_1, ... c_m]的排列,其中c_i是字符,总共有m个,所以C = {c_1, ..., c_m}。我们总共要n个安排,称它们为A_1, ..., A_n,每个场景一个。

A_n对应的排列方式是在场景n期间,在场景n中,角色的从上到下的排序顺序如下:在故事板中绘制一条垂直线穿过场景A_n。此行应按S_n指定的顺序命中字符的生命线。

我们需要以下属性:给定场景A_n,安排S_n需要将S_n = {c_2, c_3, c_5}中包含的字符放入一个连续的块中,具体如下:假设A_n。然后,[c_1, c_4, c_2, c_3, c_5]可能会产生[c_2, c_1, c_3, c_4, c_5],但可能不会产生A_i。这是因为你不希望错误的角色“切入”故事板中的场景。

我们希望尽量减少“过境点”的数量。在这里,交叉很容易定义:A_(i+1)A_i之间的交叉数量恰好等于从排列{{1}开始所需的相邻字符的转置次数置换A_(i+1)


我没有给你一个答案,但我认为,鉴于上述设置,蛮力的方法不是很难编码,如果故事板不是,你会在一夜之间给你答案而没有问题太大了。

我认为如果您在MathOverflow上发布此问题,您可能会有人对此感兴趣。或许它已经解决了,谁知道?