Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 一种算法,用于将人划分为每个组具有最多多样性的组_C#_Algorithm_Sorting_Grouping - Fatal编程技术网

C# 一种算法,用于将人划分为每个组具有最多多样性的组

C# 一种算法,用于将人划分为每个组具有最多多样性的组,c#,algorithm,sorting,grouping,C#,Algorithm,Sorting,Grouping,我想要一个算法,为即将到来的会议将人们分组。有很多人要去,来自不同的地区、部门、性别等,他们希望尽可能多地将人分开,以便在每个群体中获得多样性 那么,有没有一个众所周知的算法,甚至是Excel之类的工具来解决这个问题,这一定是很常见的 为了简化问题,可以说有 n人们说100 要分成g组,比如说6个,每个组中应该有接近偶数的数字 他们有地区:伦敦、北部、米德兰、西部、苏格兰,主要是伦敦 性别:女、男、其他 部门:销售、支持、管理 年级:6个不同的年级 附加信息 每个类别的人员比例不同,即销售人员多

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

那么,有没有一个众所周知的算法,甚至是Excel之类的工具来解决这个问题,这一定是很常见的

为了简化问题,可以说有 n人们说100 要分成g组,比如说6个,每个组中应该有接近偶数的数字

他们有地区:伦敦、北部、米德兰、西部、苏格兰,主要是伦敦

性别:女、男、其他

部门:销售、支持、管理

年级:6个不同的年级

附加信息 每个类别的人员比例不同,即销售人员多于管理人员

在排序中可能有一个优先事项,他们希望性别均等,而不是部门均等

我用C语言工作,但很乐意阅读任何东西

谢谢!
Ben

让我们先定义一个效用函数。我们想要一个准确但快速计算的模型,那么每个类别的人在一个群体中的比例与每个类别的实际总比例相比有多接近呢

因此,如果一组8人中有5名男性、3名男性、4名销售人员和4名支持人员,但男性和女性的总人数相等,总人数的2/3是销售人员,那么其他1/3支持实用功能的人将是 -5/8-1/2+3/8-1/2+4/8-2/3+4/8-1/3

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

一旦你定义了一个效用函数,有很多方法可以实现它,比如模拟退火。不过,出于您的目的,我建议您随机重新开始爬山,因为我认为这样就足够了

将人员随机分配到不同的组,然后计算效用函数。从一个组中随机选择一个人,从另一个组中随机选择另一个人,如果在交换他们时效用更高,请这样做。继续交换多轮,如200轮,然后记录分配和实用程序功能。从新的随机分配重新开始,并将整个过程重复几次。选择效用函数最高的一个


如果不清楚,请让我澄清

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

您需要一个适应度函数,该函数可以通过单个数字传达当前任务的多样性,例如,一些简单直观的功能,如:

sum
  for each group
    for each trait
      trait_weight * abs(%_occurrence_in_group - %_occurrence_in_population)
在上述情况下,越低越好


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

您可能需要查找布局问题。罗马人在2000年前就试图解决这个问题,但并不是很成功。数学家们仍在努力解决这些问题。参战的罗马人试图用最少数量的战车有效地装载战车。所以在一辆战车里放太多东西会使它减速或翻倒。所以罗马人就像你想要平均分配物品一样。编码的一个简单方法就是选择一些随机排序,这些排序应该围绕着平衡排列,然后根据你选择的标准选择最好的排序。您还可以尝试在组之间交换人员,以查看任何交换是否会提高分数。例如,他可以使用一些代码,用示例数据填充人员对象列表。如果没有包含任何代码,这个问题最终可能会被解决。可能对YairHalberstadt感兴趣。例子总是好的。当然,人们可以提出答案,但如果有一些例子的话,人们希望从他的角度看到更好的答案。这里有一些非正式的东西,例如区域->离散名称vs.坐标和一些距离度量。这样写的话,你不会高兴地把它们当作离散的。还有一些经典的东西,比如:团队规模的l1和l2损失?还是其他指标?更好的决定,但有时一个例子也有帮助。我认为爬山比遗传算法或模拟退火简单得多,对于这样的问题,稠密的解在随机重启下应该是完全足够的。在我看来,SA非常简单。但是他没有说任何关于社区的事情,这是一个核心的IngedEdition/需要。如果你自己编程的话,那就不那么简单了,这是你第一次体验人工智能tbhIt只是一个概率计算和一个随机抽样输入一些if与你的alg比较。我认为这是一个好的开始,但是组的大小是基于邻域定义的不变量
两组之间。尺寸永远不会改变。这可能会被随机重启绕过,但你也可以考虑其他邻居,例如3组之间的邻居。他说每个组中应该有一个大致为偶数的数字,我认为在不改变这一点的情况下找到一个好的解决方案很容易。但大致是一个非常数,取决于要优化的函数,考虑到这一点,优化值可能会发生很大变化。