以下是一个例子:
输入为:Iterm1,Item2,Iterm7和Item98。算法应根据这些列表对输入进行排序。
在机器学习方面我正在寻找一种能够根据许多部分有序列表的训练集来预测项目列表(AKA活动列表)的“正确”顺序的算法。项目,每个部分有序的项目列表可能包含活动列表不包含的其他项目。
答案 0 :(得分:4)
使用输入元素作为节点构造有向非循环图(DAG),并且当且仅当Itemi出现在某个列表中的Itemj之前时,才定义Itemi和Itemj的边。然后,您可以通过在DAG上执行topological sort来获得所需的订单。
答案 1 :(得分:1)
我认为你的意思是排序列表定义了部分排序,是吗?即如果Item1出现在其中一个列表中的Item2之前,则应将其视为“更大”。
如果这是正确的,那么首先要以更方便的形式表示,例如,矩阵M
,如果Item1在其中一个列表中的Item2之前,则为M[1][2]==1
。然后我们有一个简单的比较器函数:
if M[X][Y] == 1:
return 1 # X > Y
elif M[Y][X] == 1:
return -1 # Y > X
else
return 0 # the elements are not comparable
我们现在可以根据此比较器对输出进行排序。
您可能希望在排序之前在此矩阵上运行传递闭包(Warshall算法),以防有例如列出Item1> Item3和Item3> Item2,但没有列出Item2将与Item1一起出现的列表。传递闭包将允许从两个列表中推断出Item1应该在Item2之前。
答案 2 :(得分:1)
我将根据输入组成加权图(A> B之间的链接数是权重),将其放入N * N矩阵,并在矩阵上执行幂迭代(GIYF)。