我正在对一个有容量约束的调度问题建模。任务是调度一组必须由特定机器执行的操作。更具体地说,我有一组车辆和一组位置,这些车辆必须访问这些位置才能执行一些操作。每个位置最多可以处理一辆车,并且每辆车都有最大容量。有两种类型的操作:提货操作和交付操作。取货工序对应正需求,交货工序对应负需求。该任务是在考虑车辆容量约束的情况下调度所有操作。
我想使用CPLEX中的CP优化器,并使用Java Eclipse对其进行建模。
我尝试使用cumul函数表达式对此进行建模,因为我可以在操作开始时使用StepAtStart函数来指示容量的增加。但是,该函数不对负值进行建模。
受SchedRCPSP示例的启发,我已经尝试过这段代码。但我不能输入负值,也不能减去负需求的表达式。
IloIntervalVar[] opList = new IloIntervalVar[nbOp];
[...]
[...]
IloCumulFunctionExpr[] resources = new IloCumulFunctionExpr[nbVeh];
for(int v = 1; v < nbVeh -1 ; v++) {
resources[v] = cp.cumulFunctionExpr();
}
for(int i = 0; i < nbOp; i++) {
Operation opi = operations.get(i);
if(opi.Demand> 0) {
resources[opi.vehicle] =
cp.sum(resources[opi.vehicle],
cp.stepAtStart(opList[i], opi.Demand));
}else {
resources[opi.vehicle] =
// THIS SHOULD BE A SUBSTRACTION (NEGATIVE DEMAND)
cp.sum(resources[opi.vehicle],
cp.stepAtStart(opList[i],opi.Demand));
}
if(opi.StartOperation){
resources[opi.vehicle] =
cp.sum(resources[opi.vehicle],
cp.stepAtStart(opList[i],opi.initialLoad));
}
}
for(int v = 1; v < nbVeh - 1 ; v++) {
cp.add(cp.le(resources[v], inst.capacities.get(v)));
}这是正确的方法吗?有没有一种方法可以模拟车辆内货物的这种波动?我想要模拟一种方法,禁止违反容量限制的车辆的某些粘性排列。
例如,如果我的车辆有10个单位的容量,初始负荷为8个单位,以及两个工序A和B(工序A:在城市1提货4个单位。工序B:在城市2交付5个单位)。我预计排列(A->B)是不允许的,因为它违反了城市1的车辆的容量约束。
发布于 2019-08-14 23:27:00
一个更好的解决方案是为每个物品和每个可能的车辆创建一个可选的间隔变量为装货日期,结束日期和卸货日期,设置其最小尺寸装货和卸货位置之间的时间距离。(别忘了为物品添加车辆的替代选项)
则为每辆车添加的累积约束为:
cp.add(cp.le(cp.sum(pulse(transportv,opi.initialLoad)),inst.capacities.get(V);
这将简化模型声明,并提高求解器的性能,这要归功于加载和卸载日期之间的时间相关性
希望对您有所帮助
https://stackoverflow.com/questions/57450274
复制相似问题