Я пытаюсь добавить новую переменную в Задачу Маршрутизации транспортных средств, чтобы представить транспортное средство (автобус), которое забирает людей и пропускает их в места с соответствующими фактами (каждый из этих ресурсов должен обслуживать одного клиента). Я создал новый класс под названием Resource и объявил новую переменную ресурса внутри класса Customer, поэтому, когда будет сделан новый шаг, я хочу, чтобы решатель выбрал нового клиента для транспортного средства (маршрута) и ресурса из списка (который со временем тоже будет в автомобиле). В Заказчике. java:
@PlanningVariable(valueRangeProviderRefs = {"resourceRange"})
public Resource getResource() {
return resource;
}
public void setResource(Resource resource) {
this.resource = resource;
}
И в VehicleRoutingSolution. java:
protected List<Resource> resourceList;
[...]
@ProblemFactCollectionProperty
@ValueRangeProvider(id = "resourceRange")
public List<Resource> getResourceList() {
return resourceList;
}
public void setResourceList(List<Resource> resourceList) {
this.resourceList = resourceList;
}
Наконец Я внес некоторые изменения в vehicleRoutingSolverConfig. xml:
<?xml version="1.0" encoding="UTF-8"?>
<solver>
<!--<environmentMode>FAST_ASSERT</environmentMode>-->
<solutionClass>com.ezentis.mplanner.vehiclerouting.domain.VehicleRoutingSolution</solutionClass>
<entityClass>com.ezentis.mplanner.vehiclerouting.domain.Standstill</entityClass>
<entityClass>com.ezentis.mplanner.vehiclerouting.domain.Customer</entityClass>
<entityClass>com.ezentis.mplanner.vehiclerouting.domain.timewindowed.TimeWindowedCustomer</entityClass>
<scoreDirectorFactory>
<!--<easyScoreCalculatorClass>com.ezentis.mplanner.vehiclerouting.solver.score.VehicleRoutingEasyScoreCalculator</easyScoreCalculatorClass>-->
<incrementalScoreCalculatorClass>com.ezentis.mplanner.vehiclerouting.solver.score.VehicleRoutingIncrementalScoreCalculator</incrementalScoreCalculatorClass>
<!-- scoreDrl>com/ezentis/mplanner/vehiclerouting/solver/vehicleRoutingScoreRules.drl</scoreDrl-->
<!--<assertionScoreDirectorFactory>-->
<!--<easyScoreCalculatorClass>com.ezentis.mplanner.vehiclerouting.solver.score.VehicleRoutingEasyScoreCalculator</easyScoreCalculatorClass>-->
<!--</assertionScoreDirectorFactory>-->
<initializingScoreTrend>ONLY_DOWN</initializingScoreTrend>
</scoreDirectorFactory>
<termination>
<minutesSpentLimit>5</minutesSpentLimit>
</termination>
<constructionHeuristic>
<constructionHeuristicType>FIRST_FIT</constructionHeuristicType>
<!-- <queuedEntityPlacer>
<entitySelector id="placerEntitySelector">
<entityClass>com.ezentis.mplanner.vehiclerouting.domain.Customer</entityClass>
<cacheType>PHASE</cacheType>
<selectionOrder>SORTED</selectionOrder>
<sorterManner>DECREASING_DIFFICULTY</sorterManner>
</entitySelector>
<cartesianProductMoveSelector>
<changeMoveSelector>
<entitySelector mimicSelectorRef="placerEntitySelector"/>
<valueSelector variableName="vehicleRange">
<downcastEntityClass>com.ezentis.mplanner.vehiclerouting.domain.Vehicle</downcastEntityClass>
<cacheType>PHASE</cacheType> -->
<!--<selectionOrder>SORTED</selectionOrder>-->
<!--<sorterManner>INCREASING_STRENGTH</sorterManner>-->
<!-- </valueSelector>
</changeMoveSelector>
<changeMoveSelector>
<entitySelector mimicSelectorRef="placerEntitySelector"/>
<valueSelector variableName="resourceRange">
<cacheType>PHASE</cacheType>
<selectionOrder>SORTED</selectionOrder>
<sorterManner>INCREASING_STRENGTH</sorterManner>
</valueSelector>
</changeMoveSelector>
</cartesianProductMoveSelector>
</queuedEntityPlacer> -->
</constructionHeuristic>
<localSearch>
<unionMoveSelector>
<changeMoveSelector>
<entitySelector id="entitySelector1"/>
<valueSelector>
<nearbySelection>
<originEntitySelector mimicSelectorRef="entitySelector1"/>
<nearbyDistanceMeterClass>com.ezentis.mplanner.vehiclerouting.domain.solver.nearby.CustomerNearbyDistanceMeter</nearbyDistanceMeterClass>
<parabolicDistributionSizeMaximum>40</parabolicDistributionSizeMaximum>
</nearbySelection>
</valueSelector>
</changeMoveSelector>
<swapMoveSelector>
<entitySelector id="entitySelector2"/>
<secondaryEntitySelector>
<nearbySelection>
<originEntitySelector mimicSelectorRef="entitySelector2"/>
<nearbyDistanceMeterClass>com.ezentis.mplanner.vehiclerouting.domain.solver.nearby.CustomerNearbyDistanceMeter</nearbyDistanceMeterClass>
<parabolicDistributionSizeMaximum>40</parabolicDistributionSizeMaximum>
</nearbySelection>
</secondaryEntitySelector>
</swapMoveSelector>
<tailChainSwapMoveSelector>
<entitySelector id="entitySelector3"/>
<valueSelector>
<nearbySelection>
<originEntitySelector mimicSelectorRef="entitySelector3"/>
<nearbyDistanceMeterClass>com.ezentis.mplanner.vehiclerouting.domain.solver.nearby.CustomerNearbyDistanceMeter</nearbyDistanceMeterClass>
<parabolicDistributionSizeMaximum>40</parabolicDistributionSizeMaximum>
</nearbySelection>
</valueSelector>
</tailChainSwapMoveSelector>
</unionMoveSelector>
<acceptor>
<lateAcceptanceSize>200</lateAcceptanceSize>
</acceptor>
<forager>
<acceptedCountLimit>1</acceptedCountLimit>
</forager>
</localSearch>
</solver>
Но когда я загружаю проблему и запускаю решатель, я получаю эту ошибку:
java.lang.IllegalStateException: Multiple EntityMimicRecorders (usually EntitySelectors) have the same id (entitySelector1).
Я действительно застрял на этом, поскольку я не могу включить новую переменную планирования. Я перепробовал много других конфигураций кода, хотя думаю, что это более понятно. Любая помощь будет очень признательна.