我在这里发现了非常相似的问题,但我找不到适合我的解决方案。所以这就是问题所在:
我有4支球队和数量庞大(超过4人)的球员。每个球员都按照自己的喜好对球队进行排名,例如:
最后,我希望每支队伍中的队员数量均为偶数,但他们的选择权重要。
这是一种匈牙利算法,男性多于工作。任何人都可以帮我找到这个算法吗?我一直在寻找。
答案 0 :(得分:0)
您可以将此表示为1-0整数编程问题。
让x_N成为描述团队分配的向量:如果x_Y(i)= 1,则我在团队Y上,如果他们不在团队Y上,那么x_Y(i)= 0。| x_Y | = N,其中N是玩家数量。
另外,让p_Y成为球队Y的球员偏好权重,所以如果球员我真的想要在球队Y上,那么p_Y(i)= 4,如果他们不在,则p_Y(i)= 1 39;我想成为Y队。
(您可以将加权首选项1和4替换为任何内容,它们只是一个示例)。
解决问题的算法必须执行以下操作:
最大化:x_A * p_A + x_B * p_B + x_C * p_C + x_D * p_D
受制于:x_A + x_B + x_C + x_D = 1(带有N个的向量)
AND x_Y(i)在{0,1}中{A,B,C,D}中的所有Y,{1,...,N}中的i
你最大化的实际上是赋值和偏好矩阵的矩阵乘积的轨迹,它是一个半定的整数规划算法。我非常确定NP-hard。
解决此问题的一种启发式方法是随机为球队分配相同数量的球员。然后,你可以进行一系列的交易"团队之间如果他们使目标功能增加。更好的是,你可以在多项式时间中找出在任何给定任务中哪个交易是最好的交易。这不会给你一个最佳的任务,但我认为它会让你非常接近。
顺便说一下,这种方法是hill climbing的变体。基本上,在这个问题的上下文中,任何其他heuristic methods都会有类似的类比。
答案 1 :(得分:0)
<强>符号:强>
播放器数组:p[1], ..., p[n]
团队数组:T[1], T[2], T[3], T[4]
意愿矩阵:w[i,j]
; dimension = nx4
; w[i,j]
= pi
愿意加入团队Tj
。这里的假设是w[i,1] + w[i,2] + w[i,3] + w[i,4] = 1
适用于所有i
。
会员矩阵:x[i,j]
,维度= nx4
; x[i,j]=1
或0
取决于pi
是否属于Tj
。
满意度数组:s[1], ..., s[n]
; s[i] := w[i,1] * x[i,1] + ... + w[i,4] * x[i,4]
。
满意度:s := (s[1] + ... + s[n]) / n
。
<强>操作:强>
假设如下:
x[k,q] = 1
(p[k]
属于T[q]
)x[k,r] = 0
(p[k]
不属于T[r]
x[h,r] = 1
(p[h]
属于T[r]
)x[h,q] = 0
(p[h]
不属于T[q]
操作swap([k,q][h,r])
在p[k]
和p[h]
小组之间互换玩家T[q]
和T[r]
。这是:
x[k,q] := 0
,x[k,r] := 1
。x[h,r] := 0
,x[h,q] := 1
。s[k] := s[k] - w[k,q] + w[k,r]
,s[h] = s[h] - w[h,r] + w[h,q]
。s := (s * n - w[k,q] - w[h,r] + w[h,r] + w[k,q]) / n
。现在您已准备好使用模拟退火来最大限度地提高满意度s
。这是算法的草图:
从任何配置开始(只需在球员出现时将球员分配给球队)
建立温度
随机选择两对[k,q]
和[h,r]
尝试swap
操作。如果满意度s
增加,请接受交换。如果没有,则仅以一定的概率接受它,否则拒绝交换(详见模拟退火算法)
多次重复步骤3和4。
降低温度并返回3.
<强>说明:强>
如果玩家在每个玩家的1, ..., 4
(或任何其他)范围内具有偏好,则这些数字除以其总和以获得每个玩家的意愿向量满足约束w[i,1] + ... + w[i,4] = 1
。
两对[h,q]
和[k,r]
的随机选择必须满足swap
操作的假设。所以,它基本上是随机选择两个团队(q
和r
),然后是每个团队中两个团队。
swap
操作中的步骤3和4对于减少总和和产品的数量至关重要,因此交换试验很快。
要拒绝swap
,只需swap
同一对。