想象一下,一个具有5个生产阶段的机器环境,每个阶段包含不同数量的相同机器(所谓的柔性流水车间)。
现在有一些工作必须安排。从阶段1到阶段5,所有作业必须从阶段1开始并在生产环境中的各个阶段进行处理。在每个阶段,仅一台机器必须处理一个作业。另外,每个作业每个阶段最多只需要一台机器即可进行工作(某些作业可能会跳过第4阶段,因为它们不需要在那里进行准备)。
我对决策变量x [j] [i] [f]有2个约束。
第一个说,每个作业最多可以处理每个阶段一台机器。 第二个说,每台机器最多只能处理最多。同时做一份工作。
现在我的问题是,定义决策变量,因为机器数f取决于阶段i。即:
因此,两个约束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台并行计算机。
答案 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。