Java jsprit VRP相关作业硬约束

Java jsprit VRP相关作业硬约束,java,jsprit,Java,Jsprit,是否可以通过硬合同在同一路线上安排两次或多次装运 如果没有,您知道其他可以处理此类限制的java库吗 谢谢大家! 确保货物在同一路线的最简单方法是使用技能标记这些货物 shipmentBuilder.addRequiredSkill("tag") 但是,您还需要标记特定的车辆: vehicleBuilder.addSkill("tag") P>并确保让算法考虑技巧/这些标签(参见-1.0需要使用1.3.2快照)。 如果不想为特定车辆分配标签,则需要实现core.problem.constr

是否可以通过硬合同在同一路线上安排两次或多次装运

如果没有,您知道其他可以处理此类限制的java库吗


谢谢大家!

确保货物在同一路线的最简单方法是使用技能标记这些货物

shipmentBuilder.addRequiredSkill("tag")
但是,您还需要标记特定的车辆:

vehicleBuilder.addSkill("tag")
<> P>并确保让算法考虑技巧/这些标签(参见-1.0需要使用1.3.2快照)。

如果不想为特定车辆分配标签,则需要实现core.problem.constraint.HardRouteStateLevelConstraint,这基本上就是此方法

public boolean fulfilled(JobInsertionContext insertionContext)
确保insertionContext.getJob()[要插入的作业]可以插入insertionContext.getRoute()。此时,您需要了解两件事:

  • insertionContext.getJob()的关联装运,即需要与insertionContext.getJob()位于同一路线的装运
  • 这些关联作业中是否有一个已分配给路由,如果是,此路由是否与insertionContext.getRoute()相同
对于后面的信息,您需要定义为您提供作业路线分配的状态。我将定义一个problemState及其相应的更新程序,如下所示:

static class UpdateJobRouteAssignment implements StateUpdater,JobInsertedListener,InsertionStartsListener {

        StateManager stateManager;

        UpdateJobRouteAssignment(StateManager stateManager) {
            this.stateManager = stateManager;
        }

        @Override
        public void informJobInserted(Job job2insert, VehicleRoute inRoute, double additionalCosts, double additionalTime) {
            stateManager.putProblemState(stateManager.createStateId(job2insert.getId()), VehicleRoute.class, inRoute);
        }

        @Override
        public void informInsertionStarts(Collection<VehicleRoute> vehicleRoutes, Collection<Job> unassignedJobs) {
            for(VehicleRoute r : vehicleRoutes){
                for(Job j : r.getTourActivities().getJobs()){
                    informJobInserted(j,r,0.,0.);
                }
            }
        }
    }
静态类UpdateJobRouteAssignment实现StateUpdater、JobInsertedListener、InsertionStartsListener{
StateManager StateManager;
UpdateJobRouteAssignment(StateManager StateManager){
this.stateManager=stateManager;
}
@凌驾
公共无效信息已插入(作业作业2插入、车辆路线插入、双倍额外成本、双倍额外时间){
stateManager.putProblemState(stateManager.createStateId(job2insert.getId()),VehiclerRoute.class,inRoute);
}
@凌驾
public void informInsertionStarts(收集车辆路线、收集未分配作业){
用于(车辆路线r:车辆路线){
对于(作业j:r.getTourActivities().getJobs()){
信息输入(j,r,0,0.);
}
}
}
}

将状态更新程序和约束添加到状态/约束管理器中,您就完成了。

您能更精确一点吗?你想做什么样的模特?您想确保A批和B批货物在同一路线上吗?是的,我的问题是确保多批A批、B批,。。。我们走同一条路线。非常感谢。路线骏马的优化:问题是对多个骏马进行建模,每个骏马由多个任务任务1、任务2..组成,这些任务必须在同一条路线上,就顺序而言,1、2..,我们谈论的是骏马工作。对于每个信使,第一个任务都有一个时间窗口。对于只有两个任务的courrier,我可以通过发货来建模,第一个任务是提货,第二个任务是发货,但是超过两个任务???有什么想法吗??谢谢。我相信你在这里会得到帮助:。只要再贴一次,你可能会发现已经解决了类似问题的用户。