本文是在Optaplanner創始人 Geoffrey De Smet先生的一篇文章《Formula for measuring unfairness》的基礎上進行翻譯而成。由於其博文發表在Optaplanner的官網上,所以,其行文過程當中存在必定的上下文默認狀況,若是直譯原文,將會大大下降其可讀性。所以,本文是在原文的基礎上添加一些本人修飾的表達而成。html
負載均衡在Optapalnner的應用案例中是一種極爲常見的約束,特別是作一些人員排班等場景,各人的工做量須要儘量公平分配。可是,提及來容易作起來難。本篇讓咱們來研究一下這個具挑戰性的問題。node
本文中,咱們使用如下案例:有15個煩人的任務,須要分配給5個員工,每一個任務需時1天來完成,且每一個任務都有不一樣的人員技能要求。git
咱們先來看看兩個關於公平,但又對立的定義:github
很顯然,由於咱們想將方案調整到對全部人都是平等,第2個定義更正確。此外,若是爲了讓幾乎全部人都高興,咱們把全部任務都分配給一我的(例如都分給阿Ann),那麼她極可能立刻就走人了。所以,這種想法不可行。以下表:微信
咱們來看看同一問題下的若干任務分配方案,都是15個煩人的任務:網絡
以上是將7個方案的公平程度,從高到低排列。也許這些方案有些是不可行的,由於有些任務是有特定的技術要求。從上表能夠看出,全部方案中,阿Ann都知足"分到最多任務"的條件。那麼,咱們如何對比阿Ann具備相同任務數的兩個不一樣方案呢?負載均衡
咱們截取阿Ann的任務數相同的兩個方案(C和D)以下表:工具
在這種狀況下,咱們看看除最不公平的Ann之外,正處於第二不公平的員工Beth的任務分配狀況, 在此基礎上,咱們最小化她的任務,按照公平定義的第2條,因阿Ann的任務任務數在兩個方案中不變,這兩個方案中,對於分得第二多任務的Beth,若分得的任務越少,則越公平。優化
綜上,咱們找到了公平性的定義 - 儘量平均,那麼咱們應該如何實現它呢?ui
理想狀況下,咱們想經過計算出一個懲罰性分值,用於衡量一個方案的公平性。分值越低越公平。咱們應該如何計算這個分值呢?咱們先來看看一些公式。
由於在完美公平的分配方案中,全部的員工分得的任務數是平均的,若是咱們簡單地加總每一個員工的任務數,再與均值對比,會怎麼樣?
咱們先看看絕對離均差與平均離均差兩個公式,並對上表的各個方案進行,使用這兩個公式進行計算:
絕對離均差:
平均離均差:
兩個衡量公式計算出來的結果以下:
上表的測量結果至關糟糕。在表中:
在統計學上,方差與標準差用於計算數據的離散程度。聽起來好像正知足咱們需求,咱們來看看相關公式:
方差:
標準差:
離均差的平方:
離均差的平方根:
四種公式的計算結果:
上表可見,這四個公式對於公平性衡量結果已經不錯,但仍未夠理想。例如按4個公式計算結果一致的方案D和E,理論上應該是具備相同的公平程度的,但事實上這兩個方案公平性並不一致。
若是咱們對每一個方案中,取最大任務數,做爲公平性的衡量標準會怎麼樣呢?
其公式應該是:
那麼應用於7個方案,其結果是:
這種衡量方式比方差還糟,它只關注一個員工(任務數最大那個)。所以,這種方式徹底拋棄了員工之間的公平性。若是隻是針對一個員工衡量其公平性還可行,但當對數據衆多的員工一塊兒衡量時就不行了。
若是咱們不使用任何公式做爲公平性衡量標準,咱們把所每一個方案中,每一個員工的任務數都列出來,造成一個任務數的數列,並從小到大把這數列排序,會怎麼樣?
從上表能夠看,能夠完美地對比各方案的公平性!那麼在Optaplanner裏要實現這種衡量方式,咱們須要針對每一個員工定一個分數級別,Optaplanner會按分數級別進行排序,來找最佳方案。可是,若是咱們須要排的員工數量很是大呢?要實現這種衡量方式,除了在運行過程要消耗大量的內存外,如此大數量的評價級別,會與其它約束產生衝突,也難以實現。
在規劃問題中,公平性是一種典型的軟約束。但在同一個規劃問題中,同時存在其它軟約束,這些約束也是須要進行優化考慮的。所以,咱們須要爲這些約束添加相應的權重,令它們互相制衡。
例如一樣是上述的任務分配規劃問題,存在一個稱爲優先級約束,它的重要性是10倍於公平性約束。咱們再往這個問題中添加1500個任務,咱們看看其分配方案開來是怎樣的:
計算軟約束分數時,咱們把公平性約束分數乘以5倍並加總,再取負。
接下來咱們開始處理:
每一個方案的任務數列並不表明一個單獨的數值,由於這個數列中的每一個數,對應於不一樣的評分級別。所以,任務數列沒法跟優先級約束進行綜合評價。以下表:
如何咱們將問題擴展到1500個員工,咱們會發現,若取最大任務數做爲約束,則該約束會被優先級約束矮化。
相似地,平均離均差、方差及標準差等衡量方式,其公平性,也會隨着數量(即問題規模,經過任務與員工的數量體現)增大,而被矮化。以下表:
所以,隨着公平性約束違反量的增多,衡量公平性的比重也應該隨之增大。
另外一方面,當數據量增大時,公平性的違反比重不能對其它的約束起到矮化做用。若是使用方差做爲衡量方式則會出現此狀況,見下表。
對於上述討論到的公平性衡量方式:
所以,推薦的方法是離均差的平方根::
其效果見下表:
處理的問題中,若存在非均等員工時。例如,有些員工的工做時候只有其它員工的一半,在將其代入公式計前,須要將他們可分配的任務數乘上他們FTP(full time equivalent,全職時間等價值)的倒數。其它須要考慮非均待員工的因素(例如殘疾或人才保留對象),也可使用相似的方法,或使用一些單獨的約束進行區分,具體辦法需視現實的業務需求而定。
原文地址:
Formula for measuring unfairness