当前位置: 首页 > 知识库问答 >
问题:

如何使用CP Optimizer对收货和发货操作的容量限制进行建模?

郑伟彦
2023-03-14

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

我想使用CPLEX的CP优化器,我正在使用JavaEclipse对其进行建模。

我尝试用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-

共有1个答案

葛和志
2023-03-14

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

则每辆车的附加累积约束为:

cp.add(cp.le(cp.sum(脉冲(传输【v】【i】、操作初始负载)),仪器容量。get(v)));

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

希望有帮助

 类似资料:
  • 本文向大家介绍java 使用BigDecimal进行货币金额计算的操作,包括了java 使用BigDecimal进行货币金额计算的操作的使用技巧和注意事项,需要的朋友参考一下 float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用 java.math.BigDecimal。 而且使用BigDecimal类也可以进行大数的操作。 方法 类型 描述 public BigDeci

  • 本文向大家介绍用php+ajax新建流程(请假、进货、出货等),包括了用php+ajax新建流程(请假、进货、出货等)的使用技巧和注意事项,需要的朋友参考一下  对管理者来说,电脑操作的请假流程要比人工请假流程的效率高出很多,那么如何新建这个流程呢? 首先:需要明确需要操作哪些流程? 其次:每一个流程需要那些人员来执行? 最后:执行该流程人员的顺序是什么?  第一步:需要三张表,分别是:user表

  • 提示 页面模板源码免费开源,在uni-app的插件市场uView的 示例项目 中,在右上角选择"使用 HBuilderX 导入示例项目" 或者 "下载示例项目ZIP", 在HX运行项目即可看到和使用模板。 此功能包含两个页面,分为展示用户收货地址列表和添加收货地址。相关功能和数据均为本地模拟数据和格式,不一定 和用户实际环境相同,请自行修改对应的js实现逻辑,不要拘泥于模板的示例。

  • 测试数据:D8A8E00821608F227AE473774E177216 压缩数据:789C 解压缩数据: 我的程序:

  • 我在一个页面上有三个SVG图像。一个是“图像编辑器”,你可以输入一些文本,一个图标,拖动和左右缩放,等等。 另外两个SVG通过use元素使用来自顶部SVG的内容,并显示最终结果的预览。 当我在编辑器中编辑一些东西时,这两个预览会自动更新。很完美.但我不想在底部两个预览SVG中显示边界框、转换工具、指南等。 有没有一种方法可以对那些SVG的(阴影)DOM进行样式化(CSS)或操作(JS)以不显示这些