将人分成每组多样性最多的组的算法

时间:2017-09-08 11:10:16

标签: c# algorithm sorting grouping

我想要一个算法将人们分组到即将召开的会议中。有很多人来自不同的地区,部门,性别等,他们希望尽可能地分散人们,以便在每个群体中获得多样性。

那么有没有一个众所周知的算法,甚至是Excel中的工具或者解决这个问题的工具,这一点必须非常普遍?

简化问题说有 n个人(比如说100) 要分成g组(比如6),每组中的数字应该接近偶数。

他们有地区:伦敦,北部,中部地区,西部,苏格兰(主要是伦敦)

性别:女,男,其他

部门:销售,支持,管理

成绩:6个不同年级

其他信息 每个类别的人口比例都不同,即销售额高于管理层。

在订购中可能有一个优先级,他们希望性别分裂比偶数部门拆分更多。

我在C#工作,但很高兴读到任何东西。

谢谢! 本

2 个答案:

答案 0 :(得分:2)

让我们首先定义一个效用函数。我们想要一个准确但快速计算的方法,那么如果一个组中每个类别的人口比例与每个类别的实际比例相比有多接近呢。

所以,如果一个8人组有5名男性,3名男性,4名销售人员和4名支持者,但男性和女性总数相等,2 / 3rds总人数是销售额,另外1名/ 3支持效用函数 - ((5 / 8-1 / 2)+(3 / 8-1 / 2)+(4 / 8-2 / 3)+(4 / 8-1 / 3))

前面有一个减号的原因是效用函数随着多样性而增加。

一旦您定义了效用函数,就有很多方法可以解决,例如模拟退火。然而,为了您的目的,我建议随机重启登山,因为我认为这就足够了。

随机将人员分配到不同的组,然后计算效用函数。从1组中随机选择一个人,从另一组中随机选择另一个人,如果交换它们时实用程序会更高,则执行此操作。继续交换多轮(例如200),然后记录分配和效用函数。从新的随机分配重新启动,并重复整个过程几次。选择具有最高效用函数的那个​​。

如果不清楚,请让我澄清一下。

答案 1 :(得分:2)

这无论如何都不是一个微不足道的问题,如果不是不可能用精确的算法解决那么困难。我不知道学术类比,但这是随机/概率优化的完美用例。

您需要一个健身功能,可以通过单个数字表达当前分配的多样性,例如:简单直观的东西,如:

sum
  for each group
    for each trait
      trait_weight * abs(%_occurrence_in_group - %_occurrence_in_population)

(在上述情况下,越低越好)

选择模拟退火或遗传算法等方法,并搜索极值。