首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >一次计算比较两件事物的比较等级

一次计算比较两件事物的比较等级
EN

Stack Overflow用户
提问于 2016-05-28 15:51:32
回答 3查看 1.4K关注 0票数 4

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

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

代码语言:javascript
运行
复制
A is better than B
D is better than F
H is better than B
C is better than J

等。

是否有办法从这样的数据中对这10项进行排序或加权?有没有办法将序列从10!/ (2!(10-2)!)=45个问题缩短。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-05-28 16:04:06

你在这里做了一个危险的心理假设:你假设“好于”的关系是传递性的,所以

代码语言:javascript
运行
复制
A > B
B > C

直接告诉我们

代码语言:javascript
运行
复制
A > C

也就是说,在不失去普遍性的情况下,人类的偏好就不一样了。因此,这使你的整个方法在一个可疑的角度。

但是,如果你能证明这个假设是正确的,那么这就归结为一个排序问题。外面有一大堆排序算法,它们依赖于排序关系">“的存在。你的体重只是排序列表中的位置。

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

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

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

票数 3
EN

Stack Overflow用户

发布于 2016-05-28 16:06:35

为了使用这样的规则对数据进行排序,关系"better"必须是https://en.wikipedia.org/wiki/Transitive_relation

所以A对B可以显示,或者B对A,但不是两者都显示

这是朝着正确方向迈出的一步,但这并不是完全可以传递的。你仍然可以这样做:

代码语言:javascript
运行
复制
A is better than B
B is better than C
C is better than A

现在您有了一个循环,因此上面的三个规则不能用于对项目进行排序。

当没有周期时,您可以根据规则下订单。然而,排序可能并不一定是唯一的。例如,如果您的规则如下所示

代码语言:javascript
运行
复制
A is better than B
C is better than B

您需要订购{A,B,C} -- "ACB“和"CAB”都符合您的规则。

如果您正在根据规则寻找任何一致的排序,您可以首先构造一个由"X比Y“规则诱导的树,然后使用该树来确定您的十项的相对排序。

票数 3
EN

Stack Overflow用户

发布于 2020-09-12 22:39:32

TL;DR:将列表中的每个元素相互比较,并为获胜的选择分配权重或值。然后根据所取得的“胜利”数对每个元素进行排序。

这些都是好的、有效的回应,需要提出限制,但它们没有提供解决办法。我提供一个..。

在进行相对比较时,在本例中,基于主观偏好的排序无疑会缺乏一致性,从而破坏传递性完整性。但是你能克服这一切。多么?好吧,用问题中的建议:权重。

将列表中的每个元素与其他元素进行比较,并为获胜的选择分配权重或值。然后根据所取得的“胜利”数对每个元素进行排序。

而每一场胜利都不一定要有相同的衡量标准。例如,如果一个元素击败了排名显著较高或排名最高的元素,它就会获得额外的分数或其他东西。呆子,疯了!

所以,这不是一个科学明确的排名系统(如果没有客观的测量,你永远不会得到这个系统),但是我认为用这种方法,你可以得到相当接近的结果。

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

代码语言:javascript
运行
复制
package com.example;

import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;
import com.google.common.collect.Lists;
import lombok.Getter;
import lombok.Setter;

public class ComparativeRanking {

    public static void main(String[] args) throws Exception {
        ComparativeRanking instance = new ComparativeRanking();
        final List<Fruit> fruits = Lists.newArrayList(
                new Fruit("banana"),
                new Fruit("apple"),
                new Fruit("kiwi"),
                new Fruit("strawberry"),
                new Fruit("mango"));
        Fruit[] fruitArray = fruits.toArray(new Fruit[0]);
        instance.compute(fruitArray);
    }

    void compute(Fruit[] fruitArray) throws Exception {
        for (int i = 0; i < fruitArray.length; i++) {
            for (int k = i + 1; k < fruitArray.length; k++) {
                Fruit choice1 = fruitArray[i];
                Fruit choice2 = fruitArray[k];
                System.out.println(String.format("Enter '1' for %s and '2' for %s", choice1.name, choice2.name));
                Scanner scanner = new Scanner(System.in);
                int selection = scanner.nextInt();
                switch (selection) {
                    case 1:
                        choice1.addWin();
                        break;
                    case 2:
                        choice2.addWin();
                        break;
                    default:
                        throw new Exception("Hey idiot, pick 1 or 2.");
                }
            }
        }

        List<Fruit> fruitsRankedByWins = Lists.newArrayList(fruitArray)
                .stream()
                .sorted(Comparator.comparing(Fruit::getWins).reversed())
                .collect(Collectors.toList());

        System.out.println("Result:");
        for (Fruit fruit : fruitsRankedByWins) {
            System.out.println(String.format("Fruit: %s | Wins: %s", fruit.getName(), fruit.getWins()));
        }
    }

    @Getter
    @Setter
    static class Fruit {
        String name;
        int wins;
        public Fruit(String name) {this.name = name;}
        void addWin() {
            wins++;
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37501039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档