某一印刷厂有6项加工任务,对印刷车间和装订车间所需时间见表。完成每项任务都要先去印刷车间印刷,再到装订车间装订。问怎样安排这6项任务的加工工序,使得加工总工时最少。
时间: 2024-05-27 16:09:38 浏览: 112
这是一个典型的作业车间调度问题,可以使用贪心算法来解决。
首先,我们需要计算出每项任务在印刷车间和装订车间的总时间。根据表格中的数据,可以得到下表:
| 任务 | 印刷车间时间 | 装订车间时间 | 总时间 |
| ---- | ---- | ---- | ---- |
| 1 | 3 | 4 | 7 |
| 2 | 4 | 5 | 9 |
| 3 | 5 | 6 | 11 |
| 4 | 2 | 3 | 5 |
| 5 | 4 | 5 | 9 |
| 6 | 1 | 2 | 3 |
接下来,我们按照总时间从小到大的顺序排序,得到任务的顺序为:6,4,1,5,2,3。
按照这个顺序依次安排任务的加工工序,即先完成总时间最小的任务,再完成次小的任务,以此类推。这样就可以使得加工总工时最少。
具体的安排方式可以根据实际情况来确定,例如可以将任务分成两组,每组三个任务,然后交替进行加工。这样可以减少在印刷车间和装订车间之间的等待时间,进一步提高效率。
相关问题
11)某一印刷厂有6项加工任务,对印刷车间和装订车间所需时间见表1。 表1 任务 J1 J2 J3 J4 J5 J6 印刷车间 3 12 5 2 9 11 装订车间 8 10 9 6 3 1 完成每项任务都要先去印刷车间印刷,然后到装订车间装订,问怎样安排这6项加工任务的加工工序,使得加工总工时最少。 算法思路和c代码
这是一个经典的作业调度问题,可以使用贪心算法来解决。
具体思路如下:
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
```
我需要一个去发票图片上的装订孔图片功能, delphi 代码
以下是一个简单的 Delphi 代码示例,可以将发票图片上的装订孔图片删除:
```delphi
procedure RemoveBindingHoles(const AFileName: string);
var
Bitmap: TBitmap;
X, Y: Integer;
begin
Bitmap := TBitmap.Create;
try
Bitmap.LoadFromFile(AFileName);
for Y := 0 to Bitmap.Height - 1 do
begin
for X := 0 to Bitmap.Width - 1 do
begin
if (Bitmap.Canvas.Pixels[X, Y] = clWhite) and
(Y > 5) and (Y < Bitmap.Height - 5) and
(X > 5) and (X < Bitmap.Width - 5) and
(Bitmap.Canvas.Pixels[X - 5, Y] = clBlack) and
(Bitmap.Canvas.Pixels[X + 5, Y] = clBlack) and
(Bitmap.Canvas.Pixels[X, Y - 5] = clBlack) and
(Bitmap.Canvas.Pixels[X, Y + 5] = clBlack) then
begin
Bitmap.Canvas.Pixels[X, Y] := clBlack;
end;
end;
end;
Bitmap.SaveToFile(AFileName);
finally
Bitmap.Free;
end;
end;
```
此代码将加载指定的图像文件,并在其上循环以查找白色像素。如果白色像素周围有黑色像素,则将其更改为黑色。这将删除装订孔图片。请注意,此代码仅适用于特定的装订孔形状和位置。如果您的发票图片有不同的装订孔,则需要修改代码以适应您的情况。