流水线问题(算法设计)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.mzph.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 …