ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

车间调度问题

2022-04-18 19:00:12  阅读:146  来源: 互联网

标签:车间 int 调度 问题 ++ job machineWorkTime best 105


问题描述 六工四机问题

一个车间有四台机器,要求加工6个作业

分工序,每个机器加工不同的工序

M1 M2 M3 M4
J1 8 4 5 3
J2 2 6 5 6
J3 12 5 4 2
J4 4 1 4 9
J5 6 2 7 3
J6 5 6 9 3
//深度搜索算法
#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' : ' ');
}

标签:车间,int,调度,问题,++,job,machineWorkTime,best,105
来源: https://www.cnblogs.com/W-xzg/p/16161117.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有