任務分配問題
阿新 • • 發佈:2018-11-23
問題描述:
假設有n個任務需要分配給n個人執行,每個人只執行一個任務,每個任務只由一個人執行。第i個人執行第j個任務的成本是Cij(1<=i,j<=n), 求解初最小成本的分配方案。
蠻力法:
演算法描述:用矩陣表示任務分配問題,矩陣元素Cij(1<=i,j<=n)表示人員i執行任務j的成本。任務分配問題轉化為,在矩陣中的每一行選取一個元素,這些元素分別屬於不同的列。用一個n元組(j1,j2,...,jn)表示一個可能解,其中ji表示第i行中選擇的列號。用暴力法解決此問題則可表示成,生成一個n元組的全排列,遍歷輸出最小的成本代價即可。
程式碼:
#include<stdio.h> #include<iostream> #include<stdlib.h> #include<math.h> #include<algorithm> #define MAX 99999 using namespace std; int main() { int num,c[10][10],i,j,temp[10],minCost=MAX,cost=0; cout<<"輸入任務個數:\n"; cin>>num; cout<<"輸入成本矩陣\n"; for(i=1;i<=num;i++){ //輸入成本的矩陣值 for(j=1;j<=num;j++) cin>>c[i][j]; temp[i]=i; //設定全排列輔助陣列,預設升序 } do{ //利用next_permutation函式依次求出陣列的全排列 cost=0; for(i=1;i<=num;i++) cost+=c[i][temp[i]]; if(cost<minCost)minCost=cost; //記錄最小代價 }while(next_permutation(temp+1,temp+1+num)); cout<<"最小成本:\n"<<minCost; return 0; }
演算法分析: 一個n元組的全排列的個數為n!故時間複雜度為O(n!).