车间调度问题

作业车间调度问题描述

作业车间调度问题(Job Shop Scheduling, JSP)是最经典的几个NP-hard问题之一。其应用领域极其广泛,涉及航母调度,机场飞机调度,港口码头货船调度,汽车加工流水线等。

JSP问题描述:一个加工系统有M台机器,要求加工N个作业,其中,作业i包含工序数为Li。令,则L为任务集的总工序数。其中,各工序的加工时间已确定,并且每个作业必须按照工序的先后顺序加工。调度的任务是安排所有作业的加工调度排序,约束条件被满足的同时,使性能指标得到优化。

作业车间调度需要考虑如下约束:

Cons1:每道工序在指定的机器上加工,且必须在其前一道工序加工完成后才能开始加工;

Cons2:某一时刻1台机器只能加工1个作业;

Cons3:每个作业只能在1台机器上加工1次;

Cons4:各作业的工序顺序和加工时间已知,不随加工排序的改变而改变。

问题实例

下面给出作业车间调度问题的一个实例,其中每个工序上标注有一对数值(m,p),其中,m表示当前工序必须在第m台机器上进行加工,p表示第m台机器加工当前工序所需要的加工时间。(注:机器和作业的编号从0开始)
jop0=[(0,3),(1,2),(2,2)]
jop1=[(0,2),(2,1),(1,4)]
jop2=[(1,4),(2,3)]
在这个例子中,作业jop0有3道工序:它的第1道工序上标注有(0,3),其表示第1道工序必须在第0台机器上进行加工,且需要3个单位的加工时间;它的第2道工序上标注有(1,2),其表示第2道工序必须在第1台机器上进行加工,且需要2个单位的加工时间;余下的同理。总的来说,这个实例中共有8道工序。
该问题的一个可行解是L=8道工序开始时间的一个排列,且满足问题的约束。下图给出了一个可行解(注:该解不是最优解)的示例:
在这里插入图片描述

使用深度搜索解决车间调度问题

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int totalStep,minTime;
int n,m;
int Step[105];
struct Job
{
    int machine;
    int len;
} job[105][105];
int jobEnd[105][105];
int jobStep[105];
int machineWorkTime[105];
struct Recording
{
    int start;
    int ed;
    int job;
    int machine;
} best[105],now[105];
void init()
{
    totalStep=0;
    minTime = 999999999;
    memset(jobStep,0,sizeof(jobStep));
    memset(machineWorkTime,0,sizeof(machineWorkTime));
    memset(best,0,sizeof(best));
    memset(jobEnd,-1,sizeof(jobEnd));
}
void dfs(int step,int time)
{
    if (time>=minTime) return;
    if (step == totalStep)
    {
        minTime = time;
        for (int i=0; i<totalStep; i++)
            best[i]=now[i];
        /*int gantt[105][105];
        for (int i=0;i<totalStep;i++)
        {
            for (int j=best[i].start;j<best[i].ed;j++)
            {
                gantt[best[i].machine][j]=best[i].job;
            }
        }
        for (int i=0;i<m;i++)
            for (int j=0;j<minTime;j++)
                printf("%d%c",gantt[i][j],j==minTime-1?'\n':' ');
            printf("\n");*/
        return;
    }

    for (int i=0; i<n; i++)
    {
        int j = jobStep[i];
        if (j >= Step[i]) continue;
        int thisMachine = job[i][j].machine;
        now[step].machine = thisMachine;
        now[step].job = i+1;
        int temp =  machineWorkTime[thisMachine];
        int beginTime = max(jobEnd[i][j-1],machineWorkTime[thisMachine]);
        now[step].start = beginTime;
        machineWorkTime[thisMachine] =beginTime + job[i][j].len;
        jobEnd[i][j] = now[step].ed = machineWorkTime[thisMachine];
        jobStep[i]++;
        //printf("%d %d %d\n",step,i,j);
        dfs(step+1, max(time,machineWorkTime[thisMachine]) );
        jobStep[i]--;
        machineWorkTime[thisMachine]=temp;
    }
}
int main()
{
    printf("输入工作数量:");
    scanf("%d",&n);
    printf("输入机器数量:");
    scanf("%d",&m);
    init();
    for (int i=0; i<n; i++)
    {
        printf("输入工作%d的步骤数量:",i);
        scanf("%d",&Step[i]);
        totalStep+=Step[i];
        for (int j=0; j<Step[i]; j++)
        {
            printf("步骤%d运行于哪个机器,消耗时间:",j+1);
            scanf("%d%d",&job[i][j].machine,&job[i][j].len);
        }

    }
    dfs(0,0);
    printf("最短时间为:%d\n",minTime);

    int gantt[105][105];
    for (int i=0; i<totalStep; i++)
    {
        for (int j=best[i].start; j<best[i].ed; j++)
        {
            gantt[best[i].machine][j]=best[i].job;
        }
    }

    for (int i=0; i<m; i++)
        for (int j=0; j<minTime; j++)
            printf("%d%c",gantt[i][j],j==minTime-1?'\n':' ');
}
  • 29
    点赞
  • 148
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值