code: @Override
      public MoveSelector buildBaseMoveSelector(HeuristicConfigPolicy configPolicy,
              SelectionCacheType minimumCacheType, boolean randomSelection) {
          EntityDescriptor entityDescriptor = deduceEntityDescriptor(
                  configPolicy.getSolutionDescriptor(), entityClass);
          SubChainSelectorConfig subChainSelectorConfig_ = subChainSelectorConfig == null ? new SubChainSelectorConfig()
                  : subChainSelectorConfig;
          SubChainSelector subChainSelector = subChainSelectorConfig_.buildSubChainSelector(configPolicy,
                  entityDescriptor,
                  minimumCacheType, SelectionOrder.fromRandomSelectionBoolean(randomSelection));
          ValueSelectorConfig valueSelectorConfig_ = valueSelectorConfig == null ? new ValueSelectorConfig()
                  : valueSelectorConfig;
          ValueSelector valueSelector = valueSelectorConfig_.buildValueSelector(configPolicy,
                  entityDescriptor,
                  minimumCacheType, SelectionOrder.fromRandomSelectionBoolean(randomSelection));
          if (!(valueSelector instanceof EntityIndependentValueSelector)) {
              throw new IllegalArgumentException("The moveSelectorConfig (" + this
                      + ") needs to be based on an EntityIndependentValueSelector (" + valueSelector + ")."
                      + " Check your @" + ValueRangeProvider.class.getSimpleName() + " annotations.");
          }
          return new SubChainChangeMoveSelector(subChainSelector, (EntityIndependentValueSelector) valueSelector,
                  randomSelection, defaultIfNull(selectReversingMoveToo, true));
      }
docs: ************************************************************************