Algorithm 计算一次比较两个事物的比较等级

Algorithm 计算一次比较两个事物的比较等级,algorithm,ranking,Algorithm,Ranking,当输入数据如下时,如何计算表示个人相对偏好的10个事物的权重: 10件事物的列表以随机对的形式呈现(忽略顺序,因此可能会显示A对B,或B对A,但不是两者都显示;而不是一个项目本身) 等等 有没有一种方法可以根据这样的数据对10项进行排序或加权?有没有办法将序列从10缩短到10!/(2!(10-2)!=45个问题。你在做一个危险的心理假设:你假设“优于”关系是可传递的,因此 A > B B > C 紧接着 A > C 也就是说,在不丧失普遍性的情况下,人类的偏好并非如此。因此

当输入数据如下时,如何计算表示个人相对偏好的10个事物的权重:

10件事物的列表以随机对的形式呈现(忽略顺序,因此可能会显示A对B,或B对A,但不是两者都显示;而不是一个项目本身)

等等


有没有一种方法可以根据这样的数据对10项进行排序或加权?有没有办法将序列从10缩短到10!/(2!(10-2)!=45个问题。

你在做一个危险的心理假设:你假设“优于”关系是可传递的,因此

A > B
B > C
紧接着

A > C
也就是说,在不丧失普遍性的情况下,人类的偏好并非如此。因此,这使你的整个方法受到质疑

然而,如果你能证明这个假设,是的,这分解成一个排序问题。这里有一大堆排序算法,它们仅仅依赖于排序关系“>”的存在。然后,您的权重就是排序列表中的位置

每个现实世界的编程语言可能都有一个库,其中至少包含一个排序算法;大多数语言也有一种方法来指定要调用哪个函数来比较两个元素,因此这实际上可以归结为使用未排序的列表调用sorter函数,以及在比较两个元素时要调用的函数

如果不能假设“优于”关系是可传递的,事情就会变得复杂得多。基本上,您可以构建一个有向图并尝试通过它查找路径,但该图可能不是无循环的,并且可能没有确定的可能性来分配任何权重


有几十年的心理学方法研究如何测试这些东西;我建议找一所提供心理学课程的大学,并询问那里的人。

为了使用这样的规则对数据进行排序,关系必须是“更好的”

所以可以显示A对B,或者B对A,但不能同时显示两者

这是朝着正确的方向迈出的一步,但这并不太容易。您仍然可以这样做:

A is better than B
B is better than C
C is better than A
现在你有了一个循环,所以上面的三条规则不能用于对项目进行排序

当没有周期时,您可以按照规则下订单。但是,排序不一定是唯一的。例如,如果您的规则如下所示

A is better than B
C is better than B
您需要订购{A,B,C}“ACB”和“CAB”都符合您的规则

如果您正在寻找基于规则的任何一致排序,您可以首先构造一个由“X优于Y”规则生成的树,然后使用该树来确定十项的相对排序。

TL;DR:将列表中的每个元素与其他元素进行比较,并为获胜的选项指定权重或值。然后根据每个元素获得的“胜利”数量对其进行排名

这些都是非常有效的回答,指出了需要提出的限制,但它们并没有提供解决方案。我提供一个

在进行相对比较时,在本例中,根据主观偏好进行排名,毫无疑问,缺乏一致性会破坏及物性的完整性。但是,你可以克服这一点。怎么用?好吧,使用问题中的建议:重量

将列表中的每个元素与其他元素进行比较,并为获胜的选项指定权重或值。然后根据每个元素获得的“胜利”数量对其进行排名

而且每一场胜利的分量并不一定相同。例如,如果一个元素击败了排名非常高或排名最高的元素,它会得到额外的分数或其他东西。艾德克,快发疯

所以,这不是一个科学明确的排名系统(如果没有客观的衡量,你永远不会得到),但我认为通过这种方法,你可以非常接近

我编写了一个简单的java命令行程序来实现这一点。 下面是我的解决方案,对我所寻找的“足够好”。我希望其他人能发现这有帮助

package.com.example;
导入java.util.Comparator;
导入java.util.List;
导入java.util.Scanner;
导入java.util.stream.collector;
导入com.google.common.collect.list;
进口龙目吸气剂;
进口龙目织机;
公营银行{
公共静态void main(字符串[]args)引发异常{
ComparativeAnking实例=新的ComparativeAnking();
最终列表结果=Lists.newArrayList(
新水果(“香蕉”),
新水果(“苹果”),
新水果(“猕猴桃”),
新水果(“草莓”),
新水果(芒果);
水果[]水果数组=水果。toArray(新水果[0]);
compute(数组);
}
void compute(水果[]水果数组)引发异常{
for(int i=0;iA is better than B
C is better than B