    001package 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 Tomáš Müller<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
    029public 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}