此问题与此主题相关: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,
});
答案 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实例,并且仍然可以存储无限数量的作业之间的关系。