Package org.optaplanner.core.impl.heuristic.selector.move.generic.chained

## Class TailChainSwapMove<Solution_>

- java.lang.Object
- - org.optaplanner.core.impl.heuristic.move.AbstractMove<Solution_>
  - - org.optaplanner.core.impl.heuristic.selector.move.generic.chained.TailChainSwapMove<Solution_>

- Type Parameters:
    `Solution_` - the solution type, the class with the `PlanningSolution` annotation
  All Implemented Interfaces:
    `Move<Solution_>`

      public class TailChainSwapMove<Solution_>
      extends AbstractMove<Solution_>

  Also known as a 2-opt move.

- - ### Field Summary

    Fields
    Modifier and Type | Field | Description
    --- | --- | ---
    `protected Object` | `entityAfterAnchor` |
    `protected Object` | `lastEntityInChain` |
    `protected Object` | `leftAnchor` |
    `protected Object` | `leftEntity` |
    `protected Object` | `leftNextEntity` |
    `protected Object` | `leftValue` |
    `protected boolean` | `reverseAnchorSide` |
    `protected Object` | `rightAnchor` |
    `protected Object` | `rightEntity` |
    `protected Object` | `rightNextEntity` |
    `protected Object` | `rightValue` |
    `protected boolean` | `sameAnchor` |
    `protected GenuineVariableDescriptor<Solution_>` | `variableDescriptor` |

  - ### Constructor Summary

    Constructors
    Modifier | Constructor | Description
    --- | --- | ---
    `protected` | `TailChainSwapMove​(GenuineVariableDescriptor<Solution_> variableDescriptor, Object leftEntity, Object leftValue, Object leftAnchor, Object rightEntity, Object rightValue, Object rightAnchor)` |
    `protected` | `TailChainSwapMove​(GenuineVariableDescriptor<Solution_> variableDescriptor, Object leftEntity, Object leftValue, Object leftAnchor, Object rightEntity, Object rightValue, Object rightAnchor, Object leftNextEntity, Object rightNextEntity)` |
    `protected` | `TailChainSwapMove​(GenuineVariableDescriptor<Solution_> variableDescriptor, Object leftEntity, Object leftValue, Object leftAnchor, Object rightEntity, Object rightValue, Object rightAnchor, Object leftNextEntity, Object rightNextEntity, Object lastEntityInChain, Object entityAfterAnchor)` |
    `` | `TailChainSwapMove​(GenuineVariableDescriptor<Solution_> variableDescriptor, SingletonInverseVariableSupply inverseVariableSupply, AnchorVariableSupply anchorVariableSupply, Object leftEntity, Object rightValue)` |

  - ### Method Summary

    All Methods Instance Methods Concrete Methods
    Modifier and Type | Method | Description
    --- | --- | ---
    `TailChainSwapMove<Solution_>` | `createUndoMove​(ScoreDirector<Solution_> scoreDirector)` | Called before the move is done, so the move can be evaluated and then be undone without resulting into a permanent change in the solution.
    `protected void` | `doMoveOnGenuineVariables​(ScoreDirector<Solution_> scoreDirector)` | Like `AbstractMove.doMove(ScoreDirector)` but without the `ScoreDirector.triggerVariableListeners()` call (because `AbstractMove.doMove(ScoreDirector)` already does that).
    `boolean` | `equals​(Object o)` |
    `Object` | `getLeftEntity()` |
    `Collection<? extends Object>` | `getPlanningEntities()` | Returns all planning entities that are being changed by this move.
    `Collection<? extends Object>` | `getPlanningValues()` | Returns all planning values that entities are being assigned to by this move.
    `Object` | `getRightValue()` |
    `String` | `getSimpleMoveTypeDescription()` | Describes the move type for statistical purposes.
    `String` | `getVariableName()` |
    `int` | `hashCode()` |
    `boolean` | `isMoveDoable​(ScoreDirector<Solution_> scoreDirector)` | Called before a move is evaluated to decide whether the move can be done and evaluated.
    `TailChainSwapMove<Solution_>` | `rebase​(ScoreDirector<Solution_> destinationScoreDirector)` | Rebases a move from an origin `ScoreDirector` to another destination `ScoreDirector` which is usually on another `Thread` or JVM.
    `protected void` | `reverseChain​(InnerScoreDirector scoreDirector, Object fromValue, Object fromEntity, Object toEntity)` |
    `String` | `toString()` |

    - ### Methods inherited from class org.optaplanner.core.impl.heuristic.move.AbstractMove

      `doMove, rebaseArray, rebaseList`

    - ### Methods inherited from class java.lang.Object

      `clone, finalize, getClass, notify, notifyAll, wait, wait, wait`

- - ### Field Detail

    - #### variableDescriptor

          protected final GenuineVariableDescriptor<Solution_> variableDescriptor

    - #### leftEntity

          protected final Object leftEntity

    - #### leftValue

          protected final Object leftValue

    - #### leftAnchor

          protected final Object leftAnchor

    - #### rightEntity

          protected final Object rightEntity

    - #### rightValue

          protected final Object rightValue

    - #### rightAnchor

          protected final Object rightAnchor

    - #### sameAnchor

          protected final boolean sameAnchor

    - #### leftNextEntity

          protected final Object leftNextEntity

    - #### rightNextEntity

          protected final Object rightNextEntity

    - #### reverseAnchorSide

          protected final boolean reverseAnchorSide

    - #### lastEntityInChain

          protected final Object lastEntityInChain

    - #### entityAfterAnchor

          protected final Object entityAfterAnchor

  - ### Constructor Detail

    - #### TailChainSwapMove

          public TailChainSwapMove​(GenuineVariableDescriptor<Solution_> variableDescriptor,
                                   SingletonInverseVariableSupply inverseVariableSupply,
                                   AnchorVariableSupply anchorVariableSupply,
                                   Object leftEntity,
                                   Object rightValue)

    - #### TailChainSwapMove

          protected TailChainSwapMove​(GenuineVariableDescriptor<Solution_> variableDescriptor,
                                      Object leftEntity,
                                      Object leftValue,
                                      Object leftAnchor,
                                      Object rightEntity,
                                      Object rightValue,
                                      Object rightAnchor)

    - #### TailChainSwapMove

          protected TailChainSwapMove​(GenuineVariableDescriptor<Solution_> variableDescriptor,
                                      Object leftEntity,
                                      Object leftValue,
                                      Object leftAnchor,
                                      Object rightEntity,
                                      Object rightValue,
                                      Object rightAnchor,
                                      Object leftNextEntity,
                                      Object rightNextEntity)

    - #### TailChainSwapMove

          protected TailChainSwapMove​(GenuineVariableDescriptor<Solution_> variableDescriptor,
                                      Object leftEntity,
                                      Object leftValue,
                                      Object leftAnchor,
                                      Object rightEntity,
                                      Object rightValue,
                                      Object rightAnchor,
                                      Object leftNextEntity,
                                      Object rightNextEntity,
                                      Object lastEntityInChain,
                                      Object entityAfterAnchor)

  - ### Method Detail

    - #### getVariableName

          public String getVariableName()

    - #### getLeftEntity

          public Object getLeftEntity()

    - #### getRightValue

          public Object getRightValue()

    - #### isMoveDoable

          public boolean isMoveDoable​(ScoreDirector<Solution_> scoreDirector)

      Description copied from interface: `Move`
      Called before a move is evaluated to decide whether the move can be done and evaluated. A Move is not doable if:
      - Either doing it would change nothing in the `PlanningSolution`.
      - Either it's simply not possible to do (for example due to built-in hard constraints).

      It is recommended to keep this method implementation simple: do not use it in an attempt to satisfy normal hard and soft constraints.

      Although you could also filter out non-doable moves in for example the `MoveSelector` or `MoveListFactory`, this is not needed as the `Solver` will do it for you.

      Parameters:
        `scoreDirector` - the `ScoreDirector` not yet modified by the move.
      Returns:
        true if the move achieves a change in the solution and the move is possible to do on the solution.

    - #### createUndoMove

          public TailChainSwapMove<Solution_> createUndoMove​(ScoreDirector<Solution_> scoreDirector)

      Description copied from class: `AbstractMove`
      Called before the move is done, so the move can be evaluated and then be undone without resulting into a permanent change in the solution.
      Specified by:
        `createUndoMove` in class `AbstractMove<Solution_>`
      Parameters:
        `scoreDirector` - the `ScoreDirector` not yet modified by the move.
      Returns:
        an undoMove which does the exact opposite of this move.

    - #### doMoveOnGenuineVariables

          protected void doMoveOnGenuineVariables​(ScoreDirector<Solution_> scoreDirector)

      Description copied from class: `AbstractMove`
      Like `AbstractMove.doMove(ScoreDirector)` but without the `ScoreDirector.triggerVariableListeners()` call (because `AbstractMove.doMove(ScoreDirector)` already does that).
      Specified by:
        `doMoveOnGenuineVariables` in class `AbstractMove<Solution_>`
      Parameters:
        `scoreDirector` - never null

    - #### reverseChain

          protected void reverseChain​(InnerScoreDirector scoreDirector,
                                      Object fromValue,
                                      Object fromEntity,
                                      Object toEntity)

    - #### rebase

          public TailChainSwapMove<Solution_> rebase​(ScoreDirector<Solution_> destinationScoreDirector)

      Description copied from interface: `Move`
      Rebases a move from an origin `ScoreDirector` to another destination `ScoreDirector` which is usually on another `Thread` or JVM. The new move returned by this method translates the entities and problem facts to the destination `PlanningSolution` of the destination `ScoreDirector`, That destination `PlanningSolution` is a deep planning clone (or an even deeper clone) of the origin `PlanningSolution` that this move has been generated from.

      That new move does the exact same change as this move, resulting in the same `PlanningSolution` state, presuming that destination `PlanningSolution` was in the same state as the original `PlanningSolution` to begin with.

      Generally speaking, an implementation of this method iterates through every entity and fact instance in this move, translates each one to the destination `ScoreDirector` with `ScoreDirector.lookUpWorkingObject(Object)` and creates a new move instance of the same move type, using those translated instances.

      The destination `PlanningSolution` can be in a different state than the original `PlanningSolution`. So, rebasing can only depend on the identity of `planning entities` and planning facts, which is usually declared by a `PlanningId` on those classes. It must not depend on the state of the `planning variables`. One thread might rebase a move before, amid or after another thread does that same move instance.

      This method is thread-safe.

      Parameters:
        `destinationScoreDirector` - never null, the `ScoreDirector.getWorkingSolution()` that the new move should change the planning entity instances of.
      Returns:
        never null, a new move that does the same change as this move on another solution instance

    - #### getSimpleMoveTypeDescription

          public String getSimpleMoveTypeDescription()

      Description copied from interface: `Move`
      Describes the move type for statistical purposes. For example "ChangeMove(Process.computer)".

      The format is not formalized. Never parse the `String` returned by this method.

      Returns:
        never null

    - #### getPlanningEntities

          public Collection<? extends Object> getPlanningEntities()

      Description copied from interface: `Move`
      Returns all planning entities that are being changed by this move. Required for `AcceptorType.ENTITY_TABU`.

      This method is only called after `Move.doMove(ScoreDirector)` (which might affect the return values).

      Duplicate entries in the returned `Collection` are best avoided. The returned `Collection` is recommended to be in a stable order. For example: use `List` or `LinkedHashSet`, but not `HashSet`.

      Returns:
        never null

    - #### getPlanningValues

          public Collection<? extends Object> getPlanningValues()

      Description copied from interface: `Move`
      Returns all planning values that entities are being assigned to by this move. Required for `AcceptorType.VALUE_TABU`.

      This method is only called after `Move.doMove(ScoreDirector)` (which might affect the return values).

      Duplicate entries in the returned `Collection` are best avoided. The returned `Collection` is recommended to be in a stable order. For example: use `List` or `LinkedHashSet`, but not `HashSet`.

      Returns:
        never null

    - #### equals

          public boolean equals​(Object o)

      Overrides:
        `equals` in class `Object`

    - #### hashCode

          public int hashCode()

      Overrides:
        `hashCode` in class `Object`

    - #### toString

          public String toString()

      Overrides:
        `toString` in class `Object`