根据首选选项列表为大多数人分配首选

时间:2014-07-11 14:08:07

标签: python algorithm grouping preferences

给定一个选项列表(比如100),列表中的每个人(比如30)必须按照他们希望分配的顺序选择5个选项。我如何为每个人分配一个选择,以确保尽可能多的人获得他们的首选(或最高选择)?

每个选项对可选择的次数有可变限制,例如:选择1可能适用于3个人,选择2可用于1,选择3到5等。

我使用Python编写代码,但我对我应该使用哪种算法感兴趣。我发现了一些建议稳定的婚姻问题,但这要求双方都有偏好,在我的情况下,只有人有偏好。我找到的另一个是分配问题,但这需要有相同数量的人选择,每个选择一个人再次我的问题有更多的选择比有增加的问题的人选择可能超过1 1个人

4 个答案:

答案 0 :(得分:2)

这似乎相似,但并不是稳定的婚姻问题。也许该算法可以工作或可以调整:http://rosettacode.org/wiki/Stable_marriage_problem

(不同语言的代码)。

答案 1 :(得分:1)

您可以将此建模为网络流量问题。使用

构建网络
  1. 源节点,汇聚节点,每个人的节点和每个选择的节点。
  2. 源与每个人之间的边缘(容量为1)
  3. 每个人和她选择的每个选择之间的边缘,容量为1
  4. 每个选项和接收器之间的边缘,其容量等于可以选择的最大次数。
  5. 然后为所有边

    分配权重
    1. 源与每个人之间所有边缘的权重为0
    2. 每个选项和接收器之间所有边缘的权重为0
    3. 对于人p和她的任何选择c之间的每个边缘,设置权重如下:n ^(5-rank(p,c))其中rank(p,c)是p在p上的位置列表。
    4. 最后在生成的网络中找到最大成本最大流量。

答案 2 :(得分:0)

如果您唯一的限制是:

  

尽可能多的人获得他们的首选(或最高选择)

我的建议是一个简单的排序操作。

您可以按照首选项# requests for a choice - # of available spots进行排序,然后按第二种选择和第三种选择进行排序,依此类推。浏览每个用户并分配第一个选项(如果可用),然后标记它们或从列表中删除它们。对于尚未被选中的所有用户,重复第二选择,第三选择等。

这种方法将是有利的,因为它通过优先选择那些选择了真正流行或人口过多的选择的人来解决选择的不均匀分布。这种偏见会增加可能性,尽可能多的人获得至少一种选择。例如,选择前5个选项的人实际上将确保至少有一个选择,否则他们可能没有机会。有一些不受欢迎的选择(# requests for a choice - # of available spots) <= 0的人可能会被推入其中一个不受欢迎的选择中,但至少他们会得到他们喜欢的选择之一。拥有所有不受欢迎的选择的人将获得他们想要的东西。

答案 3 :(得分:0)

您可以使用分配问题公式,例如对于有5次可用的选择,你可以添加5份副本,而且添加虚拟人物,使人数和选择相等。