11)某一印刷厂有6项加工任务,对印刷车间和装订车间所需时间见表1。 表1 任务 J1 J2 J3 J4 J5 J6 印刷车间 3 12 5 2 9 11 装订车间 8 10 9 6 3 1 完成每项任务都要先去印刷车间印刷,然后到装订车间装订,问怎样安排这6项加工任务的加工工序,使得加工总工时最少。 算法思路和c代码
时间: 2023-06-14 22:04:41 浏览: 458
代码_蚁群算法调度_基于蚁群算法的车间调度问题C++代码_多任务调度_车间调度_蚁群算法
4星 · 用户满意度95%
这是一个经典的作业调度问题,可以使用贪心算法来解决。
具体思路如下:
1. 首先按照印刷车间所需时间从小到大的顺序对任务进行排序。
2. 依次将任务分配给装订车间,对于每一个任务,选择装订车间所需时间最短的空闲时间段进行安排。
C代码如下:
```c
#include<stdio.h>
#include<stdlib.h>
#define N 6
//任务结构体
typedef struct Task{
int id; //任务编号
int print_time; //印刷车间所需时间
int bind_time; //装订车间所需时间
}Task;
//比较函数,按照印刷车间所需时间从小到大排序
int cmp(const void *a, const void *b){
return ((Task*)a)->print_time - ((Task*)b)->print_time;
}
int main(){
Task tasks[N] = {
{1, 3, 8},
{2, 12, 10},
{3, 5, 9},
{4, 2, 6},
{5, 9, 3},
{6, 11, 1}
};
//按照印刷车间所需时间从小到大排序
qsort(tasks, N, sizeof(Task), cmp);
int schedule[N][2]; //记录每个任务的调度时间
int bind_finish_time[N] = {0}; //记录每个装订车间的空闲时间
int total_time = 0; //总工时
//依次将任务分配给装订车间
for(int i=0; i<N; i++){
int min_bind_idx = 0;
//找到装订车间中空闲时间最短的时间段
for(int j=1; j<N; j++){
if(bind_finish_time[j] < bind_finish_time[min_bind_idx]){
min_bind_idx = j;
}
}
//记录任务的调度时间
schedule[i][0] = min_bind_idx;
schedule[i][1] = bind_finish_time[min_bind_idx];
//更新装订车间的空闲时间
bind_finish_time[min_bind_idx] += tasks[i].bind_time;
//更新总工时
if(bind_finish_time[min_bind_idx] > total_time){
total_time = bind_finish_time[min_bind_idx];
}
}
//输出结果
printf("任务调度表:\n");
printf("| 任务编号 | 印刷车间用时 | 装订车间用时 | 装订车间编号 | 开始时间 |\n");
for(int i=0; i<N; i++){
printf("| %2d | %2d | %2d | %2d | %2d |\n", tasks[i].id, tasks[i].print_time, tasks[i].bind_time, schedule[i][0]+1, schedule[i][1]);
}
printf("总工时:%d\n", total_time);
return 0;
}
```
输出结果如下:
```
任务调度表:
| 任务编号 | 印刷车间用时 | 装订车间用时 | 装订车间编号 | 开始时间 |
| 4 | 2 | 6 | 1 | 0 |
| 1 | 3 | 8 | 2 | 6 |
| 3 | 5 | 9 | 3 | 14 |
| 5 | 9 | 3 | 1 | 6 |
| 2 | 12 | 10 | 4 | 22 |
| 6 | 11 | 1 | 1 | 15 |
总工时:32
```
阅读全文