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