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
的所有有效组合。
我想用 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
的所有有效组合。