001    package net.sf.cpsolver.ifs.model;
002    
003    /**
004     * A neighbour consisting of a change (either assignment or unassignment) of a
005     * single variable.
006     * 
007     * @see net.sf.cpsolver.ifs.heuristics.NeighbourSelection
008     * 
009     * @version IFS 1.2 (Iterative Forward Search)<br>
010     *          Copyright (C) 2006 - 2010 Tomas Muller<br>
011     *          <a href="mailto:muller@unitime.org">muller@unitime.org</a><br>
012     *          <a href="http://muller.unitime.org">http://muller.unitime.org</a><br>
013     * <br>
014     *          This library is free software; you can redistribute it and/or modify
015     *          it under the terms of the GNU Lesser General Public License as
016     *          published by the Free Software Foundation; either version 3 of the
017     *          License, or (at your option) any later version. <br>
018     * <br>
019     *          This library is distributed in the hope that it will be useful, but
020     *          WITHOUT ANY WARRANTY; without even the implied warranty of
021     *          MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
022     *          Lesser General Public License for more details. <br>
023     * <br>
024     *          You should have received a copy of the GNU Lesser General Public
025     *          License along with this library; if not see
026     *          <a href='http://www.gnu.org/licenses/'>http://www.gnu.org/licenses/</a>.
027     */
028    
029    public class SimpleNeighbour<V extends Variable<V, T>, T extends Value<V, T>> extends Neighbour<V, T> {
030        private V iVariable = null;
031        private T iValue = null;
032    
033        /**
034         * Model
035         * 
036         * @param variable
037         *            variable to be assigned
038         * @param value
039         *            value to be assigned to the given variable, null if the
040         *            variable should be unassigned
041         */
042        public SimpleNeighbour(V variable, T value) {
043            iVariable = variable;
044            iValue = value;
045        }
046    
047        /** Selected variable */
048        public V getVariable() {
049            return iVariable;
050        }
051    
052        /** Selected value */
053        public T getValue() {
054            return iValue;
055        }
056    
057        /** Perform assignment */
058        @Override
059        public void assign(long iteration) {
060            if (iVariable == null)
061                return;
062            if (iValue != null)
063                iVariable.assign(iteration, iValue);
064            else
065                iVariable.unassign(iteration);
066        }
067    
068        /** Improvement in the solution value if this neighbour is accepted. */
069        @Override
070        public double value() {
071            return (iValue == null ? 0 : iValue.toDouble())
072                    - (iVariable == null || iVariable.getAssignment() == null ? 0 : iVariable.getAssignment().toDouble());
073        }
074    
075        @Override
076        public String toString() {
077            return iVariable.getName() + " "
078                    + (iVariable.getAssignment() == null ? "null" : iVariable.getAssignment().getName()) + " -> "
079                    + (iValue == null ? "null" : iValue.getName());
080        }
081    }