我想用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]==1
或X[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都会改变。 我有什么更好的方法来解决这个问题?
感谢帮助!