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