0

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

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

谢谢!

4

1 回答 1

1

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

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)

确保 insertContext.getJob() [这是要插入的作业] 可以插入到 insertContext.getRoute() 中。这个时候你需要知道两件事:

  • insertContext.getJob()的关联货件,即需要与insertionContext.getJob()在同一路线的货件
  • 这些关联作业之一是否已分配给路由,如果是,则此路由是否与 insertContext.getRoute() 相同

对于后面的信息,您需要定义为您提供工作路线分配的状态。我会像这样定义一个问题状态及其相应的更新程序:

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.);
                }
            }
        }
    }

将您的状态更新程序和您的约束添加到您的 State/ConstraintManager 中,您就完成了。

于 2014-09-05T09:54:31.427 回答