JSprit中的相关工作,一个又一个案例:IllegalArgumentException

时间:2016-03-29 08:57:59

标签: java routing illegalargumentexception jsprit

此问题与此主题相关:Related jobs in JSprit

我正在尝试使用“一个接一个”的约束,但我遇到了 java.lang.IllegalArgumentException:arg不能为null 。在计算Capacity max时,看起来容量cap2为null。我真的不明白为什么。

:(

你对此有所了解吗?

为了记录,我在 1.6.2版本。 TY为您提供帮助。

var view_map = new ol.View({
    center: center,
    //projection: projection,
    zoom: 2,
    minZoom: 2,
    });

var view_sat = new ol.View({
    center: [0, 0],
    projection : projection,
    zoom: 3,
    minZoom: 2,
    maxZoom: 5
    });

var map = new ol.Map({
      target: 'map',
      layers: [layer_map],
      view: view_map,
      });

1 个答案:

答案 0 :(得分:0)

简短回答:您无法动态创建StateId实例。在运行算法之前,必须生成所有StateId实例。请参阅更长的答案,了解为什么这样做仍然不是一个好主意,您应该考虑重新设计。

分析:我遇到了同样的问题,并将其追溯到StateManager中创建StateId实例的方式:

public StateId createStateId(String name) {
    if (createdStateIds.containsKey(name)) return createdStateIds.get(name);
    if (stateIndexCounter >= activityStates[0].length) {
        activityStates = new Object[vrp.getNuActivities() + 1][stateIndexCounter + 1];
        vehicleDependentActivityStates = new Object[nuActivities][nuVehicleTypeKeys][stateIndexCounter + 1];
        routeStatesArr = new Object[vrp.getNuActivities()+1][stateIndexCounter+1];
        vehicleDependentRouteStatesArr = new Object[nuActivities][nuVehicleTypeKeys][stateIndexCounter+1];
        problemStates = new Object[stateIndexCounter+1];
    }
    StateId id = StateFactory.createId(name, stateIndexCounter);
    incStateIndexCounter();
    createdStateIds.put(name, id);
    return id;
}

每次创建一个新的StateId并且没有更多可用于状态的空间时,旧的状态数组会被更长的版本覆盖,以便为新状态腾出空间(开始时有30个StateIds的空间,一些已经使用过由JSprit本人)。正如你所看到的,旧的元素没有被复制,所以这里发生的是UpdateLoads之间的竞争条件,它设置用作cap2的状态,你的代码,它生成一个新的StateId并覆盖当前状态和UpdateMaxCapacityUtilisationAtActivitiesByLookingForwardInRoute它读取状态(不再存在)。

鉴于此代码仅将数组扩展为1,因此非常低效具有许多StateId,因为每个新的StateId都必须重新创建所有数组。为了缓解这种情况,我在代码中只使用了一个StateId,并在其中存储了Map<String, VehicleRoute>

Map<String, VehicleRoute> routeMapping = Optional.ofNullable(stateManager.getProblemState(stateId, Map.class)).orElse(new ConcurrentHashMap<>())

通过这种方式,您不会耗尽StateId实例,并且仍然可以存储无限数量的作业之间的关系。