蛮力法/任务分配
任務分配問題是一個全排列問題,先求全排列,再求最小成本任務分配方式
package xcrj.kchalgorithm.bruteForce;import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set;/*** 任務分配問題* 有n(n≥1)個任務需要分配給n個人執行,一人執行一個任務* 第i個人執行第j個任務的成本是c[i][j](1≤i,j≤n)。求出總成本最小的分配方案。* <p>* <p>* 任務分配給人是一個全排列問題,人固定住,任務分配具有相對順序,所以是全排列問題* <p>* 增量蠻力法* 1* 12 | 21* 123 312 132 | 321 231 213* <p>* 遞歸:* 遞歸出口:要增加的數i>最大數n* 遞歸體:每次給原有排列 根據索引j增加i 產生1個新排列* <p>* 步驟:* 1. 全排列,每種任務分配方式* 2. 遍歷全排列結果,求最小成本任務分配方式*/ public class DutyDistribution {// 人員數量=任務數量=4private static int n = 4;private static int[][] rdCosts = {{9, 2, 7, 8}, {6, 4, 3, 7}, {5, 8, 1, 8}, {7, 6, 9, 4}};// 存放全排列,24是全排列總個數,4!static Set<List<Integer>> fullPerm = new HashSet<>(24);static {List<Integer> list = new ArrayList<>(1);fullPerm.add(list);}public static void insertI(int i) {Set<List<Integer>> fullPermTemp = new HashSet<>(6);// 將原來排列集合中所有的排列放入臨時集合中for (List<Integer> list : fullPerm) {// !復制原來的排列集合中的排列,按索引j增加ifor (int j = 0; j < i; j++) {List<Integer> listTemp = new ArrayList<>(3);for (Integer v : list) {listTemp.add(v);}listTemp.add(j, i);fullPermTemp.add(listTemp);}}// 清除原來的排列集合fullPerm.clear();// 復制臨時排列集合的所有排列到原來的排列集合for (List<Integer> list : fullPermTemp) {List<Integer> l = new ArrayList<>(3);for (Integer v : list) {l.add(v);}fullPerm.add(l);}// 清除臨時排列集合fullPermTemp.clear();}public static void fullPermutation2(int i, int n) {if (i > n) System.out.println("全排列:" + fullPerm);else {insertI(i);fullPermutation2(i + 1, n);}}/*任務分配*/public static void dutyDistribution() {fullPermutation2(1, 4);// 最小任務分配成本int minCost = Integer.MAX_VALUE;// 最小成本任務分配List<Integer> minCostDuties = null;// 遍歷每個任務分配方式,即遍歷全排列;第i中任務分配方式,List<Integer>索引代表人,值代表任務for (List<Integer> duties : fullPerm) {// 一次任務分配的總成本int sumCost = 0;// j代表人的編號for (int j = 0; j < duties.size(); j++) {// -1原因,因為全排列的任務編號從1開始sumCost += rdCosts[j][duties.get(j) - 1];}// 比較成本if (sumCost < minCost) {minCost = sumCost;minCostDuties = duties;}}// 輸出最小成本任務分配方式System.out.println(minCostDuties);// 輸出任務分配最小成本System.out.println(minCost);}public static void main(String[] args) {dutyDistribution();} }總結
- 上一篇: 生命周期数据共享[父子-子父-兄弟]re
- 下一篇: sparkGraphX 图操作:preg