jsprit VRP相关工作硬Containt



是否可以通过硬Containt在同一路线上进行两次或多次装运。

如果没有,你知道其他可以处理这种限制的java库吗?

谢谢!

确保货物在同一路线上的最简单方法是用熟练的标记这些货物

shipmentBuilder.addRequiredSkill("tag")

但你也需要标记一辆特定的汽车:

vehicleBuilder.addSkill("tag")

并确保您让算法考虑技能/这些标签(请参阅https://github.com/jsprit/jsprit/blob/master/WHATS_NEW.md-您需要使用1.3.2-SNAPSHOT)。

如果你不想给特定的车辆分配标签,你需要实现一个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.);
                }
            }
        }
    }

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

相关内容

  • 没有找到相关文章

最新更新