繁体   English   中英

如何使用CP Optimizer对收货和交付操作进行容量约束建模?

[英]How to model capacity constraints with pick-up and delivery operations with CP Optimizer?

我正在对具有容量限制的调度问题建模。 任务是安排必须由特定计算机执行的一组操作。 更具体地说,我有一组车辆和一组位置,这些车辆必须访问这些位置才能执行一些操作。 每个位置最多只能处理一辆车,每辆车的容量最大。 有两种类型的操作:提取和交付操作。 取货操作对应于正需求,而交货操作对应于负需求。 任务是在考虑到车辆的容量限制的同时安排所有操作。

我想使用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)));
}

这是正确的方法吗? 有没有一种方法可以模拟车辆内部货物的这种波动? 我想建模一种方法,禁止违反容量限制的车辆使用一定的vistis排列。

例如,如果我的车辆的容量为10个单位,初始负载为8个单位,并且有两个操作A和B(操作A:在城市1上取4个单元,操作B:在城市2上取5个单元)。 我希望不允许排列(A-> B),因为它违反了城市1处车辆的容量限制。

更好的解决方案是为每个项目和每个可能的车辆创建一个可选的时间间隔变量,该间隔变量是装载日期,结束日期是卸载日期,将其最小大小设置为装载和卸载位置之间的时间距离。 (不要忘了为物品添加替代车辆)

那么,每辆车增加的累积约束为:

cp.add(cp.le(cp.sum(pulse(transport [v] [i],opi.initialLoad)),inst.capacities.get(v))));

由于加载和卸载日期之间的时间相关性,这将简化模型声明并提高求解器的性能

希望对您有所帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM