Assignment Problem的若干思考

加拿大小哥哥發表於2021-05-28
 最近受到南京一個同學的push,又開始了部落格園寫作之旅。歡迎大家聯絡我做程式碼實現工作,QQ:1198552514。權當賺點生活費~

我的研究也經常用的Assignment problem,而且很多問題都能轉化為指派問題。比如輪灌和滴灌問題(對噴頭分組,每組噴頭負責一部分割槽域,從而使得區域覆蓋最大,同時還有很多其他約束),這個問題在國內尚屬空白,而且找不到任何程式碼~筆者已經實現了均衡約束的輪灌、滴灌演算法~當時幫新疆的一個同學做的(基於粒子群),沒想到我竟然真的做了出來~所以你只要給我數學模型或者說讓我聽懂你的問題就能幫你做出來

我以前寫的非常火爆的粒子群的帖子:  https://www.cnblogs.com/hxsyl/p/4521778.html

1. 問題陳述

指派問題又稱分配問題,其用途非常廣泛,比如某公司指派n個人去做n件事,各人做不同的事,如何安排人員使得總費用最少?若考慮每個職工對工作效率(如熟練程度等),怎樣安排會使總銷量達到最大?這些都是一個企業經營管理者必須考慮的問題,所以該問題有重要的應用價值。

假設有n件工作分派給n個人來做,每項工作只能由一人來做,每個人只能做一項工作。若給出各人對各項工作所具有的工作效率。問應該如何安排人選,及發揮個人特長又能使總的效率最大。為此用0-1整數規劃來實現指派問題即如何安排人選。

2. 指派問題的背景

在現實生活中,有各種性質的指派問題(Assignment  Problem)。例如,在生產管理中,總希望把人員進行最佳分配,以發揮最大的工作效率;某部門有n項任務要完成,而該部門正好有n個人可以分別去完成其中任何一項,但由於任務性質和個人的專長不同,因此各人完成各項不同任務的效益(所費時間或所花費用)也有差別,如果分配每個人完成一項任務且僅為一項任務,則把每項任務分配給哪個人去完成,使完成所有n項任務的總效益為最高(總時間、總費用為最小或創造的價值最大)?這是典型的分配問題或指派問題。又如有n項加工任務,怎樣指定n臺機器分別去完成,以使總的加工時間最少或總收入最大;有n條航線,怎樣指定n艘船分別航行,使總收入最大,等等,都屬於指派問題。

3. 指派問題的描述

3.1 指派問題的一般形式

指派問題的標準形式(以人和事為例)如下。有n個人和n項任務,已知第i個人做第j件事的費用為,要求確定人和事之間的一一對應的指派方案,使完成這n項任務的費用最少。

一般把目標函式的係數寫為矩陣形式,稱矩陣

 

為係數矩陣(Coefficient  Matrix),也稱為效益矩陣或價值矩陣。矩陣的元素(i,j=1,2,…n)表示分配第i個人去完成第j項任務時的效益。一般地,以表示給定的資源分配用於給定活動時的有關效益(時間,費用,價值等),且

 

3.2 問題的數學模型一般形式

 

 

 

在模型中,約束條件式(2)表示每個人只能做一件事,約束條件式(3)表示每件事只能由一個人去做。

            對於問題的每個可行解,可用解矩陣來表示:

 

            當然,作為可行解,矩陣的每列元素中都有且只有一個1,以滿足約束條件式(3)。每行元素中也有且只有一個1,以滿足約束條件(2)。指派問題n!個可行解。

 

4.指派問題實現

4.1  匈牙利演算法

4.1.1 匈牙利演算法的理論基礎

定理1  如果從分配問題的效率矩陣[]的每一行元素中分別減去(或加上)一個常數,從每一列中分別減去(或加上)一個常數,得到一個新的效率矩陣[],則以[]為效率矩陣的分配問題與以[]為效率矩陣的分配問題具有相同的最優解。

定理2 若矩陣A的元素可以分為‘0’與‘非0’的兩部分,則覆蓋‘0’元素最少直線數等於位於不同行不同列的‘0’元素的最大個數。

 

4.1.2匈牙利演算法的實現步驟

第一步:找出矩陣每行的最小元素,分別從每行中減去這個最小元素;

第二步:再找去矩陣每列的最小元素,分別從各列減去這個最小元素;

第三步:經過這兩步變換後,矩陣的每行每列至少都有了一個零元素,接著根據以下準則進行試指派,找出覆蓋上面矩陣中所有零元素至少需要多少條直線;

(1)從第一行開始,若該行只有一個零元素打上()號。對打()號零元素所在列劃一條直線。若該行沒有零元素或有兩個以上零元素(已劃去的不計在內),則轉下一行,一直到最後一行為止;

(2)從第一列開始,若該列只有一個零元素就對這個零元素打上()號(同樣不考慮已劃去的零元素),對打()號零元素所在行劃一條直線。若該列沒有零元素或 還有兩個以上零元素,則轉下一列,並進行到最後一列;

(3)重複(1)、(2)兩個步驟,可能出現三種情況:

①  矩陣每行都有一個打()號零元素,很顯然,按照上述步驟得到的打()的零元素都位於不同行不同列,因此就找到了問題的答案;

②  有多於兩行或兩列存在兩個以上零元素,即出現了零元素的閉迴路,這個時候可順著閉迴路的走向,對每個間隔的零元素打上()號,然後對所有打()號零元素或所有列或所在行劃一條直線。

③  矩陣中所有零元素或打上()號,或被劃去,但打()號零元素個數小於m。

第四步:為了設法使每行都有一個打()的零元素,就要繼續對矩陣進行變換;

(1)從矩陣未被直線覆蓋的元素找出最小元素k;

(2)對矩陣的每行,當該行有直線覆蓋時,令=0,無直線覆蓋的,令=k;

(3)對矩陣的每列,當該列有直線覆蓋時,令=-k,無直線覆蓋的,令=0;

(4)得列一個變換後的矩陣,其中每個元素=--。

第五步:回到第三步,反覆進行,一直到矩陣中每一行都有一個打()的零元素為止,即找到最優分配方案為止。

 

4.1.3 匈牙利演算法實現指派問題

為了便於對模型進行求解與分析,假設有4件事4個人去做,各變數對應的資料假設如表1。

表1  每個人完成各項任務需要的時間

任務

A

B

C

D

25

29

31

42

39

38

26

20

34

27

28

40

24

42

36

23

 

 

所以最優解為x11,x23,x32,x44,即甲負責任務A,乙負責任務C,丙負責任務B,丁負責任務D,可以使總花費時間最少。代入求出目標函式值

Z=25+26+27+23=101。

 

4.2  0-1整數規劃

0-1規劃(0-1 Programming)一種特殊形式的整數規劃 。這種規劃的決策變數僅取值0或1,故稱為0-1變數或二進位制變數 ,因為一個非負整數都可以用二進位制記 數法用若干個0-1變數表示 。0-1變數可以數量化地描述諸如開與關、取與棄、有與無等現象所反映的離散變數間的邏輯關係、順序關係以及互斥的約束條件 ,因此0-1規劃非常適合描述和解決如線路設計 、工廠選址 、生產計劃安排、旅行購物、揹包問題、人員安排、程式碼選取、可靠性等人們所關心的多種問題。實際上,凡是有界變數的整數規劃都可以轉化為0-1規劃來處理。當然也包括運籌學中的指派問題。

 

4.2.1  模型假設

為了便於對模型進行求解與分析,假設有4件事4個人去做,各變數對應的資料假設如表1。

表1  每個人完成各項任務需要的時間

任務

A

B

C

D

25

29

31

42

39

38

26

20

34

27

28

40

24

42

36

23

 

表2  變數假設

i

第i個人

j

第j項任務

 

第i個人分配第j項任務

=1

第i個人被分配去做第j項任務

=0

第i個人不被分配到第j項任務

 

4.2.2  模型建立

               

由此,建立的數學模型為:

5. 進一步思考

  其實實際中每個工人要做多個任務,否則對於發起者來說成本太高了。而且考慮到任務的完成質量,每個任務要由多個人去做~那麼該如何實現呢?是不是聽起來感覺很簡單的樣子,做起來又不會做了呢?哈哈哈,這就是我存在的價值~幫您解決您的個性化的問題

 

相關文章