Algorithm 如何从2个列表中确定最佳组合
我在寻找一种方法,使团队中的人尽可能地结合在一起。让我描述一下情况 假设我们有A,B,C和D。此外,我们还有第1,2,3,4和5组。两者都是示例,可以少一些,也可以多一些。每个人都给对方打分。例如,A评级为BA3,CA2,等等。每个人也给每组打分。(假设评级为0-5)。现在,我需要某种算法将这些人均匀地分布在各个群体中,同时尽可能让他们开心(比如:他们应该在一个高评价的群体中,有高评价的人)。现在我知道人们不可能进入最佳团队(他们评为5级的团队),但我需要他们进入整个团队的最佳解决方案 我认为这是一个很难回答的问题,如果有人能告诉我关于这类问题的更多信息,或者帮助我学习我正在寻找的算法,我会很高兴的 谢谢 编辑: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级的团队),但我需要他们进入整个团队的最佳解决方案 我认为这
我看到了很多很好的答案,但这个问题对我来说太大了,也不能正确地解决。然而,到目前为止发布的答案也给了我一个很好的出发点,让我可以更深入地研究这个问题。已经非常感谢了 这个问题是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完全问题,很可能就是最大流问题。。