【发布时间】:2022-01-10 07:11:54
【问题描述】:
我有一种情况,我必须创建一个 C# 例程,该例程具有以下逻辑来获取人员列表并根据偏好将他们分成 2 个团队:
-
我有一个包含 20 个名称的数组:
var names = new List(){"Joe", "Bill", "Scott", "Jonathan", . . .}
-
每个名字可以给出 0 到 3 个偏好,所以对于每个名字,我有一个长度为 0 到 3 的数组,并且是一个字符串数组,列表中有其他名字(他们是他们想加入团队的人)
-
我现在需要解决取 20 个人的列表并将他们分成 2 个团队,并根据人们的偏好进行优化来创建团队(子列表)。因此,每个人都应该在他们的团队中选择至少一个他们喜欢的人(如果在数学上可能的话)。没有一个人高于其他人的优先级,只是试图针对最高匹配数进行优化。
我可以将字符串列表转换为对象列表
List<Person> list = CreateList(array)
其中 Person 类如下
public class Person
{
public string Name;
public List<Person> Preferences;
}
但现在我想弄清楚如何使用这个数据结构来生成 2 个团队,我最终得到 2 个团队列表,每组 10 人。
【问题讨论】:
-
我觉得有很多细节被掩盖了。你如何确定谁是第一优先,谁被推到下一个?输出列表是否必须完全相等?这感觉类似于排名投票算法。我觉得在编写代码之前弄清楚这在没有 c# 的情况下如何在纸上工作很重要。
-
FWIW 这对我来说就像一个Bipartite graph 问题。
-
只有 184756 种可能的方法可以将 20 人分成 10 人一组。您可以轻松尝试所有方法,看看哪种方法最好。
-
@gunr2171 - 我更新了问题以添加更多关于优先级的详细信息