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

Algorithm CPLE如何动态设置决策变量数组,algorithm,multidimensional-array,scheduling,cplex,opl,Algorithm,Multidimensional Array,Scheduling,Cplex,Opl,我想用MIP而不是CP来描述一个灵活的job shop调度问题 如果存在指示每个作业的操作数的数组 num_op = [3, 2, 5] 并且Xijk是指示作业i的第j次操作是否在机器k上处理的决策变量 我的问题是,我不知道如何使用每个作业的不同操作数启动三维阵列 num_op = [3, 2, 5] 我写了这个dvar布尔x[I in Jobs][j in][k in Machs],我不知道如何完成它 请帮帮我。谢谢 如果我正确理解了您的示例,那么您对num_op的定义表明您有三个不同的作

我想用MIP而不是CP来描述一个灵活的job shop调度问题

如果存在指示每个作业的操作数的数组

num_op = [3, 2, 5]
并且Xijk是指示作业i的第j次操作是否在机器k上处理的决策变量

我的问题是,我不知道如何使用每个作业的不同操作数启动三维阵列

num_op = [3, 2, 5]
我写了这个
dvar布尔x[I in Jobs][j in][k in Machs],我不知道如何完成它


请帮帮我。谢谢

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

这里有一个替代方案:

  • 将M定义为最大操作数(在您的情况下为5)
  • 定义
    dvar布尔x[i in Jobs][j in 1..M][k in Machs]
  • 将与不存在的操作相对应的所有变量显式固定为0:
    如果(j>num_op[i])X[i][j][k]==0,则所有(i在作业中,j在1..M中,k在马赫数中)的
最后一步甚至是可选的:您可以为不存在的操作定义变量,但不要在模型中的任何地方使用它们(不过,这可能会对未使用的变量发出警告)


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

我可以问您另一个问题吗?由于我的
M
将是一个数组,如何将它实现为
dvar布尔x[i in Jobs][j in 1..M][k in Machs]?换句话说,我希望它是一个锯齿状的3D阵列。我可以使用tuple作为决策变量吗?非常感谢您的帮助。我不太确定
M
如何成为一个数组(它表示
num_op
中的最大值,所以它应该是一个数字)。但在任何情况下,如果
M
是一个数组,则可以在M
中写入
j,而不是在1..M
中写入
j。不能将元组用作决策变量,但可以使用元组索引决策变量。这可能就是你想要的,我写了这个:
intnbops[1..3]=[3,2,5];dvar布尔x[Jobs][j在nbOps][Mchs]中但错误表明我不能将int[range]与“in”一起使用。因为在我的问题中,每个作业中有不同数量的操作,并且每个操作可以在其候选机器集中选择机器。因此,我需要变量Xijk来表示作业I的第j次操作是否在机器k上处理。不同的工作我有不同的操作次数。j取决于工作i。有什么方法可以让我模拟这个Xijk吗?非常感谢。为什么要(或需要)使用3D阵列对此进行建模?使用由一组元组索引的简单数组在实践中要简单得多,通常更容易正确编写约束,也更容易解释结果。编写好的(即正确且可读的)模型的最大障碍之一是,人们在心理上对这些模型的期望和思维方式一直停留在2D、3D或更高的数组中。