Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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
Algorithm 如何从2个列表中确定最佳组合_Algorithm_Combinations_Distribution_Rating - Fatal编程技术网

Algorithm 如何从2个列表中确定最佳组合

Algorithm 如何从2个列表中确定最佳组合,algorithm,combinations,distribution,rating,Algorithm,Combinations,Distribution,Rating,我在寻找一种方法,使团队中的人尽可能地结合在一起。让我描述一下情况 假设我们有A,B,C和D。此外,我们还有第1,2,3,4和5组。两者都是示例,可以少一些,也可以多一些。每个人都给对方打分。例如,A评级为BA3,CA2,等等。每个人也给每组打分。(假设评级为0-5)。现在,我需要某种算法将这些人均匀地分布在各个群体中,同时尽可能让他们开心(比如:他们应该在一个高评价的群体中,有高评价的人)。现在我知道人们不可能进入最佳团队(他们评为5级的团队),但我需要他们进入整个团队的最佳解决方案 我认为这

我在寻找一种方法,使团队中的人尽可能地结合在一起。让我描述一下情况

假设我们有A,B,C和D。此外,我们还有第1,2,3,4和5组。两者都是示例,可以少一些,也可以多一些。每个人都给对方打分。例如,A评级为BA3,CA2,等等。每个人也给每组打分。(假设评级为0-5)。现在,我需要某种算法将这些人均匀地分布在各个群体中,同时尽可能让他们开心(比如:他们应该在一个高评价的群体中,有高评价的人)。现在我知道人们不可能进入最佳团队(他们评为5级的团队),但我需要他们进入整个团队的最佳解决方案

我认为这是一个很难回答的问题,如果有人能告诉我关于这类问题的更多信息,或者帮助我学习我正在寻找的算法,我会很高兴的

谢谢

编辑:
我看到了很多很好的答案,但这个问题对我来说太大了,也不能正确地解决。然而,到目前为止发布的答案也给了我一个很好的出发点,让我可以更深入地研究这个问题。已经非常感谢了

这个问题是NP难的:你可以从最大三角形布局(即在一个图中找到至少k个顶点不相交的三角形)减少到有k个大小为3的组的版本,没有人关心他在哪个组中,并且喜欢每个人0或1。因此,即使是这种非常特殊的情况也很困难


为了解决这个问题,我会尝试使用一个:have二进制变量g_ik来表示person I在组k中,并使用约束来确保person只在一个组中,并且组具有适当的大小。此外,二元变量t_ijk表示人i和j在k组(由t_ijk确定)在确定这是一个问题后,我建议作为一种启发式解决方案:人工智能工具

一种可能的方法是[SAHC] 首先,我们将定义我们的效用函数(设为
u
)。它可以是所有群体的总体幸福感之和。
接下来,我们定义我们的“世界”:
S是所有可能分区的组。

对于s的每个合法分区,我们定义:
next(s)={将一个人移动到其他组的所有可能性}

我们现在要做的就是随机重启运行SAHC:

1. best<- -INFINITY 
2. while there is more time
3. choose a random partition as starting point, denote it as s.
4. NEXT <- next(s)
5. if max{ U(NEXT) } < u(s): //s is the top of the hill
   5.1. if u(s) > best: best <- u(s) //if s is better then the previous result - store it.
   5.2. go to 2. //restart the hill climbing from a different random point.
6. else:
   6.1. s <- max{ NEXT }
   6.2. goto 4.
7. return best //when out of time, return the best solution found so far.
1.best这是一个问题的例子。这是一个非常好的例子
用很好的方法研究了这类问题。阅读
这就更好地解释了
比我好

基本上,任何类型的优化问题都有三个部分

  • 向问题解决功能输入
  • 问题解决功能输出的解决方案
  • 一种评分函数,通过以下方式评估解决方案的最优程度: 得分
  • 现在的问题可以说是找到了产生 最高分。要做到这一点,你首先需要想出一个格式 表示评分函数可以使用的可能解决方案 假设6个人(0-5)和3组(0-2),这个python数据结构 将起作用,并且是一个可能的解决方案:

    output = [
        [0, 1],
        [2, 3],
        [4, 5]
        ]
    
    将人员0和1放入组0,将人员2和3放入组1,依此类推 为了给这个解决方案打分,我们需要知道输入和规则 计算输出。输入可以由该数据表示 结构:

    input = [
        [0, 4, 1, 3, 4, 1,  3, 1, 3],
        [5, 0, 1, 2, 1, 5,  5, 2, 4],
        [4, 1, 0, 1, 3, 2,  1, 1, 1],
        [2, 4, 1, 0, 5, 4,  2, 3, 4],
        [5, 5, 5, 5, 0, 5,  5, 5, 5],
        [1, 2, 1, 4, 3, 0,  4, 5, 1]
        ]
    
    列表中的每个列表都代表了该人员给出的评分 例如,在第一行中,人员0给人员0(您)评分为0 不能给自己打分),4对1,1对2,3对3,4对4和 1对第5人。然后他或她对第0-2组、第3组、第1组和第3组进行评分 分别

    以上是一个针对给定输入的有效解决方案的示例 我们得分了?问题中没有具体说明,只是 “最佳”组合是理想的,因此我会任意决定 解决方案的分数是每个人幸福感的总和 一个人的幸福感取决于他或她对幸福的评价 组中每个人的平均评分, 不包括个人本身

    下面是评分函数:

    N_GROUPS = 3
    N_PERSONS = 6
    def score_solution(input, output):
        tot_score = 0
        for person, ratings in enumerate(input):
            # Check what group the person is a member of.
            for group, members in enumerate(output):
                if person in members:
                    # Check what rating person gave the group.
                    group_rating = ratings[N_PERSONS + group]
    
                    # Check what rating the person gave the others.
                    others = list(members)
                    others.remove(person)
                    if not others:
                        # protect against zero division
                        person_rating = 0
                    else:
                        person_ratings = [ratings[o] for o in others]
                        person_rating = sum(person_ratings) / float(len(person_ratings))
                    tot_score += group_rating + person_rating
        return tot_score
    
    对于给定的解决方案,它应该返回37.0分。现在呢 我们要做的就是生成有效的输出,同时跟踪哪一个输出 直到我们满意为止,这是最好的:

    from random import choice
    def gen_solution():
        groups = [[] for x in range(N_GROUPS)]
        for person in range(N_PERSONS):
            choice(groups).append(person)
        return groups
    
    # Generate 10000 solutions
    solutions = [gen_solution() for x in range(10000)]
    # Score them
    solutions = [(score_solution(input, sol), sol) for sol in solutions]
    # Sort by score, take the best.
    best_score, best_solution = sorted(solutions)[-1]
    print 'The best solution is %s with score %.2f' % (best_solution, best_score)
    
    在我的计算机上运行此操作会产生:

    The best solution is [[0, 1], [3, 5], [2, 4]] with score 47.00
    
    很明显,你可能会认为随机地 提出解决问题的方案,事实就是如此 生成解决方案的更复杂方法,如模拟 退火或遗传优化。但它们都建立在相同的基础上
    框架如上所述。

    一些问题:一个群体能容纳的最大人数是多少?这个数字在不同群体中是固定的吗?人们对彼此的评价如何决定他们的分组方式?你是希望最大化“总体幸福感”还是平均分配[后者意味着如果每个人都同样痛苦,这是一个很好的解决方案]@susmits:人数没有限制,但可能的情况是人数是小组的2到3倍,因此一个小组将包含2到3人。将他们放在一起时会考虑对彼此的评分。对彼此评分较低的人可能会在不同的小组中。@amit:我主要关注maximized happiness,但均匀分布同样有趣,可能也是一个很好的解决方案。但正如你可能看到的,我希望80%的快乐而不是100%的不快乐。正如@susmits评论的后续内容:理论上我们能把所有用户放在同一组吗?顺便说一句,它闻起来是NP完全的,我试图找到一个很好的减少,但没有做到所以,如果它不是NP完全问题,很可能就是最大流问题。。