CPLE 如何动态设置决策变量数组

CPLE How to set a decision variable array dynamically

我想用 MIP 而不是 CP 来制定一个灵活的作业车间调度问题。

如果有一个数组表示每个作业的操作次数。

num_op = [3, 2, 5]

Xijk是判断作业i的第j次操作是否在机器k上处理的决策变量。

我的问题是我不知道如何用每个作业的不同操作数来启动 3-D 数组。

我写了这个dvar boolean x[i in Jobs][j in][k in Machs];,但我不知道如何完成它。

请帮助我。谢谢!!

如果我正确理解了您的示例,那么您对 ​​num_op 的定义表明您有三个不同的作业,第一个作业有 3 个操作,第二个作业有 2 个,最后一个作业有 5 个操作。这意味着 Xijk 的第二个维度必须根据第一个维度进行更改。 CPLEX 无法实现如此灵活的数组大小。

这是一个替代方案:

  • 将 M 定义为最大操作数(在您的情况下为 5)。
  • 定义dvar boolean x[i in Jobs][j in 1..M][k in Machs];
  • 将对应于不存在的操作的所有变量显式固定为 0: forall (i in Jobs, j in 1..M, k in Machs) if (j > num_op[i]) X[i][j][k] == 0;

最后一步甚至是可选的:您可以为不存在的操作定义变量,但不要在模型中的任何地方使用它们(不过,这可能会对未使用的变量发出警告)。

另一种选择是创建一个元组tuple { int i; int j; int k },然后创建一个元组集,其中包含此元组集的i、j、k和索引X的所有有效组合。