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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

算法设计课程设计--任务时间表问题

發布時間:2023/12/29 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法设计课程设计--任务时间表问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題描述


? ? ? ? 一個單位時間任務是恰好需要一個單位時間完成的任務。給定一個單位時間任務的有限集S.關于S的一個時間表用于描述S中單位時間任務的執行次序。


? ? ? ? 如:給定單位時間任務集S各任務截止時間和誤時懲罰,截止時間d[i]{4,2,4,3,1,4,6},誤時懲罰w[i]{70,60,50,40,30,20,10},求解最優時間表,計算最小總誤時懲罰。
?

思路分析過程


? ? ? ? 問題要使所有任務的總誤時懲罰最小,容易想到采用貪心策略:誤時懲罰大的任務先執行。這樣,即使有任務不能按時執行,懲罰值也是剩下較小的。


? ? ? ? 但是,直接將誤時懲罰大的任務從前往后排是否是最好的貪心策略呢?答案是否定的。因為每個任務都有一個時間底線,在時間底線之前執行都不會受到懲罰。假設有這樣一種情況:有兩項任務,序號是1、2,誤時懲罰分別為70、60,時間底線分別為2、1。如果按照上面的貪心策略,執行次序為1、2,任務2因為超過時間底線而被懲罰。而事實上,最優的貪心策略是執行次序為2、1,兩個任務都不會收到懲罰。?


? ? ? ? 綜合考慮誤時懲罰和時間底線兩個因素,我們的算法需要使每個任務在不誤時的前提下,盡可能向后安排,留給其他任務最大的執行空間。按照這種思想得到改進的貪心策略:誤時懲罰大的任務優先排到它的時間底線,如果該時間已經有任務,則向前安排;如果前面都已經有任務(懲罰在所難免),則從最后向前安排。?

?

詳細設計說明書


變量:in Scanner類型的變量便于控制臺接收數據


方法:


main(String[]):void主方法,入口方法。
show(int[],int[],int[],int[]):void參數列表分別為截至時間,誤時懲罰,時間表,原始數據下表。展示菜單列表。
greedyJob(int[],int[],int[]):void參數列表分別為截至時間,誤時懲罰,時間表。計算最優時間表。
superSort(int[],int[],int[]):void參數列表分別為截至時間,誤時懲罰,時間表。排序。


源代碼


import java.util.Scanner; /*** @time 2016-06-11* @Description 計算任務時間表問題*/ public class TimeTable {//聲明靜態的掃描器類便于調用static Scanner in = new Scanner(System.in);/*** 主方法* @param args*/public static void main(String args[]) {/*** 測試用例 * int[] v1 = { 0, 4, 2, 4, 3, 1, 4, 6 }; * int[] w1 = { 0, 70, 60,50, 40, 30, 20, 10 };*/System.out.println("請輸入任務集的大小:");int size = in.nextInt();int[] v1 = new int[size + 1];int[] w1 = new int[size + 1]; int[] indexs=new int[v1.length];int time = 0;int passtime = 0; for (int i = 0; i < indexs.length; i++) {indexs[i]=i;}System.out.println("請分別輸入各任務截至時間:");for (int i = 1; i <= size; i++) {System.out.print("第" + i + "個任務的截至時間:");time = in.nextInt();v1[i] = time;}System.out.println("請分別輸入各任務誤時懲罰:");for (int i = 1; i <= size; i++) {System.out.print("第" + i + "個任務的誤時懲罰:");passtime = in.nextInt();w1[i] = passtime;}int[] u1 = new int[v1.length];new TimeTable().show(v1, w1, u1,indexs);}/*** 顯示方法show* @param v1 截止時間* @param w1 誤時懲罰* @param u1 最優時間表*/public void show(int[] v1, int[] w1, int[] u1,int[] indexs) {SuperSort(v1, w1,indexs);int total=greedyjob(v1, w1, u1);System.out.println("<<時間表問題>>");while (true) {System.out.println("\n1.總誤時懲罰為");System.out.println("2.最優時間表為");System.out.println("0.退出\n");System.out.println("---------------------------------");System.out.print("請選擇>");int choose = in.nextInt();switch (choose) {case 1:System.out.println("總誤時懲罰為:" +total);System.out.println("-----------------------------");break;case 2:System.out.print("最優時間表為:");for (int i = 1; i <= v1.length - 1; i++) {System.out.print(indexs[u1[i]] + " ");} System.out.println();System.out.println("-----------------------------"); break;case 0:System.err.println("退出成功!");System.out.println("-----------------------------"); System.exit(0);}}}/*** 主要計算方法* @param d 截止時間* @param w 誤時懲罰* @param job 最優時間表* @return 總誤時懲罰*/public int greedyjob(int[] d, int[] w, int[] job) {int n = d.length - 1;d[0] = 0;job[0] = 0;int k = 1;job[1] = 1;int sum = 0;for (int i = 2; i <= n; i++) {int r = k;while ((d[job[r]] > d[i]) && (d[job[r]] != r)) {r--;}if ((d[job[r]] <= d[i]) && (d[i] > r)) {for (int m = k; m > r; m--) {job[m + 1] = job[m];}job[r + 1] = i;k++;}}for (int i = 1; i <= k; i++) {w[job[i]] = 0;}for (int i = 1; i <= n; i++) {if (w[i] > 0) {job[++k] = i;sum += w[i];}}return sum;} /*** 排序:對相同截止時間的誤時懲罰進行降序排列;* @param d 截止時間* @param w 誤時懲罰*/public void superSort(int[] d, int[] w, int[] indexs) {for (int i = 1; i < d.length - 1; i++) {for (int j = i + 1; j < d.length; j++) {if (w[i] < w[j]) {int temp = w[i];w[i] = w[j];w[j] = temp;temp = indexs[i];indexs[i] = indexs[j];indexs[j] = temp;temp = d[i];d[i] = d[j];d[j] = temp;}}}} } }


遇到問題


? ? ? ? 算是很快完成算法的要求,測試也是發現了一些問題,于是嘗試修改代碼,改進代碼,過程中我們用過新的算法,180度的代碼大轉換,最終還是無法解決問題,于是只有一行一行檢查代碼,查bug,當看到一個交換數字的算法代碼塊時,我真的是既慚愧又很無奈呀,僅僅是兩個數組小標寫反了,導致我們無用工作了兩天,在做課程設計初期,算法部分變量不清楚具體含義,經過調試測試,最終明白,排序方法構建時,大意出錯,導致長時間代碼無法通過測試。

?

總結


? ? ? ? 通過實際操作實驗加深了對時間表問題的理解,同時也學到了相關的很多知識,貪心算法和任務調度問題的理解也深入了解了不少,整個過程中,我深刻的體會到了編寫程序是必須加倍小心,盡量或不出現嘗試性問題,否則會發生很多意想不到的事,代碼編寫細心很重要,總之算法重在在理解,代碼實現只是一種表現形式,確是很好的表現。團隊的合作很重要,每人一個小模塊,大大加快開發效率。


總結

以上是生活随笔為你收集整理的算法设计课程设计--任务时间表问题的全部內容,希望文章能夠幫你解決所遇到的問題。

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