符号:
玩家数组:p[1], ..., p[n]
团队数组:T[1], T[2], T[3], T[4]
意愿矩阵:w[i,j];维度=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]) 操作在团队T[q] 和T[r] 之间交换球员p[k] 和p[h]。这是:
-
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 相同的对。