【问题标题】:CPLE How to set a decision variable array dynamicallyCPLE 如何动态设置决策变量数组
【发布时间】:2019-11-03 18:00:10
【问题描述】:

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

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

num_op = [3, 2, 5]

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

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

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

请帮助我。谢谢!!

【问题讨论】:

    标签: algorithm multidimensional-array scheduling cplex opl


    【解决方案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的所有有效组合的元组。

    【讨论】:

    • 我能再问你一个问题吗?由于我的M 将是一个数组,如何将它实现为dvar boolean x[i in Jobs][j in 1..M][k in Machs];?换句话说,我希望它是一个锯齿状的3D 数组。而且,我可以使用元组作为决策变量吗?非常感谢你帮助我。
    • 我不太确定M 怎么可能是一个数组(它表示num_op 中的最大值,所以它应该是一个数字)。但无论如何,如果M 是一个数组,你可以写j in M 而不是j in 1..M。您不能使用元组作为决策变量,但可以使用元组来索引决策变量。这可能就是你想要的,
    • 我写了这个:int nbOps[1..3]=[3,2,5]; dvar boolean x[Jobs][j in nbOps][Mchs];但错误说我不能使用 int[range] 和“in”。
    • 因为在我的问题中,每个作业的操作数量不同,每个操作都可以在其候选机器集中选择机器。因此,我需要变量 Xijk 来表示作业 i 的第 j 个操作是否在机器 k 上处理。不同的工作我有不同数量的操作。 j 取决于工作 i。我有什么方法可以为这个 Xijk 建模吗?非常感谢。
    • 为什么要(或需要)用 3D 数组对此进行建模?使用由一组元组索引的简单数组在实践中要简单得多,通常更容易正确编写约束,也更容易解释结果。编写好的(即正确和可读的)模型的最大障碍之一是被困在从 2D、3D 或更高阵列的角度思考这些模型的心理期望和方法中。
    猜你喜欢
    • 1970-01-01
    • 2011-10-28
    • 2013-05-15
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    • 2019-01-29
    • 2021-01-04
    • 1970-01-01
    相关资源
    最近更新 更多