首先,我为糟糕的头衔道歉;我想不出这个算法的好名字。
我有阶段的有序列表。每个阶段都有 字符,无序。角色可以分多个阶段发生。
当两个连续的阶段无法连接其强制转换时,会发生交叉,允许重叠,以便在两个强制转换中统一相同的字符,从而在连接中留下重复的字符。或者,非正式地,交叉是指角色需要在组合演员的阵容中同时处于两个不同的位置。在代码中:
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/在这种情况下,出于美学目的,故意忽略约束,但是仍然可以直观地了解我在说什么。
我已经有了一些关于如何解决这个问题的粗略想法,但没有什么可以承受的,我想知道这是否与文献中已经涵盖的某些问题同构。它听起来也很模糊。
自从人们问到,这个算法似乎是自动为故事中的人物故事板生成漂亮时间表的关键,而这正是我打算用它来做的。
答案 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上发布此问题,您可能会有人对此感兴趣。或许它已经解决了,谁知道?