首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与jsprit VRP相关的工作

与jsprit VRP相关的工作
EN

Stack Overflow用户
提问于 2014-09-04 20:55:32
回答 1查看 867关注 0票数 0

是否可以通过严格的违禁品,在同一条航线上装运两批或多批货物?

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

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-05 09:54:31

确保货件在同一条路线上的最简单的方法是用一种技能标记这些货物。

代码语言:javascript
复制
shipmentBuilder.addRequiredSkill("tag")

但是,您还需要为特定的车辆贴上标签:

代码语言:javascript
复制
vehicleBuilder.addSkill("tag")

并确保算法考虑技能/这些标记(参见NEW.md -您需要使用1.3.2-快照)。

如果不希望为特定车辆分配标记,则需要实现一个core.problem.constraint.HardRouteStateLevelConstraint,这基本上是一种方法。

代码语言:javascript
复制
public boolean fulfilled(JobInsertionContext insertionContext)

确保要插入的作业insertionContext.getJob()可以插入到insertionContext.getRoute()中。此时,您需要知道两件事:

  • 与insertionContext.getJob()相关的货运,即需要与insertionContext.getJob()处于同一路线的货运
  • 这些关联作业中是否有一个已分配给路由,如果已分配,则此路由是否与insertionContext.getRoute()相同

对于后一种信息,您需要定义为您提供作业路线分配的状态。我将定义一个problemState及其相应的更新器如下:

代码语言:javascript
复制
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.);
                }
            }
        }
    }

将状态更新器和约束添加到州/ConstraintManager,您就完成了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25674850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档