流水線問題(算法設計)C++

目錄

一、需求分析

1.1 問題描述

1.2 數據需求

1.3 功能需求

1.4 開發環境

二、概要設計

2.1 抽象數據類型 ADT 的定義

2.2 系統的主要功能模塊

2.3 功能模塊聯系圖

三、詳細設計

3.1 數據結構設計

3.2 主要算法

四、系統運行及結果分析

1. 用戶界面

2. 程序運行樣例

3. 程序結果分析

五、總結與思考


一、需求分析

1.1 問題描述

某工廠生產的產品需歷經 3 道工序,為提升效率,需確定加工順序,以實現生產 n 件產品的總時長最短。每件產品的各工序耗時各異。要求輸入 n(n≥10),并遞增 n 至少給出 3 組運行數據,對比程序運行時間。設計程序接收訂單信息及工序時長,據此計算最短生產時間,即完成所有產品所需的最小時間。程序核心任務是依據輸入優化工序安排,使總生產時間最小化。

1.2 數據需求

  1. 輸入:訂單信息:接收產品數量 n,代表工廠要生產的產品總數。
  1. 輸入:工序時長信息:以二維矩陣或數組呈現,行對應產品,列對應工序,元素表示相應工序的時長。

1.3 功能需求

  1. 錯誤情況處理:輸入訂單及工序時長后,判斷輸入是否無效。若出現無效產品數量、負數工序時長等錯誤輸入,進行錯誤提示或異常處理。
  1. 優化加工時長:運用分支限界法,根據輸入的產品數量及各產品工序耗時,計算生產 n 件產品的最小總時長。
  1. 確定輸出:依據輸入,程序返回最小總時長,即完成 n 件產品所需的最短時間。
  1. 確定最優加工順序:借助動態規劃算法結果,確定使總時長最小的工序順序。

1.4 開發環境

采用 Code::Blocks 作為開發環境,它是用于 C 和 C++ 等編程語言的集成開發環境(IDE),支持多種編譯器,具備強大調試功能,可在開發中定位代碼錯誤,還能將相關文件組織于項目中,便于代碼管理、版本控制與共享,提高開發效率。

二、概要設計

2.1 抽象數據類型 ADT 的定義

ADT 結構體

    • 數據對象:包含多種類型數據項,如變量、數組、指針等。
    • 數據關系:數據項間存在相關性。
    • 基本操作
      • 創建:使用 typedef struct Node 創建新結構體對象。
      • 訪問:通過結構體對象和成員名訪問成員。
      • 賦值:將一個結構體對象賦值給當前對象。
      • 修改:修改結構體中成員的值。

ADT info

    • 數據對象:信息記錄,含整型成員和數組成員。
    • 數據關系:無特定關系描述。
    • 基本操作:無特定操作描述。

ADT 線性表

    • 數據對象:相同數據類型數據元素的集合。
    • 數據關系:數據元素間有前驅后繼關系。
    • 基本操作
      • 創建:構造空順序表 L。
      • 插入:向線性表 L 中插入元素 e。
      • 刪除:獲取并刪除線性表 L 的首個元素。

ADT 堆

    • 數據對象:包含元素實際數據及在堆中的位置信息。
    • 數據關系:對于非葉子節點 i,滿足 data [i] >= data [2 * i + 1] 和 data [i] >= data [2 * i + 2](或 data [i] <= data [2 * i + 1] 和 data [i] <= data [2 * i + 2]);對于節點 i 和 j,當 i 是 j 的祖先節點時,data [j] <= data [i](或 data [j] >= data [i])。
    • 初始條件:給定順序表 L,起始位置 s 和結束位置 m。
    • 操作結果:在給定范圍內對順序表 L 進行操作。

2.2 系統的主要功能模塊

  1. inlIst 函數:初始化順序表 L 為空。
  2. linsert 函數:向順序表 L 插入元素。
  3. GetElem 函數:獲取并刪除順序表 L 的首個元素。
  4. heaps 函數:實現堆排序中的堆調整操作。
  5. Creat 函數:構建大根堆。
  6. Sort 函數:對數組進行堆排序。
  7. Min1 函數:計算指定節點 k 與其他節點權重的最小值。
  8. Min2 函數:計算指定節點 k 與其他節點路徑權重之和的最小值。
  9. fenzhi 函數:使用分支限界法求解最優路徑問題。
  10. main 函數:程序入口,接收用戶輸入產品數量和加工時間,調用 fenzhi 函數求解最優路徑。
  11. 異常處理模塊:判斷輸入是否無效,對無效輸入(如無效產品數量、負數工序時長)進行錯誤處理并給出提示。

2.3 功能模塊聯系圖

三、詳細設計

3.1 數據結構設計

  1. 結構體
typedef struct {int x;int Lw[100] = {0};int M[100] = {0};int g;} info;

線性表

typedef struct {info data[MAXSIZE];int length;} Sqlist;

void heaps(Sqlist &L, int s, int m) { //堆的創建int j;info rc;memcpy(&rc, &L.data[s], sizeof(info));for (j = 2 * s; j <= m; j = j * 2) {if (j < m && L.data[j].x < L.data[j + 1].x)++j;if (rc.x >= L.data[j].x)break;memcpy(&L.data[s], &L.data[j], sizeof(info));s = j;}memcpy(&L.data[s], &rc, sizeof(info));}void Creat(Sqlist &L) { //對堆進行創建和調整int n, i;n = (L.length);for (i = n / 2; i > 0; --i)heaps(L, i, n);}void Sort(Sqlist &L) { //是對 L 中的數據進行排序。int i;info X;Creat(L);for (i = L.length; i > 1; --i) {memcpy(&X, &L.data[1], sizeof(info));memcpy(&L.data[1], &L.data[i], sizeof(info));memcpy(&L.data[i], &X, sizeof(info));heaps(L, 1, i - 1);}}

3.2 主要算法

  1. Min1 函數
int Min1(int k, int n, int M[100]) {int j, min = 10000;for (j = 1; j <= n; j++) {if (M[j] == 0 && j != k && min > f[j][3])min = f[j][3];}if (min == 10000)min = f[k][3];return min;}

該函數用于獲取未被處理且工序時間最短的產品的工序時間,輔助求解最優路徑。通過不斷調用可在決策節點選擇最優路徑。

2. Min2 函數

int Min2(int k, int n, info p) {int j;int db, sumf = 0;for (j = 1; j <= n; j++) {if (p.M[j] == 0)sumf = sumf + f[j][2];}db = (max(Sum(1, p.g + 1, k, p), Sum(2, p.g, k, p)) + sumf + Min1(k, n, p.M));return db;}

該函數用于計算當前節點的最小值,輔助求解最優路徑。通過不斷調用可在決策節點選擇最優路徑。

3. 分支限界法求解最優路徑

void fenzhi(int n, Sqlist &L) {info p, pl, e;int down = 10000, up = 100000;int i, j, x, db, sumf = 0, min3 = 100000;for (i = 1; i <= n; i++) {for (j = 1; j <= n; j++) {sumf = sumf + f[j][2];}for (j = 1; j <= n; j++) {if (j != i && min3 > f[j][3])min3 = f[j][3];}db = f[i][1] + sumf + min3;if (down > db) {down = db;x = i;}}e.x = down;e.M[x] = 1;e.Lw[1] = x;e.g = 1;linsert(L, e);while (L.length != 0) {p = GetElem(L);if (p.Lw[n] != 0) {e = GetElem(L);printf("所需最短時間是:%d\n路徑是: ", p.x);for (i = 1; i <= n; i++) {printf("%d ", p.Lw[i]);}} else {for (i = 1; i <= n; i++) {pl = p;if (p.M[i] == 0) {pl.Lw[p.g + 1] = i;pl.M[i] = 1;pl.g = p.g + 1;pl.x = Min2(i, n, p);if (pl.x < up) {linsert(L, pl);Sort(L);if (pl.g == n) {up = pl.x;deleted(down, up, L);}}}}}}}

該函數實現分支限界法算法框架,通過生成新路徑節點并選擇最優路徑,最終找到最優路徑,輸出最短時間和路徑。

四、系統運行及結果分析

1. 用戶界面

2. 程序運行樣例

3. 程序結果分析

對比運行樣例輸出與手動計算結果,結果相似。同時記錄不同 n 值下程序的運行時間,分析隨著 n 增大,程序運行時間的變化趨勢。若運行時間增長過快,可能需進一步優化算法或數據結構。

五、總結與思考

完成此作業過程中,深入學習了分支限界法及其應用。分支限界法是求解最優化問題的常用算法,通過搜索和剪枝高效尋找最優解。在此問題中,定義數據結構和函數,利用分支限界法搜索解空間,剪去不必要路徑找到最優解。編寫代碼和運行程序過程中,深刻理解了分支限界法思想和實現。發現合理的排序和剪枝策略可大幅減少搜索空間、提高算法效率,且合理設計數據結構和算法能使代碼更清晰易理解。此外,認識到編程中錯誤處理和輸入驗證的重要性,添加對無效輸入的處理避免程序出錯。總之,通過解決此問題,掌握了分支限界法應用,加深了對算法設計和錯誤處理的認識,為今后學習和工作奠定了基礎。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/903594.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903594.shtml
英文地址,請注明出處:http://en.pswp.cn/news/903594.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從實列中學習linux shell4: shell 腳本中 $0 $1 $2 $3 >> 以及 awk 都是干啥的?

在 Linux Shell 腳本中&#xff0c;這些符號和工具的功能如下&#xff1a; 一、位置參數 $0 $1 $2 $3 符號功能說明示例$0腳本自身的文件名若執行 ./test.sh&#xff0c;則 $0 值為 ./test.sh$1第一個參數執行 ./test.sh apple 時&#xff0c;$1 值為 "apple"$2第二…

TM1668芯片學習心得三

一、鍵掃數據儲存地址如下所示&#xff0c;先發讀鍵命令后&#xff0c;開始讀取按鍵數據BYTE1-BYTE5字節&#xff0c;讀數據從低位開始輸出&#xff0c;其中B6和B7位為無效位&#xff0c;此時芯片輸出為0。芯片K和KS引腳對應的按鍵按下時&#xff0c;相對應的字節內的 BIT位為1…

MySQL 基本查詢(一)

文章目錄 Create(insert)指定列的單行插入和全列插入多行全列插入和指定列的多行插入如果主鍵存在&#xff0c;要插入替換存在的值replace 基本select全列查詢指定列查詢where子句where子句案例語文成績在 [80, 90] 分的同學及語文成績數學成績是 58 或者 59 或者 98 或者 99 分…

LeetCode路徑總和系列問題解析:I、II、III的解決方案與優化

文章目錄 引言一、路徑總和 I&#xff08;LeetCode 112&#xff09;問題描述方法思路Java代碼實現復雜度分析 二、路徑總和 II&#xff08;LeetCode 113&#xff09;問題描述方法思路Java代碼實現復雜度分析 三、路徑總和 III&#xff08;LeetCode 437&#xff09;問題描述方法…

NFC 碰一碰發視頻貼牌技術,音頻功能的開發實踐與技術解析

在數字化營銷與信息交互場景中&#xff0c;NFC 碰一碰技術憑借其便捷性和高效性&#xff0c;成為快速傳遞多媒體內容的新選擇。通過 NFC 實現視頻音頻的快速傳輸&#xff0c;不僅能提升用戶體驗&#xff0c;還能為各類場景帶來創新應用。本文將深入探討該功能開發過程中的關鍵技…

跨境電商生死劫:IP篩查三法則破解封號魔咒

一、血淚數據&#xff1a;90%封號案源于IP污染 跨境電商平臺風控系統持續升級&#xff0c;2023年亞馬遜全球封號案例中&#xff0c;67%涉及賬號關聯&#xff08;Marketplace Pulse數據&#xff09;&#xff0c;其中IP問題占比高達91%。更觸目驚心的是&#xff1a; 新號存活率&…

MIPS架構詳解:定義、應用與其他架構對比

一、MIPS架構的定義 MIPS&#xff08;Microprocessor without Interlocked Pipeline Stages&#xff09; 是一種經典的精簡指令集&#xff08;RISC&#xff09;處理器架構&#xff0c;由斯坦福大學John Hennessy團隊于1981年提出&#xff0c;強調高效流水線設計和硬件簡化。 核…

第十六屆藍橋杯 2025 C/C++組 脈沖強度之和

目錄 題目&#xff1a; 題目描述&#xff1a; 題目鏈接&#xff1a; 思路&#xff1a; 思路詳解&#xff1a; 代碼&#xff1a; 代碼詳解&#xff1a; 題目&#xff1a; 題目描述&#xff1a; 題目鏈接&#xff1a; P12338 [藍橋杯 2025 省 B/Python B 第二場] 脈沖強度…

從Ping到iperf3:深度實戰無線網絡壓測與優化指南

以下是測試無線網絡穩定性的詳細步驟與工具指南&#xff0c;涵蓋信號質量、吞吐量、干擾排查等關鍵維度&#xff1a; 一、基礎信號質量測試 1. 信號強度與覆蓋測試 工具&#xff1a;手機APP&#xff08;WiFi Analyzer、NetSpot&#xff09;或筆記本&#xff08;Acrylic WiFi&a…

MySQL 連接池 (Pool) 常用方法詳解

MySQL 連接池 (Pool) 常用方法詳解 1. 創建連接池 首先需要創建連接池實例&#xff1a; const mysql require(mysql2/promise); // 使用Promise版本const pool mysql.createPool({host: localhost,user: root,password: password,database: test,waitForConnections: true…

大型連鎖酒店集團數據湖應用示例

目錄 一、應用前面臨的嚴峻背景 二、數據湖的精細化構建過程 &#xff08;一&#xff09;全域數據整合規劃 &#xff08;二&#xff09;高效的數據攝取與存儲架構搭建 &#xff08;三&#xff09;完善的元數據管理體系建設 &#xff08;四&#xff09;強大的數據分析平臺…

GNU gettext 快速上手

文章目錄 1.簡介2.核心概念國際化 (i18n)本地化 (l10n)POT 文件PO 文件MO 文件文本域翻譯函數 3.主要組件4.使用示例參考文獻 1.簡介 GNU gettext 是一套用于軟件國際化&#xff08;internationalization&#xff0c;i18n&#xff09;和本地化&#xff08;localization&#x…

分享:VTK版本的選擇 - WPF空域問題

在早期版本中&#xff0c;ActiViz 對 Windows Presentation Foundation (WPF) 框架的支持是通過 WindowsFormHost 組件實現的&#xff0c;這種方式依賴于 WindowsForm 和 WPF 的互操作性。然而&#xff0c;這種方法存在一個眾所周知的“空域問題”&#xff08;airspace issue&a…

python數據分析(六):Pandas 多數據操作全面指南

Pandas 多數據操作全面指南&#xff1a;Merge, Join, Concatenate 與 Compare 1. 引言 在數據分析工作中&#xff0c;我們經常需要處理多個數據集并將它們以各種方式組合起來。Pandas 提供了多種強大的多數據操作方法&#xff0c;包括合并(merge)、連接(join)、連接(concaten…

spring 面試題

一、Spring 基礎概念 什么是 Spring 框架&#xff1f; Spring 是一個開源的 Java 應用程序框架&#xff0c;它提供了一種輕量級的、非侵入式的方式來構建企業級應用。Spring 的核心功能包括依賴注入&#xff08;Dependency Injection&#xff0c;DI&#xff09;、面向切面編程…

OpenCV-Python (官方)中文教程(部分一)_Day20

22.直方圖 22.1直方圖的計算,繪制與分析 使用 OpenCV 或 Numpy 函數計算直方圖 使用 Opencv 或者 Matplotlib 函數繪制直方圖 將要學習的函數有&#xff1a;cv2.calcHist(),np.histogram() 什么是直方圖呢&#xff1f;通過直方圖你可以對整幅圖像的灰度分布有一個整體的 了…

數電發票整理:免費實用工具如何高效解析 XML 發票數據

如今數字電子發票越來越普及&#xff0c;但是數電發票的整理還是頗有講究~ 今天給大家介紹一個 XML 發票閱讀器。使用它完全不收取任何費用&#xff0c;且無廣告干擾&#xff0c;對財務人員而言十分實用。 01 軟件介紹 這款軟件就是XML格式&#xff08;數電票&#xff09;閱讀…

深度學習正則化:原理、方法與應用深度解析

摘要 本文深入探討深度學習中的正則化技術&#xff0c;介紹其避免過擬合的重要性&#xff0c;詳細講解常見的正則化方法&#xff0c;如 L 1 L_1 L1?和 L 2 L_2 L2?正則化、Dropout等&#xff0c;并通過線性回歸案例和神經網絡訓練流程對其進行直觀闡釋。幫助讀者理解正則化原…

【爬蟲】deepseek談爬蟲工具

2025 年&#xff0c;隨著 Web 技術的演進和反爬機制的升級&#xff0c;工具生態也會進一步優化。以下是 2025 年爬蟲 & 自動化測試的前沿工具預測&#xff0c;結合行業趨勢和現有技術發展方向&#xff1a; &#x1f680; 2025 年推薦組合&#xff08;預測版&#xff09; 1…

SQLMesh 測試自動化:提升數據工程效率

在現代數據工程中&#xff0c;確保數據模型的準確性和可靠性至關重要。SQLMesh 提供了一套強大的測試工具&#xff0c;用于驗證數據模型的輸出是否符合預期。本文將深入探討 SQLMesh 的測試功能&#xff0c;包括如何創建測試、支持的數據格式以及如何運行和調試測試。 SQLMesh …