当前位置: 首页 > news >正文

博客打卡-求解流水线调度

题目如下:

有n个作业(编号为1~n)要在由两台机器M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工,然后在M2上加工。M1和M2加工作业i所需的时间分别为ai和bi(1≤i≤n)。
流水作业调度问题要求确定这n个作业的最优加工顺序,使得从第一个作业在机器M1上开始加工,到最后一个作业在机器M2上加工完成所需的时间最少。可以假定任何作业一旦开始加工,就不允许被中断,直到该作业被完成,即非优先调度。

输入格式:

第一行输入作业数n,接着的n行分别为在M1和M2加工各作业所需的时间。

输出格式:

先输出所需加工时间,再输入最优调度方案。

输入样例1:

4
5 6
12 2
4 14
8 7

输出样例1:

33
3 1 4 2 

解题思路如下:

本题涉及的是两台机器流水作业调度问题,目的是找到一种作业加工顺序,使得从第一个作业在M1机器上开始加工到最后一个作业在M2机器上加工完成的总时间最短。为了解决这个问题,采用了回溯法(深度优先搜索DFS结合剪枝策略)来枚举所有可能的作业排列顺序,并计算每种顺序下的总加工时间以寻找最优解。

具体来说,算法首先读取每个作业在M1和M2上的加工时间,然后通过递归方式交换作业顺序模拟所有可能的排列情况。在搜索过程中,对于每一个作业排列,模拟其在两台机器上的加工过程:先计算该排列下M1机器的累计加工时间,再根据M1的完成时间确定M2机器的开始时间并累加相应的加工时间。如果当前排列下的总完成时间小于已知的最佳时间,则更新最佳时间和对应的作业顺序作为最优解。此外,采用剪枝技术,即一旦发现当前路径的累计完成时间已经超过目前最优解的时间,立即停止进一步搜索该分支,从而提高搜索效率。最终输出总最短完成时间和对应的最优作业调度方案。

具体代码如下:

#include <iostream>
#include <algorithm>
#include <climits>
using namespace std;const int MAX = 1000;
int n;                      // 作业数
int a[MAX];                 // M1加工时间
int b[MAX];                 // M2加工时间
int best_time = INT_MAX;    // 最优调度时间
int current_order[MAX];     // 当前调度顺序
int best_order[MAX];        // 最优调度顺序void dfs(int level, int time_m1, int time_m2) {if (level > n) {if (time_m2 < best_time) {best_time = time_m2;for (int i = 1; i <= n; i++) {best_order[i] = current_order[i];}}return;}for (int i = level; i <= n; i++) {swap(current_order[level], current_order[i]);int new_time_m1 = time_m1 + a[current_order[level]];int new_time_m2 = max(time_m2, new_time_m1) + b[current_order[level]];if (new_time_m2 < best_time) {dfs(level + 1, new_time_m1, new_time_m2);}swap(current_order[level], current_order[i]);}
}int main() {// 输入处理cin >> n;for (int i = 1; i <= n; i++) {cin >> a[i] >> b[i];current_order[i] = i;}// 回溯搜索dfs(1, 0, 0);// 输出结果cout << best_time << endl;for (int i = 1; i <= n; i++) {cout << best_order[i] << " ";}cout << endl;return 0;
}

 提交结果如下:

答案正确 

相关文章:

  • ARM (Attention Refinement Module)
  • 51单片机课设基于GM65模块的二维码加条形码识别
  • 无法加载文件 E:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本
  • 2025年【道路运输企业安全生产管理人员】考试题库及道路运输企业安全生产管理人员考试内容
  • 1688 数据接口调用秘籍:高效获取商品实时信息的开发指南
  • MySQL多条件查询深度解析
  • MySQL 聚簇索引与非聚簇索引:底层原理与实战深度解析
  • Redis设计与实现——Redis命令参考与高级特性
  • 【Java】应对高并发的思路
  • 20250517 我设想一个空间,无限大,空间不与其中物质进行任何作用,甚至这个空间能容纳可以伸缩的空间
  • MySQL中的数据类型和函数
  • 游戏引擎学习第289天:将视觉表现与实体类型解耦
  • 非易失性存储技术综合对比:EEPROM、NVRAM、NOR Flash、NAND Flash和SD卡
  • ORACLE RAC环境REDO日志量突然增加的分析
  • 大麦(Hordeum vulgare)中 BAHD 超家族酰基转移酶-文献精读129
  • 面试真题 - 高并发场景下Nginx如何优化
  • Vue百日学习计划Day21-23天详细计划-Gemini版
  • 【GESP】C++三级真题 luogu-B3867 [GESP202309 三级] 小杨的储蓄
  • 使用Pinia持久化插件-persist解决刷新浏览器后数据丢失的问题
  • Oracle 的 ASSM 表空间
  • 上海交大曾小勤:科技传播不应停留于知识搬运,要做科学思维的播种机
  • 人形机器人灵犀X2掌握新技能:有了“内心戏”,还会拳脚功夫
  • 俄代表团:16日上午将继续“等候乌代表团”
  • 百色一女子称家委会强制排班被迫抱婴儿校门口站岗?区教育局:自愿参与
  • 苏轼“胡为适南海”?
  • “一百零一个愿望——汉字艺术展”亮相意大利威尼斯