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

时间:2019-11-03 18:00:10

标签: algorithm multidimensional-array scheduling cplex opl

我想用MIP代替CP来制定灵活的车间调度问题。

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

num_op = [3, 2, 5]

Xijk 是决定变量,指示是否在机器k上处理作业i的第j个操作。

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

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

请帮助我。谢谢!

1 个答案:

答案 0 :(得分:1)

如果我正确理解了您的示例,那么您对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的有效组合。