按优先级分配资源的算法

时间:2018-08-03 09:52:15

标签: algorithm

我的问题如下: 我和我的团队正在搬到办公室的另一部分,我们必须确定每个人的坐位。但是,每个人都有优先事项。我想找到一种算法,可以帮助我们以每个人都满意的方式分配座位。 (或至少其中的大多数。)

我已经开始实施自己的算法,向每个人询问3个首选选项(该团队由10个人组成,并且有10个位置),并考虑其中的“资历”(他们花了很长时间)团队之间)。

但是,我一直运气不好,试图浏览互联网寻找一种算法,该算法可以解决类似的问题,但没有找到任何解决方法。

解决此问题的最佳方法是什么?有没有 解决此问题或类似问题的众所周知的算法?

谢谢!

2 个答案:

答案 0 :(得分:2)

首先让我想到的是稳定的婚姻问题。这是原始算法的问题说明:

  

给出n个男人和n个女人,每个人都按照优先顺序对所有异性进行排名,将这些男人和女人结婚,这样就不会有两个异性愿意彼此相爱的人他们目前的合作伙伴。如果没有这样的一对人,婚姻就被认为是稳定的。

请仔细阅读Gale–Shapley algorithm,这是我将要解决的问题。

让每个工人列出所有地点的排名。这些将是“男人”。然后,每个地点将使用年资排名作为他们对“男人”的排名。这些斑点将成为Gale-Shapley算法中的“女性”。

您将获得没有“不稳定婚姻”的座位分配。这是不稳定的婚姻:

  
      
  1. 第一个匹配集中的元素A比第二个匹配集中的某个给定元素B优先于已经匹配A的元素,并且

  2.   
  3. B相对于已经匹配B的元素,B也更喜欢A。

  4.   

在这种情况下,不稳定的婚姻意味着W1S1之间存在一个工人席位,因此另一个工人W2的排名S1高。不仅如此,S1的排名也高W2。由于席位是根据资历列表进行的,因此W2的资历更高。

实际上,这意味着您将获得座位分配,这样就不会让任何工人拥有一个其他资历较高的人想要“更多”的座位。

该Wiki文章的底部提到了已经在R和Python中实现该算法的软件包,因此输入首选项列表取决于您。

免责声明:这可能不是最有效的算法。所有座位都具有相同的排名列表,因此某个地方可能会有捷径。但是,如果大炮已经为您编写了R / Python,则使用大炮杀死苍蝇会更容易。而且,这是我记得uni的唯一算法,因此这是我钉任何钉子的唯一锤子。

答案 1 :(得分:1)

我决定实施强力解决方案,这是许多评论所建议的。 因此:

  1. 我要求团队中的每个人在座位之间给出优先顺序(10到1,我使用“ teamMember-seat”配对的得分,最高的是10分)
  2. 收集了所有“ teamMember-seat”配对以及得分,例如名称:Steve,座位:seat1,得分:5(得分来自上一步的给定顺序)
  3. 从这些生成了所有可能的坐姿组合 例如 清单1:[名称:史蒂夫座位:seat1得分:5],[名称:约翰·座椅:seat2得分:3] ... [名称:X座椅:seatY得分:X] List2:[名称:Steve座位:seat2得分:4],[名称:John座位:seat1得分:4] ... [名称:X座位:seatY得分:X] ... ListX:[],[] ...
  4. 选择得分最高的“ teamMember-seat”列表(该列表的得分是通过将“ teamMember-seat”对的得分相加得出的)
  5. 如果有2个得分相等的列表,则算法会选择一个列表,其中最高级的团队成员在其中获得最喜欢的席位
  6. 如果仍然有一个以上的列表(组合),则算法会随机选择一个

我确定有些人建议使用一些更好的算法来执行此操作,但是我已经没时间了。

我没有发布代码,因为它真的很长,实现起来也不太复杂。但是,如果您需要它,请不要犹豫删除私人消息。