转换矩阵未包含在我在CPLEX CP中的调度问题的解决方案中



我的无重叠约束中的距离矩阵似乎在我的模型结果中不起作用。我已经用元组集的形式化了距离矩阵。我已经尝试了两种不同的方式,可以在代码中看到。两个元组集似乎都是正确的,并且在dvar序列的noOverlap约束中添加了距离矩阵。

然而,我没有看到在最佳结果中增加产品之间的过渡距离。工作似乎在完成的同时继续。而不是等待过渡时间。我希望这个转换矩阵同时适用于机器1和机器2。

有人能告诉我我的模型公式中做错了什么吗?我研究过这些例子,但它们似乎是以同样的方式构建的。所以我不知道我做错了什么。

mod。


using CP;
// Number of Machines (Packing + Manufacturing)
int nbMachines = ...;
range Machines = 1..nbMachines;

// Number of Jobs
int nbJobs = ...;
range Jobs = 1..nbJobs;
int duration[Jobs,Machines] = ...;
int release = ...;
int due     = ...;
tuple Matrix { int job1; int job2; int value; }; 
//{Matrix} transitionTimes ={<1,1,0>,<1,2,6>,<1,3,2>,<2,1,2>,<2,2,0>,<2,3,1>,<3,1,2>,<3,2,3>,<3,3,0>};
{Matrix} transitionTimes ={ <i,j, ftoi(abs(i-j))> | i in Jobs, j in Jobs }; 
dvar interval task[j in Jobs] in release..due;
dvar interval opttask[j in Jobs][m in Machines] optional size duration[j][m];
dvar sequence tool[m in Machines] in all(j in Jobs) opttask[j][m];   
execute {
cp.param.FailLimit = 5000;
}
// Minimize the max timespan
dexpr int makespan = max(j in Jobs, m in Machines)endOf(opttask[j][m]);
minimize makespan;

subject to {
// Each job needs one unary resource of the alternative set s (28)
forall(j in Jobs){
alternative(task[j], all(m in Machines) opttask[j][m]);
}     
forall(m in Machines){
noOverlap(tool[m],transitionTimes);
}     
};
execute {
writeln(task);
};

日期。

nbMachines = 2;
nbJobs = 3;
duration = [
[5,6], 
[3,4],
[5,7]
];
release = 1;
due = 30;

``

您应该为每个序列指定间隔类型。在您的情况下,类型是作业id:

int JobId[j in Jobs] = j;
dvar sequence tool[m in Machines] in all(j in Jobs) opttask[j][m] types JobId;

相关内容

最新更新