CPLEX如何使用元组中的集合作为索引

我想用MIP解决灵活的车间调度问题。

这是我的例子。有2个工作和3个机器。作业1具有2个操作O11和O12,作业2具有3个操作O21,O22和O23。每个操作都可以在第一组中选择一个可用的计算机,而处理时间是第二组。

例如,<2,3,{1,3},{7,9}>表示O23(作业2的第三次操作)可以在机器1和机器3上执行,处理时间分别为7和9。

因为每个操作只能选择一台机器,所以我要设置的约束就像forall(i,j) sum(k in mch_set) x[<i,j>][k]==1;

例如X[<2,3>][1]+X[<2,3>][3]==1X[2][3][1]+X[2][3][3]==1

这是我编写的代码,但是有一些我不知道如何解决的问题。

int nbJobs = 2;
int nbMchs = 3;

range Jobs = 1..nbJobs;
range Mchs = 1..nbMchs; 

// tuple
tuple operationInfo{
    int jobID;
    int pos; // j-th operation of job i
    {int} mch_set; // candidate machine ID for this job
    {int} pt_set;
};


{operationInfo} OpsInfo ={
<1,1,2},{3,5}>,<1,2,{10,5,8}>,<2,{2},{4}>,{8,{2,9}>
};

// Number of operations in each job
int nbOps[i in Jobs] = max(o in OpsInfo: o.jobID==i) o.pos;

dvar boolean x[o in ops][k in o.mchs_set];

subject to
{
    forall(o in OpsInfo)
      sum(k in o.mchs_set) x[o][k]==1;
};

我显然不知道如何制定Xijk,因为对于每一项工作,i,j和k都会改变。 我有什么更好的方法来解决这个问题?

感谢帮助!

ooohwj 回答:CPLEX如何使用元组中的集合作为索引

一个简单的解决方法是像这样定义x

int maxOps = max(i in Jobs) nbOps[i];
dvar boolean x[o in ops][1..maxOps];

使用此定义,您定义的变量超出了您的需要,但是您可以自由地仅使用所需的变量。为了避免出现“变量未使用”警告,您可以添加一个简单的约束,例如

forall(o in OpsInfo)
  forall(k in 1..maxOps)
    if (!(k in o.mchs_set))
      x[o][k] == 0;
本文链接:https://www.f2er.com/3162235.html

大家都在问