org.cpsolver.ifs.heuristics

## Class GeneralVariableSelection<V extends Variable<V,T>,T extends Value<V,T>>

- java.lang.Object
- - org.cpsolver.ifs.heuristics.GeneralVariableSelection<V,T>

- Type Parameters:
    `V` - Variable
    `T` - Value
  All Implemented Interfaces:
    VariableSelection<V,T>

      public class GeneralVariableSelection<V extends Variable<V,T>,T extends Value<V,T>>
      extends Object
      implements VariableSelection<V,T>

  General implementation of variable selection criterion.
  In case that all variables are assigned, one of the variables is selected randomly. In case of MPP, the random selection is made among the variables which have not assigned initial values.
  When there are unassigned variables, a variable is selected randomly among all unassigned variables (when Variable.RandomSelection is true) or the following roulette wheel selection takes place (MPP):
  - one point for a variable with no initial assignment
  - 3 * ( 1 + number of conflicts with the initial assignment) for a variable with an initial assignment
  If `MacPropagation` is used and Variable.UnassignWhenNoGood parameter is true, while there is a variable with an empty domain:
  - with Variable.UnassignWhenNoGoodRandomWalk probabilty an arbitrary assigned variable is selected
  - otherwise, one variable with empty domain is picked, one of its original values is picked and one of the variables from the explanation of that value is then returned. If the explanation is empty, another variable and value is tried (up to ten times).
  Parameters:

  Parameter | Type | Comment
  --- | --- | ---
  Variable.RandomSelection | `Boolean` | if true, an unassigned variable is picked randomly
  Variable.UnassignWhenNoGood | `Boolean` | if true and if `MacPropagation` is used: if there is a variable with empty domain, assigned variable (which is present in some explanation for a vairable with empty domain) is selected (for reassignment)
  Variable.UnassignWhenNoGoodRandomWalk | `Double` | if Variable.UnassignWhenNoGood is true and if `MacPropagation` is used: if there is a variable with empty domain, with the given probability an arbitrary assigned variable is selected

  Version:
    IFS 1.3 (Iterative Forward Search)
    Copyright (C) 2006 - 2014 Tomáš Müller
    muller@unitime.org
    http://muller.unitime.org
    This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.
    This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
    You should have received a copy of the GNU Lesser General Public License along with this library; if not see http://www.gnu.org/licenses.
  See Also:
    `VariableSelection`, `Solver`

- - ### Constructor Summary

    Constructors
    Constructor and Description
    `GeneralVariableSelection()`
    `GeneralVariableSelection(DataProperties properties)` Constructor

  - ### Method Summary

    All Methods Instance Methods Concrete Methods
    Modifier and Type | Method and Description
    --- | ---
    `void` | `init(Solver<V,T> solver)` Initialization
    `V` | `selectVariable(Solution<V,T> solution)` Variable selection

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

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- - ### Constructor Detail

    - #### GeneralVariableSelection

          public GeneralVariableSelection(DataProperties properties)

      Constructor
      Parameters:
        `properties` - input configuration

    - #### GeneralVariableSelection

          public GeneralVariableSelection()

  - ### Method Detail

    - #### init

          public void init(Solver<V,T> solver)

      Initialization
      Specified by:
        `init` in interface `VariableSelection<V extends Variable<V,T>,T extends Value<V,T>>`
      Parameters:
        `solver` - current solver

    - #### selectVariable

          public V selectVariable(Solution<V,T> solution)

      Variable selection
      Specified by:
        `selectVariable` in interface `VariableSelection<V extends Variable<V,T>,T extends Value<V,T>>`
      Parameters:
        `solution` - current solution
      Returns:
        selected variable