2015-06-19 41 views
1

我运行的是一个体育网站,根据他们以前的会议将人员排在彼此之间通常很有用。如何对这个“矩阵”数据进行排序?

参见本实施例中设置的数据:

在左边是原始 “未分类” 的说法。右侧是正确排序的(在我看来)列表。

每个方块显示他们互相竞争的次数和胜利的百分比。他们根据百分比着色。

我在网页上有这个,在每一行旁边都有“向上”和“向下”的控件,我可以手动将它们四处移动,直到我得到我想要的。

我只是不确定自动执行此操作的最佳方法。

每行末尾的数字是我粗略出来的一个快速想法,并等于(百分比-50 *列号)行的总和。正如你所看到的,他们做得相当不错,只有前两行是“错误的”。他们没有给予任何会议次数的重量,但只有赢的比例。

根据行顺序,最终列数也会发生变化,这可以通过比较图像中的左右表来看出,因此对初始值进行排序不会很好。循环排序+重新计算几次就可以完成这项工作。

我希望我可以拼凑一些东西在一起,使这项工作...但我觉得所以这将有一些更好的想法,我会大声耳朵。

+0

一个快速的想法:有可能A超过50%的时间,B超过50%的时间,C超过50%的时间。那么“应该”发生什么? –

+0

这是可能的,但这是一个边缘案例。通常情况下,你可以分开他们与其他人的比较。如果没有分裂的方法,那么将它们组合在一起作为配合就足够了。 – Codemonkey

回答

1

A tournament是一个图,其中每对顶点之间只有一个有向边;从你的输入中创建一个图形,你可以为每个玩家制作一个顶点的图形,然后按照赢得大多数游戏的玩家的方向“指向”两个玩家之间的每个边缘(你需要打破关系不知何故)。

如果你做到这一点,如果没有周期A> B> ...>我在这个图表注释中提到的类型的,那么该图是传递,你可以订购玩家使用图的topological sort。这对于n个玩家来说只需要线性时间,即O(n^2)。

如果有这样的周期,那么没有“完美”的玩家排序:任何排序都会将至少一个玩家排在他们被击败的玩家之后。在这种情况下,合理的选择是寻找最小化这些“边缘违规”数量的排序。这在计算机科学中称为(最小)反馈弧集(FAST)中的一个研究得很深的NP难题。 A feedback arc set是一组有向边(“弧”),如果从图中删除,则会留下一个没有定向循环的图 - 然后可以像以前一样使用拓扑排序轻松转换为一个定单。

This paper描述了最近对该问题的攻击。我没有阅读论文,但这是一个活跃的研究领域,所以这个算法可能相当复杂 - 但它可能会给你一些关于如何创建一个更简单的算法的想法,该算法的运行速度较慢(但在这样的小实例中速度可以接受),或者如何创建启发式。

+0

我觉得我希望我没有问过! :) – Codemonkey

+0

嘿嘿:)有时很烦人,问题之间的转换可能会“尖锐”:您的问题最初看起来很像普通排序,每个人都知道可以使用几种众所周知的算法在O(n log n)时间内解决问题! –

+0

是否有可能为每条边提供“重量”?我看过的代码示例(例如http://blog.calcatraz.com/php-topological-sort-function-384)只有边缘方向,例如“A通常跳动B”或“B通常跳动A ”。在每个“边缘”上指定一个精确的数字不是有益的吗?或者图论不是那样工作的? /福利局。谢谢! – Codemonkey

相关问题