我想通过使用特定格式的某些事件来生成空间。让我用一个小例子来解释这个问题。
假设我有事件a,b,c,d,e,f。我将有3个长度的序列作为由这些事件组成的输入。从这些序列中我想生成6个长度(事件数)序列,序列中不会有重复的元素,即每个事件只使用一次。 6长度序列需要满足一些规则。(在例子中解释)
示例:
Input:
list1:['a','b','c']
list2:['c','d','e']
list3:['b','c','d']
list4:['a','c','g']
list5:['f','g','e']
List1描述了,b和c将出现在a之后,而c将出现在6长度序列中的b之后,即,当顺序变化序列也发生变化时。同样地,List2描述了d和e将在c之后,e将在d之后。将采用所有列表并记录规则。在从这些序列中提取所有规则之后,我需要生成符合规则的6长度序列。作为一个例子;
让我们说在我们的例子中(为简单起见)输入是List1,List2和List3
Input:
list1:['a','b','c']
list2:['c','d','e']
list3:['b','c','d']
然后这些列表的一些结果是;
['a','b','c','d','e']
:它遵循提取这三个列表的所有规则,比如b和c来自a,d和e来自c,c和d来自b之后。来自这里的重要说明,如果c需要在a之后,它们不需要在输出序列中相邻(6长)
无法保证6长度序列始终存在。首先,需要检查是否存在至少一个这样的序列。如果不是,算法应该返回false。举个例子;假设我们的输入是Lis1,Lis2,Lis3,Lis4和Lis5。
Input:
list1:['a','b','c']
list2:['c','d','e']
list3:['b','c','d']
list4:['a','c','g']
list5:['e','g','b']
a => b => c => g => b这是不可能的,因为b不能自己来。
我需要一种算法来在Python中生成这些序列。我现在没有任何代码,因为到目前为止我无法想到任何有效的算法。它也需要非常有效地找到更长的序列。
如果问题不明确,请现在就告诉我。
谢谢
答案 0 :(得分:3)
这是一个起点:
import networkx as nx
from itertools import tee, izip
list1 = ['a','b','c']
list2 = ['c','d','e']
list3 = ['b','c','d']
g = nx.DiGraph()
for items in [list1, list2, list3]:
a, b = tee(items)
next(b)
g.add_edges_from(izip(a, b))
print nx.topological_sort(g)
# ['a', 'b', 'c', 'd', 'e']
如果图表包含循环,则会引发异常......
答案 1 :(得分:1)
您可以将模型构建为Directed Acyclic Graph。 networkx python库将为您处理所有图形内容。
要生成随机6个元素序列,您可以枚举所有可能的序列,然后从具有6个元素的序列中随机选择
(糟糕但有效)算法的草图: