Добавление новой переменной планирования к задаче выбора маршрута транспортного средства - PullRequest
1 голос
/ 06 августа 2020

Я пытаюсь добавить новую переменную в Задачу Маршрутизации транспортных средств, чтобы представить транспортное средство (автобус), которое забирает людей и пропускает их в места с соответствующими фактами (каждый из этих ресурсов должен обслуживать одного клиента). Я создал новый класс под названием 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).

Я действительно застрял на этом, поскольку я не могу включить новую переменную планирования. Я перепробовал много других конфигураций кода, хотя думаю, что это более понятно. Любая помощь будет очень признательна.

1 Ответ

1 голос
/ 25 августа 2020

Я не уверен, что это действительно сработает, но когда вы сделаете что-то подобное, вы не получите ошибку.

<valueSelector variableName="variableName">

Мне нужен только nearSelection для связанной переменной.

Если вам нужен ближайший выбор для обеих переменных, вы можете попробовать иметь два <changeMoveSelector> с каждой соседней конфигурацией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...