java – 在OptaPlanner中使用优先级和车辆故障的CVRPTW
作者:互联网
我有一个问题,我很难管理它.我想使用OptaPlanner来解决具有优先级和车辆故障的CVRPTW.到目前为止,我所做的是获取标准示例并在GUI中解决它,然后保存结果.比我在python中修改.xml文件,手动删除车辆并释放客户.我知道正确的方法是制作一个ProblemFact,但我不知道如何做到这一点.我看到了一些答案,但我需要更多的帮助或一个如何完成的例子.
第二件事是,我如何为优先级建模.所以顾客’A’必须先来顾客’B’. (唯一的例子是另一个叫做Project Job Scheduling的问题)
非常感谢你!
解决方法:
问题A非常简单.
问题B不是这样.
对于A,您需要处于可以访问对象图的位置(例如,在反序列化解决方案之后).然后,您获得该车辆的第一个客户,将其previousStandstill设置为null:
Customer nextCustomer = vehicle.getNextCustomer();
if (nextCustomer != null){
scoreDirector.beforeVariableChanged(nextCustomer, "previousStandstill");
nextCustomer.setPreviousStandstill(null);
scoreDirector.afterVariableChanged(nextCustomer, "previousStandstill");
scoreDirector.triggerVariableListeners();
}
我认为问题B值得更多关注.这样做的默认方式是实现一个OrderListener,它触发客户的previousStandstill,只要在任何客户上更改了previousStandstill,监听器就会更新车辆链中的所有客户:
@CustomShadowVariable(variableListenerClass = OrderListener.class,
sources = {@PlanningVariableReference(variableName = "previousStandstill")})
public Integer getPositionInVehicleChain() {
return position;
}
然后在OrderListener的afterVariableChanged方法中有这样的东西:
while (nextCustomer != null) {
if (position == nextTe.getPositionInVehicleChain()) break;
scoreDirector.beforeVariableChanged(nextCustomer, "position");
nextCustomer.setPositionInStapelabschnitt(pos);
scoreDirector.afterVariableChanged(nextCustomer, "position");
pos++;
nextCustomer = nextCustomer.getNextCustomer();
}
然后在Customer类中实现isBeforeCustomer(Customer otherCustomer),您可以在其中比较这两个位置.
然而,这当然不是最优雅的方法,因为其时间复杂度为O(n),其中n是计划实体的总数.这样做的好方法是在每辆车的客户上实施所谓的订单维护数据结构.此数据结构支持操作
> Insert(x,y):这是在现有链中插入新客户
>删除(x):这是删除现有链中的客户,请参阅问题A.
> Order(x,y):确定x是否在链序中位于y之前 – 这就是你所追求的.
现有技术的算法(参见,例如,“Bender MA,Cole R.,Demaine ED,Farach-Colton M.,Zito J.(2002)Two Simplified Algorithms for Maintaining Order in aList.In:MöhringR., Raman R.(eds)Algorithms – ESA 2002.ESA 2002. Computer Chactions in Computer Science,vol 2461. Springer,Berlin,Heidelberg“)支持O(1)摊销插入/删除时间和O(1)最坏情况查询时间,比上面提出的系统要好得多(但还有很多工作).如果您对实现感兴趣,请浏览transitivity utils.如果将这样的数据结构作为影子变量包含在optaplanner中,我会非常感兴趣 – 实体是否在链中的另一个之前是无处不在的问题.
标签:java,optimization,traveling-salesman,optaplanner 来源: https://codeday.me/bug/20190627/1303716.html