@Override
 public MoveSelector buildBaseMoveSelector(
     HeuristicConfigPolicy configPolicy,
     SelectionCacheType minimumCacheType,
     boolean randomSelection) {
   EntitySelectorConfig entitySelectorConfig_ =
       entitySelectorConfig == null ? new EntitySelectorConfig() : entitySelectorConfig;
   EntitySelector entitySelector =
       entitySelectorConfig_.buildEntitySelector(
           configPolicy,
           minimumCacheType,
           SelectionOrder.fromRandomSelectionBoolean(randomSelection));
   ValueSelectorConfig valueSelectorConfig_ =
       valueSelectorConfig == null ? new ValueSelectorConfig() : valueSelectorConfig;
   ValueSelector[] valueSelectors = new ValueSelector[K - 1];
   for (int i = 0; i < valueSelectors.length; i++) {
     valueSelectors[i] =
         valueSelectorConfig_.buildValueSelector(
             configPolicy,
             entitySelector.getEntityDescriptor(),
             minimumCacheType,
             SelectionOrder.fromRandomSelectionBoolean(randomSelection));
   }
   return new KOptMoveSelector(entitySelector, valueSelectors, randomSelection);
 }
 /**
  * @param configPolicy never null
  * @param minimumCacheType never null, If caching is used (different from {@link
  *     SelectionCacheType#JUST_IN_TIME}), then it should be at least this {@link
  *     SelectionCacheType} because an ancestor already uses such caching and less would be
  *     pointless.
  * @param inheritedSelectionOrder never null
  * @return never null
  */
 public PillarSelector buildPillarSelector(
     HeuristicConfigPolicy configPolicy,
     SelectionCacheType minimumCacheType,
     SelectionOrder inheritedSelectionOrder) {
   if (minimumCacheType.compareTo(SelectionCacheType.STEP) > 0) {
     throw new IllegalArgumentException(
         "The pillarSelectorConfig ("
             + this
             + ")'s minimumCacheType ("
             + minimumCacheType
             + ") must not be higher than "
             + SelectionCacheType.STEP
             + " because the pillars change every step.");
   }
   // EntitySelector uses SelectionOrder.ORIGINAL because a SameValuePillarSelector STEP caches the
   // values
   EntitySelectorConfig entitySelectorConfig_ =
       entitySelectorConfig == null ? new EntitySelectorConfig() : entitySelectorConfig;
   EntitySelector entitySelector =
       entitySelectorConfig_.buildEntitySelector(
           configPolicy, minimumCacheType, SelectionOrder.ORIGINAL);
   Collection<GenuineVariableDescriptor> variableDescriptors =
       entitySelector.getEntityDescriptor().getVariableDescriptors();
   return new SameValuePillarSelector(
       entitySelector, variableDescriptors, inheritedSelectionOrder.toRandomSelectionBoolean());
 }
 public void inherit(PillarSelectorConfig inheritedConfig) {
   super.inherit(inheritedConfig);
   if (entitySelectorConfig == null) {
     entitySelectorConfig = inheritedConfig.getEntitySelectorConfig();
   } else if (inheritedConfig.getEntitySelectorConfig() != null) {
     entitySelectorConfig.inherit(inheritedConfig.getEntitySelectorConfig());
   }
   //        variableNameList = ConfigUtils.inheritMergeableListProperty(variableNameList,
   //                inheritedConfig.getVariableNameList());
 }