如何定义索引为的决策变量取决于同一个决策变量的其他索引?

时间:2019-05-25 16:15:33

标签: scheduling job-scheduling

想象一下,一个具有5个生产阶段的机器环境,每个阶段包含不同数量的相同机器(所谓的柔性流水车间)。

现在有一些工作必须安排。从阶段1到阶段5,所有作业必须从阶段1开始并在生产环境中的各个阶段进行处理。在每个阶段,仅一台机器必须处理一个作业。另外,每个作业每个阶段最多只需要一台机器即可进行工作(某些作业可能会跳过第4阶段,因为它们不需要在那里进行准备)。

我对决策变量x [j] [i] [f]有2个约束。

第一个说,每个作业最多可以处理每个阶段一台机器。 第二个说,每台机器最多只能处理最多。同时做一份工作。

现在我的问题是,定义决策变量,因为机器数f取决于阶段i。即:

  • 第一阶段= 1:m [1] = 3台机器
  • 第i阶段= 2:m [2] = 2台机器
  • ...等等。

因此,两个约束C5和C6的总和的上限(即m [i])取决于i的值。

     // Indices
     int Nmax = ...; 
    range N = 1..Nmax; // jobs j in N

     int Mmax = ...;
    range M = 1..Mmax; // stages i in M
        {int} m[M]  = [{1,2,3},{1,2},{1,2,3,4,5},{1},{1,2,3}]; // Numbers of machines per stage
        {int} F = union(i in M) m[i];

       //decision variables:
         dvar int+ S[N][M]; // starting time of job j in stage i
         dvar int+ E[N]; // earliness of job j
         dvar int+ T[N]; // tardiness of job j.
         dvar boolean x[N][M][F]; // decision variable

      // objective function
      dexpr float Costs = sum(j in N) (E[j] + T[j]);
      minimize Costs

     subject to{
     C5: forall (j in N, i in M) sum(f in m[i])  x[j][i][f] <= 1;
     C6: forall(i in M, f in m[i]) sum(j in N)   x[j][i][f] <= 1;           
     }

幸运的是,我没有错误消息了。但是看来,CPLEX不了解机器的数量属于阶段。

例如: 作为决策变量x [j] [i] [f]的解,我得到了七个5x5矩阵。因此,每项工作都有一个矩阵,这首先是正确的。 但是矩阵的所有值都是零。此外,cplex在第2阶段以某种方式安排了作业,即应该至少有3台并行计算机,但是只有2台并行计算机。

1 个答案:

答案 0 :(得分:0)

我认为

{int} m[M]  = [{1,2,3},{1,2},{1,2,3,4,5},{1},{1,2,3}];

意味着在第一阶段的机器1,2,3中可用,在第二阶段的机器1,2中,等等。

由于您使用F而不是m[i]作为x的索引,这意味着您处于阶段的变量太多(选项太多),并且没有激活所有计算机。可以通过将与不可用计算机对应的变量强制为零(未测试的代码)来解决此问题:

forall (stage in M)
  forall (job in N)
    forall (machine in F : !(machine in m[stage]))
      x[job][machine][stage] == 0;

这仅允许m中指定的计算机处理阶段中的所有作业。这样,您的约束C5和C6就足够了:它们仅涉及存在的计算机,而与其他计算机对应的变量为0。