动态规划——《1》装配线调度

《1》装配线调度:

问题描述

  一个汽车公司在有2条装配线的工厂内生产汽车,每条装配线有n个装配站,不同装配线上对应的装配站执行的功能相同,但是每个站执行的时间是不同的。在装配汽车时,为了提高速度,可以在这两天装配线上的装配站中做出选择,即可以将部分完成的汽车在任何装配站上从一条装配线移到另一条装配线上。装配过程如下图所示:

  装配过程的时间包括:进入装配线时间e、每装配线上各个装配站执行时间a、从一条装配线移到另外一条装配线的时间t、离开最后一个装配站时间x。举个例子来说明,现在有2条装配线,每条装配线上有6个装配站,各个时间如下图所示:

从图中可以看出按照红色箭头方向进行装配汽车最快,时间为38。分别现在装配线1上的装配站1、3和6,装配线2上装配站2、4和5。

代码:

<dynamicPlan.h>

#pragma once
#inclue<iostream> 
using namespace std;
#define N 6

int last_f;
int last_l;

  void fastest_way(int a[][N],int t[][N-1],int e[],int x[],int f[][N],int l[][N],int n)
  {
      int i,j;
      f[0][0] = e[0] + a[0][0];
      f[1][0] = e[1] + a[1][0];
      l[0][0] = 1;                             //保存从哪个站到哪个站
      l[1][0] = 2;
      for(j=1;j<n;j++)
      {
          if(f[0][j-1] < f[1][j-1] + t[1][j-1])//跟同时到达下一个位置的前面的事件相那个比较
          {
              f[0][j] = f[0][j-1] + a[0][j];
              l[0][j] = 1;
          }
          else
          {
              f[0][j] = f[1][j-1] + t[1][j-1] + a[0][j];
              l[0][j] = 2;
          }
          if(f[1][j-1] < f[0][j-1] + t[0][j-1])
          {
              f[1][j] = f[1][j-1] + a[1][j];
              l[1][j] = 2;
          }
          else
          {
              f[1][j] = f[0][j-1] + t[0][j-1] + a[1][j];
              l[1][j] = 1;
          }
      }
      if(f[0][n-1] + x[0] < f[1][n-1] + x[1])
      {
          last_f = f[0][n-1] + x[0];
          last_l = 1;
      }
      else
      {
          last_f = f[1][n-1] + x[1];
          last_l = 2;
      }
  }
  
  void print_station(int l[][N],int last_l,int n)
  {
      int i = last_l;
      int j;
      printf("line %d,station %d\n",i,n);
     for(j=n-1;j>0;--j)
      {
          i = l[i-1][j];
          printf("line %d,station %d\n",i,j);
      }
  }


<testMain.cpp>

 #include"dynamicPlan.h"
  
  int main()
  {
      int Station[2][6] = {{7,9,3,4,8,4},{8,5,6,4,5,7}};
      int Midtime[2][5] = {{2,3,1,3,4},{2,1,2,2,1}};
      int f[2][6] = {0};
      int l[2][6] = {0};   
      int Exern[2] = {2,4};
      int Out[2] = {3,2};
      int i,j;
      fastest_way(a,t,e,x,f,l,6);
     
      print_station(l,last_l,6);

      return 0;
  }












  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值