日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

蛮力法/任务分配

發布時間:2024/3/13 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 蛮力法/任务分配 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

任務分配問題是一個全排列問題,先求全排列,再求最小成本任務分配方式

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();} }

總結

以上是生活随笔為你收集整理的蛮力法/任务分配的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。