问题:

一个呼叫中心,有电话专员若干名,主管一名。这位主管每天都会从固定的渠道拿到需要跟踪的销售线索列表,这些销售线索是分批到达的,每批列表里的销售线索数量不等,有多有少。这位主管每次拿到一批线索列表后,便将它们分派给电话专员们去跟踪。有些电话专员经验丰富,她会给他多派些;有些是新来的,就少派些;对于大多数专员,应该分到数量相同的线索。这些多派少派,可以使用权重来表示。比如对于大多数专员,权重是1;对于那个经验丰富的专员,权重是1.2;对于新人,权重是0.8。但是这个权重分配,是会随着时间的变化而变化的,比如新人变得熟练,或者有其他的特殊情况。而且电话专员的总人数也会变化(有离职的,有新招进来的)。这位主管希望(强制分布

- 每次分配后,每位电话专员所得到的线索数量是尽量符合他/她的权重占比的;

- 不仅如此,从长期经过很多次的分配后来看,每位专员所得到的线索数量也是尽量符合他/她的可能经过了很多次变化的权重占比的。

举例来说,这位主管管理着3名电话专员,拿到第一批线索100个,第二批50个,她希望这样分配:

电话专员 权重设定 权重占比 100 50 150   电话专员 权重设定 权重占比 300   电话专员 450
批次#1 批次#2 小计   批次#3   小计
0.8 0.26667 27 13 40   1 0.38462 115   40
1 0.33333 33 17 50   1.1 0.42308 127   165
1.2 0.4 40 20 60   0.5 0.19231 58   187
小计 3 1 100 50 150   小计 2.6 1 300   58

分析:

就拿上面的例子,为什么是那样分配,就真的是最好的呢?因为从主管的2个要求来看,就是要做2个尽量符合。

- 第一个是每次分配的数量分布尽量符合当次的权重占比分布;

- 第二个是长期来看,分配的数量分布尽量符合变化着的权重的占比分布。

什么是尽量符合呢?如果某电话专员的权重占比是0.22,待分的线索数量是10个。如果给这位专员分配5个,就不是很符合这个权重占比,因为 5/10 = 0.5 是 0.22  的2倍多。如果给他分配1个,1/10 = 0.1 有点接近0.22了。如果分配2个,那么 2/10 = 0.2 就更接近0.22这个理想值了。

所以,所谓尽量符合就是让所分配的线索数量在总的线索数量中的占比,尽量接近权重占比,最好等于权重占比就好了。比如,给他从10个中分配2.2个线索,这是理想情况,但是现实不允许这样分,所以,我们的目标是让真实的分配情况与理想的分配情况相差最小。比如 2/10 - 0.22 = 0.2 - 0.22 = -0.02

换个角度,真实的分配情况与理想的分配情况相差最小,除了可以计算比率的差值,还可以直接计算分配个数的差值。比如 2 - 10*0.22 = 2 - 2.2 = -0.2,就是说,真实情况分配的线索个数,比理想的分配个数差了0.2个(应该分2.2个,但实际上分了2个)。但是这个差无法避免,所以是最小的了。

如何找到这个最小值2?用计算个头误差的角度来看问题后,方法就很明显了:先算出理想应该分配的个数,再四舍五入一下就行了(注意,你一定不能找到一个除了四舍五入值的更接近理想值的值了)。

将上述方法应用到每个人身上,所得到的方案一定是满足第一个要求的:这个实际分配的数量分布一定最符合当次的理想分配数量分布,从而也最符合当次的权重占比分布。

在某些情况下,四舍五入会导致实际分配的数量总计与应分配线索数量有些微偏差。这时候需要对已有分配做些调整,这个调整仍需保证最终的实际分配与理想分配误差最小,具体可行的方案后述(详见解决方案“微调”步以及数学证明)。

总结一下,采用对理想分配数先四舍五入取整然后调整的方法,就能够满足第一个要求。但是对于第二个要求呢?实际上,若要保证分配方案每批次最优,则不能保证长期来看总体最优。举个例子:

电话专员 权重设定 权重占比 1 1 1 3
批次#1 批次#2 批次#3 小计
0.6 0.6 1 1 1 3
0.4 0.4 0 0 0 0
小计 1 1 1 1 1 3

以上分配方案,每次最优,但是总体来看,明显有问题,即所有的线索全部分配在了甲身上,而乙则永远得不到分配。如果像下面这样分配,则既能保证总体最优,而每次也仍然接近理想分配。

电话专员 权重设定 权重占比 1 1 1 3
批次#1 批次#2 批次#3 小计
0.6 0.6 1 0 1 2
0.4 0.4 0 1 0 1
小计 1 1 1 1 1 3

批次#1与批次#3仍然是最优分配,只有批次#2不是。

事实上我们只需要引入累计误差,在分配时总是试图使得累计误差最小,则这个方案便能够既实现总体最优,又能保证每次也最优或者第二优(详见后面数学证明)。

解决方案:(一共 4 步)

1. 归一化。

对于给定的权重设置,做归一化处理,如:

电话专员 权重设定 权重占比
0.8 0.2667
1 0.3333
1.2 0.4
小计 3 1

2. 根据累积偏差计算理想分配方案。

如前所述,引进累积偏差是为了符合主管的第二个要求:长期来看分配最优。

给电话专员甲的理想分配数量是 当前批次待分配的总线索数量去乘以其当前的(归一化后的)权重占比,然后减去其分配前累计偏差(如果从来没有分配过,此值显然为0)。如:

电话专员 权重设定 权重占比

分配前

累积偏差

批次#1 待分配数量:100
  理想分配
0.8 0.266666666666667 0.5 = 26.66666667 - 0.5 = 26.16666667
1 0.333333333333333 0.6 = 33.33333333 - 0.6 = 32.73333333
1.2 0.4 -1.1 = 40 - (-1.1) = 41.1
小计 3 1 累计误差平方和:1.82  =SUM(D3:D5) = 100

3. 四舍五入。

将理想分配数值进行四舍五入取整(若取整后小于0,则取0。因为分配负数是没有意义的!),并记录当前单次偏差以及当前分配后累积偏差(第一次分配时,当前分配后累积偏差=当前偏差;后续分配时,如上一步所描述的,需要使用这次计录下来的分配后累积偏差;而后续分配后的累积偏差=分配前累积偏差(也就是上一次分配后累积偏差)+当前单次偏差)。如:

电话专员 批次#1 待分配数量:100      
理想分配 四舍五入取整 单次偏差 分配后累积偏差
26.1666666666667 =ROUND(B3,0) = 26 -0.1666666666667 0.3333333333333
32.7333333333333 =ROUND(B4,0) = 33 0.2666666666667 0.8666666666667
41.1 =ROUND(B5,0) = 41 -0.1 -1.2
小计 100 =SUM(C3:C5) = 100 单次误差平方和:0.108888888888918 累计误差平方和:0.222222222222218

可以看到,累计误差平方和已由1.82减小到0.22。长期来看,累积误差总是呈现减小趋势,体现了主管的第二点要求。但同时单次偏差也非常接近最优值(最接近或者第二接近,后有证明),体现了主管的第一要求。

注意,这里偏差=实际值 - 理想值。偏差可正可负,但是+0.3与-0.3,其绝对值是一样的。也就是说+0.3的偏差,与-0.3的偏差,其差别程度是一样的,这个绝对值、这个偏差程度,我这里叫做误差。使用正负号是为了让我们知道,这个差别,是实际值比理想值大还是小。在对偏差的小计栏里,计算的是误差平方和。这个值可以很方便的衡量所有电话专员的误差叠加效果。误差叠加,用偏差绝对值的和也是可以的,但是使用平方和计算起来更方便些。如甲的偏差是+0.3,而乙的偏差是-0.3,那么他们合起来的误差叠加是0.6,或者误差平方和是0.18。

4. 微调。

上面的例子中,由于四舍五入取整后,所有电话专员的分配数量和=待分配的线索数量,所以这一步不需要做了。

但有些情况下,由于四舍五入取整带来的偏差不能恰好抵消,会导致电话专员的分配数量和大于或者小于待分配的线索数量。如:

电话专员 理想分配数量 四舍五入取整值
1.5 2
1.5 2
小计 3 4

这时候需要对已取整的数量做调整,以使得电话专员的分配数量和=待分配的线索数量。

记 Δ = 电话专员的分配数量和 - 待分配的线索数量。

若Δ > 0 (Δ为一个小整数),则需要从已分配数量中减去Δ,我们一个一个地来减。

从分配数量大于0并且权重大于0的电话专员中,找到分配后累积偏差(是找最大偏差不是找最大误差,只有这样才能保证调整后对整体误差影响最小)最大的人,从他的分配数量中减去1,同时更新单次偏差值以及分配后累积偏差值。(这个人一定存在,否则Δ不可能大于0)

重新计算Δ(其实就是Δ=Δ-1),然后看Δ是否仍然大于 0,如果是,再重复上一步。如此进行下去直到Δ=0为止。微调结束。

若Δ < 0 (Δ为一个负整数),则需要在已分配数量中再加上Δ,我们一个一个地来加。

权重大于0的电话专员中,找到分配后累积偏差(是找最小偏差不是找最小误差,只有这样才能保证调整后对整体误差影响最小)最小的人,在他的分配数量中再加上1,同时更新单次偏差值以及分配后累积偏差值。

重新计算Δ(其实就是Δ=Δ+1),然后看Δ是否仍然小于 0,如果是,再重复上一步。如此进行下去直到Δ=0为止。微调结束。

5. 分配成功结束。

相关的问答以及数学证明:

1. 什么是理想分配数量,什么是实际分配数量?

答:

理想分配数量是不考虑现实约束,直接通过数学计算得到的一个值,这个值可能是小数。

实际分配数量是对理想值进行一个取整,这样就会导致与理想值有一个偏差。当然运气好的时候,理想分配数量是整数,那么这时理想值=现实值,偏差为0。

若取整后为负,则实际分配数量为0。因为分配负数个与分配小数个线索一样,没有意义。

2. 在文章的最前面举的例子中,提到有权重变化。而给出的解决方案中,却没有对权重变化进行讨论,为什么?

答:

如分析中提到的,我们将减小分配数量与总数量的占比与权重占比的偏差这一目标转化成了减小实际分配数量与理想分配数量的偏差。这样一来,在解决方案中就不需要考虑权重的变化。对于变化了的权重,我们仍然使用同一方法计算出其理想分配数量(即待分配数量乘以权重占比再减去累积偏差,不管这个权重占比是否变化,我们每次都是需要重新计算的。因为即使权重不变,待分配数量也是变化的,所以我们分配前都会重新计算理想分配数量)。

3. 目标进行了转化,效果是一样的吗?

答:

不错。

【命题】对于下列分配情况,当实际分配数量与理想分配数量偏差最小时,实际分配数量占待分配数量的比例也其权重占比的偏差也最小。反之亦然。

待分配数量为 S,累积偏差为0。

电话专员 归一化的权重占比

理想分配数量

实际分配数量

TM1 W1 S * W1 L1
TM2 W2 S * W2 L2
小计 1 S S

【证明】:我们这里只对电话专员TM1做分析。

记实际分配数量与理想分配数量偏差为ε:

ε1 = L1 - S*W1

记实际分配数量占待分配数量的比例为r:

r1 = L1 / S - W1

于是有 r1 = ε1 / S。显然讨论r1与ε1的最小值情况是等价的。

【证毕】

3. 我们(主管)的目标将线索分配给所有的电话专员后,整体上看,分配后的分布与权重分布尽量吻合,上面的解决方案以及刚才的证明都似乎只是单个专员单个专员的分析和证明,这样能够达到整体的目标吗?

答:

可以。首先,这个尽量吻合,我们需要量化。对单个专员,我们用偏差量化这个吻合的程度;对于整体,方差或者说所有专员的偏差平方和,是一个很好的量化指标。当然,更直观的也许是用偏差的绝对值和,但是绝对值计算起来,对大于0小于0需要分情况讨论,比较繁琐,故使用平方和更方便。如果说每个专员都偏差都达到了最小,那么整体上看,偏差平方和也一定达到了最小,因为这个和是所有的非负数相加。你可以这样想,若每个专员的偏差都达到了最小,而偏差平方和却没有最小,就说明它还可以更小,就说明有某一个专员的偏差还可以更小,这是不可能的,因为每个专员的偏差都已经最小了,就是不可能再小的意思。

【命题】用E表示偏差。E1, E2, ..., En 都已达到最小,那么 E12 + E22 + ... + En2 一定也达到了最小。

【证略】

【推论】每个电话专员的实际分配与理想分配的偏差最小,等价于总体分配产生的方差(偏差平方和或者误差平方和)最小。

3. 为什么给一个电话专员的理想分配数量是用待分配线索总数乘以他的当前权重占比,然后减去累积偏差值?

答:

理想分配结果是每个专员都没有被多分也没有被少分。直观地说,待分配数量乘以当前权重占比得到的数,能够使得单次分配最优(单次理想值)。减去累积偏差的效果是以前多分了的,这次少分点,以前少分了的,这次多分点。

【命题】一个主管分配销售线索分配了n次,第i次的待分配数量是Si,具体分配情况如下表(i = 1, 2, ..., n)。

电话专员 归一化的权重占比

单次理想分配数量

(累积)理想分配数量

分配前累积偏差

当次实际分配数量

当次偏差

分配后累积偏差

TM1 W1i S * W1i S * W1i - D1i D1i = Σ(L1j - S*W1j) j = 1, 2, ..., i-1 L1i E1i = L1i - S*W1i D1i + E1i = Σ(L1j - S*W1j) j = 1, 2, ..., i
TM2 W2i S * W2i S * W2i - D2i D2i = Σ(L2j - S*W2j) j = 1, 2, ..., i-1 L2i E2i = L2i - S*W2i D2i + E2i = Σ(L2j - S*W2j) j = 1, 2, ..., i
小计 1 Si Si 0 Si 0 0

那么,当且仅当 L1i(实际) 与 S*W1i - D1i(理想) 的误差最小时,TM1的分配后累积误差(偏差的绝对值)最小。

【证明】

TM1的第i次分配后累积偏差=D1i + E1i = D1i + L1i - S*W1i = L1i - (S*W1i - D1i)。显然,L1i 与 S*W1i - D1i 越接近,则分配后累积误差越小。反之亦然。

【证毕】

4. 微调方案一定要按照解决方案中所描述的步骤进行吗?

答:

是的。我现在想不到另外的能够达到目标的微调方案,如果你能想到,请分享给我。但是我敢保证这里列出的微调方案能够达到目标,换句话说,这个微调方案即使不是最简单的,但一定是正确的。为什么?请你仔细想一想。若有漏洞,请指出。

____________________________________________________________________________

以上问题是我的自问自答,以下是回答别人的疑问及意见:

____________________________________________________________________________

问题列表:

Jeff Tian, this is a really interesting page.

Btw, what if a new team member joins the team?

Which is TM1, TM2, and in the middle we add TM3? In this case, I guess the expected allocation will be updated.

And shoud we 累计偏差归零重新来吗?

Error creating node with https://confluence.englishtown.com/s/en_GB-1988229788/4727/ffd10e10ff7bc0a1d7e29b4d2225707dd7f03d0b.10/_/images/icons/emoticons/smile.png. Unable to fetch: https://confluence.englishtown.com/s/en_GB-1988229788/4727/ffd10e10ff7bc0a1d7e29b4d2225707dd7f03d0b.10/_/images/icons/emoticons/smile.png --- Reason: getaddrinfo ENOTFOUND confluence.englishtown.com --- Fetch details: { "attempt": 3, "method": "GET", "errorCode": "ENOTFOUND", "requestHeaders": { "user-agent": "got (https://github.com/sindresorhus/got)", "accept-encoding": "gzip, deflate, br" } } ---

  1. It's OK to add new team members. We don't need to 累计偏差归零重新来。

    我们的目标是,让实际分配的线索数量与理想的分配数量长期来看尽量接近。分配是分批次来的,每次分配的时候,Team member 都已经确定好了。虽然可能有些人是新来的,没有参加过上次分配;以及有些人上次分过,这次不在组里了。

    累计偏差永远不归零,每次分配后产生的偏差可正可负,这个算法本身保证了累计偏差长期来看尽量接近于0。

    比如上次给某人如果多分了导致累计偏差=0.4,下次分配时,只要他还在组里,会给他少分一点(对理想的分配数进行向下取整),产生一个负的偏差,比如-0.2,这样,在这次分配后他的累计偏差变成了0.2。

    对于新加入组员的情况,举个例子:

    第一次共分配了15个销售线索给甲和乙,甲的权重是0.7,乙的权重是0.3。那么最精确最理想不产生偏差的分配方案是,给甲和乙分别分配10.5和4.5个。但是由于实际情况,我们不得不进行取整,于是,给甲分配了11个,而给乙分配了4个。这样导致甲和乙的累计偏差(=这次的单次偏差,因为这是第一次分配)分别是0.5(相对理想分配数量多分了0.5个)和-0.5(相对理想分配数量少分了0.5个)。

    分了这一次后,累计的方差(偏差平方和是0.5^2 + (-0.5)^2 = )0.5。理想情况是方差为0,但是实际需要导致这个方差为0.5,而且找不到方案能让方差比0.5更小了。

    下次又来了17个销售线索,并且加入了新的TM丙。并且这次主管对权重进行了调整,比如新的权重是(并计算理想的分配数量):

    TM
    权重
    理想的分配数量
    0.4 17 * 0.4 = 6.8
    0.3 17 * 0.3 = 5.1
    0.3 17 * 0.3 = 5.1

    那么如果再次四舍五入会是这样的结果:

    第二分配表(方案1

    TM
    权重
    理想的分配数量
    实际分配数量
    0.4 17 * 0.4 = 6.8 7
    0.3 17 * 0.3 = 5.1 5
    0.3 17 * 0.3 = 5.1 5

    这是没有考虑累计偏差的直接分配方法,从单次看,方差是最小的,但是让我们来看看两次合计起来的情况:

    TM
    第一次分配理想数量
    第二次分配理想数量
    总的理想数量
    第一次实际分配数量
    第二次实际分配数量
    总的实际分配数量
    总的偏差
    10.5 6.8 17.3 11 7 18 0.7
    4.5 5.1 9.6 4 5 9 -0.6
    0 5.1 5.1 0 5 5 -0.1

    总体来看,方差为0.86

    同样的例子,在第二次分配时我们将累计偏差考虑进去,便能够找到如下的方案,总体产生的方差更小,即使中途有新的TM加入。

    看下面的表,注意和方案1的表比较,我们的理想分配数量变化了,从而四舍五入的实际分配数量也变化了。这就是文章中所提的(累积)理想分配数量 = Si * Wji - Dji。

    第二次分配表(方案2

    TM
    累计偏差
    权重
    理想的分配数量
    实际分配数量
    0.5 (上次多分了) 0.4 17 * 0.4 - 0.5 = 6.3 (这次要少分些) 6
    -0.5 0.3 17 * 0.3 - (-0.5) = 5.6 6
    0 0.3 17 * 0.3 - 0 = 5.1 5

    好,现在我们再来统计一下:

    TM
    第一次分配理想数量
    第二次分配理想数量
    总的理想数量
    第一次实际分配数量
    第二次实际分配数量
    总的实际分配数量
    总的偏差
    10.5 6.8 17.3 11 6 17 -0.3
    4.5 5.1 9.6 4 6 10 0.4
    0 5.1 5.1 0 5 5 -0.1

    新的方差是:0.26,比0.86要小,而且在现在的整数约束下再也找不到其他分配方案,能产生比0.26更小的方差了。

    相信这个例子能够更加直观地说明为什么组员的变化以及权重的变化会影响考虑累计偏差的分配方案的最优性了。

    非常感谢你的问题!