問題描述
有 N N N個任務,需要 N N N個人去完成,每個人完成不同工作的效率不同(或者資源、收益等等),需要怎么分配使得整體的效率最高(成本最低等等)呢?這就是經典的指派問題啦!
數學建模
我們首先做以下定義:
I I I: 人的集合;
J J J: 任務的集合;
c i j c_{ij} cij?: 把任務 j j j分配給 i i i的成本;
x i j x_{ij} xij?: 是否把任務 j j j分配給 i i i,0-1變量;
m i n ∑ i ∈ I ∑ j ∈ J x i j c i j s . t ∑ i ∈ I x i j = 1 , ? j ∈ J ∑ j ∈ J x i j = 1 , ? i ∈ I min \sum_{i \in I} \sum_{j \in J}x_{ij}c_{ij} \\ s.t \sum_{i \in I}x_{ij}=1, \forall j\in J\\ \sum_{j \in J}x_{ij}=1, \forall i\in I\\ mini∈I∑?j∈J∑?xij?cij?s.ti∈I∑?xij?=1,?j∈Jj∈J∑?xij?=1,?i∈I
目標函數表示最小化成本,第一行約束表示每個任務只能分配給一個人,第二行約束表示每個人只能被分配一個任務。
模型求解
方式一:將模型直接扔給求解器(Gurobi、Cplex)等求解就可以啦!如果對求解運籌模型時如何選擇求解器有疑問的小伙伴,可以參考我的文章如何選擇合適的求解器;
后面再補充python實現的代碼(todo)
方式二:對算法求解速度有更高要求的,可以通過匈牙利算法、Ford-Fulkerson算法(FFA)等求解。