用規划模型求解指派問題


一、前言

  優化模型主要有線性規划、非線性規划、動態規划和整數規划。而指派問題是整數規划中一類重要的問題:
\(n\)項任務,由\(n\)個人來完成,每個人只能做一件,第\(i\)個人完成第\(j\)項任務要\(c_{ij}\)小時,如何合理安排時間才能使總用時最小?

二、 指派問題的數學模型

我們引入 0 - 1變量 \(x_{ij}\)

\[x_{ij} = \begin{cases} 1, & \text{表示指派第i個人完成第j項工作} \\ 0, & \text{表示不指派第i個人完成第j項工作} \end{cases} \]

用x_{ij}表示第i個人完成第j項工作所需要的資源數,稱之為價值系數。因此指派問題的數學模型是:

\[min \ z = \sum_{i=1}^n\sum_{j=1}^nc_{ij} x_{ij} \]

\[s.t = \begin{cases} \sum_{i=1}^n x_{ij}=1,\ \ \ \ \ i=1,2,···,n\\ \sum_{j=1}^n x_{ij}=1,\ \ \ \ \ j=1,2,···,n\\ x_{ij}=0或1,\ \ \ \ \ i,j = 1,2,···,n \end{cases} \]

  • 第一個式子表示完成全部n項工作所消耗的總資源數要最少;
  • 第二個式子表示第i個人只完成一項工作;
  • 第三個式子表示第j項工作只能由一個人完成;
  • 第四個式子表示決策變量只能取0或者1。

指派問題可以看作0 - 1整數規划問題來求解,也可以用更簡單的匈牙利算法來求解。

三、 0 - 1規划求解(Matlab)

我們先給出這樣一個例題,圖中數值為第i個人要完成第j個任務需要消耗的資源數\(x_{ij}\),求解:如何安排才能使的總資源消耗最少。
在這里插入圖片描述

編程思路:
根據規划問題的要求:
每個人只能完成一個任務,每個任務只能由一個人完成。也正如第三部分中的第二個式子和第三個式子,當該4x4矩陣表示\(x_{ij}\),即指派第i個人完成第j個任務時,此時每一行相加的值和為1,每一列相加的值和為1。(\(x_{ij}\)的值只能為0或者1)根據該思路,我們可以來進行Matlab變成。

c=[2,15,13,4,10,4,14,15,9,14,16,13,7,8,11,9]';
Aeq=[1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0;
    0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0;
    0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0;
    0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1;
    1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0;
    0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0;
    0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0;
    0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1];
beq=[1;1;1;1;1;1;1;1];
lb=zeros(16,1);
ub=ones(16,1);
[x,fval] = linprog(c,[],[],Aeq,beq,lb,ub)
x=reshape(x,[4,4])'

其中Aeq和beq代表的是等式約束,Aeq的前四行分別表示 4x4的\(x_{ij}\)矩陣中四行中每行相加的值為1;Aeq的后四行分別表示4x4的\(x_{ij}\)矩陣找那個的四列中每列相加的值為1。(實際上它就是將4x4的矩陣按照行進行展開成了1x16的矩陣)。
然后再調用linprog()線性規划的函數,輸入相應參數進行求解。求解所得的x是16x1的矩陣,我們為了便於觀察,最后將該矩陣轉換成4x4的矩陣。

以上代碼也可以用for循環對其優化,將線性規划轉換成整數規划進行求解

c=[2,15,13,4;10,4,14,15;9,14,16,13;7,8,11,9];
c=c(:);a=zeros(8,16);intcon=1:16;
for i=1:4
    a(i,(i-1)*4+1:4*i)=1;
    a(4+i,i:4:16)=1;
end
b=ones(8,1);lb=zeros(16,1);ub=ones(16,1);
x=intlinprog(c,intcon,[],[],a,b,lb,ub)
x=reshape(x,[4,4])

在對於指派問題中,還有一個經典算法時匈牙利算法,核心是尋找增廣路徑,用增廣路徑求二分圖最大匹配的算法。后面會有一篇博客專門分享我對匈牙利算法理解及matlab實戰。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM