排名优化

时间:2018-01-26 18:46:00

标签: algorithm optimization ranking

我正在寻找一个库,我可以提供一个来自用户的元素排名列表,以便它计算从用户到让每个人都满意的元素的分配。

每个元素都有一个可以处理的最大可能用户数。 单个元素排名是所有元素的排序,因此对元素进行排名的用户更喜欢第一个和最后一个(如第一选择,第二选择等)。 用户更快乐,他分配给他的元素的排名越好。

有哪些软件/库可以解决这个常见的优化问题?

编辑:我想要计算的数学定义:

给定用户的有限集合U,元素的有限集合S和从S到自然数的函数c,为每个元素指定可以为其分配多少用户。

每个用户指定排名R(U),其是从S到{1 .. | S |}的双射映射。 对于给定的赋值A:User \ to Element,惩罚被定义为对所有用户u的R(u)(A(u))^ 2的总和。 现在我想找到最小化惩罚的赋值(或者足够好的赋值)并且通过不将c(e)用户分配给元素e来考虑c。

1 个答案:

答案 0 :(得分:1)

TL; DR - 从here下载一个完全符合您要求的程序。

这可以建模为成本流问题。在成本流问题中,项在概念上沿着方向弧在节点之间流动。每个弧都有一个项目在每个项目在其节点之间流动时产生的成本。弧还具有限制可以在弧上流动的项目的容量。最后,每个节点都有一个项目的起始库存。如果某个节点在库存中有一个项目,则该节点只能沿其中一个连接的弧发送项目。该项目从弧的发送端传送到弧的接收端。然后,接收节点可以沿着其连接的弧之一将项目发送到另一个节点。成本流求解器搜索以最低成本发送尽可能多的项目的传输集。

那么这与将人分配到研讨会有什么关系呢?好吧,你可以认为每个人都有一个代表他们参加一个研讨会的能力的代币。他们将他们的代币发送给他们将参加的研讨会,并且发送该代币的成本(或罚款)反映了该研讨会在该人员优先研讨会清单中的位置。一个人最想参加的研讨会非常便宜,而最不喜欢的研讨会非常昂贵。一旦研讨会从与会者处获得令牌,它就会将其令牌发送到汇聚节点。车间和汇聚节点之间的弧线没有成本,但它的容量确实表明可以参加该车间的最大人数。优化将尝试以最低成本获得所有令牌到汇聚节点。每个令牌进入水槽的唯一方法是每个人去一个车间,如果每个车间的人数不超过车间的容量。解算器找到了以最低成本完成此任务的方法。

这是一个显示布局的图表:

Assignment flow network

每个人都有一个节点,每个工作室都有一个节点,还有一个汇聚节点。方括号中的数字表示节点的起始库存。括号中的数字表示弧的容量。在此示例中,可参加每个研讨会的最大人数分别为3人,2人和4人。未显示起始库存的节点的起始库存为0,未显示容量的弧的容量为1.

这可以使用Google的开源cost flow solver来实现。我已经做到了这一点,并把它包装成一个你可以download from gitlab的程序。它是以这样的方式编写的,您只需要替换一些C#代码来解决您的特定问题。只需用您自己的数据替换下面显示的研讨会和人员信息。

    // Identifies all workshops, with the maximum number of people that can enroll in each.
    Dictionary<string, int> workshopCapacities = new Dictionary<string, int>()
    {
        {"A", 2 },
        {"B", 3 },
        {"C", 1 }
    };

    // Identifies each person by name, which maps to a list of workshops they want to attend in the order of preference
    Dictionary<string, string[]> peoplePreferences = new Dictionary<string, string[]>()
    {
        { "Betsy", new[]{ "A", "B", "C" } },
        { "Joe",   new[]{ "C", "B", "A" } },
        { "Maria", new[]{ "C", "A", "B" } },
        { "Kuang", new[]{ "C", "A", "B" } },
        { "Paula", new[]{ "B", "C", "A" } },
    };