001 package net.sf.cpsolver.ifs.model; 002 003 /** 004 * A neighbour consisting of a change (either assignment or unassignment) of a single variable. 005 * 006 * @see net.sf.cpsolver.ifs.heuristics.NeighbourSelection 007 * 008 * @version 009 * IFS 1.1 (Iterative Forward Search)<br> 010 * Copyright (C) 2006 Tomáš Müller<br> 011 * <a href="mailto:muller@unitime.org">muller@unitime.org</a><br> 012 * Lazenska 391, 76314 Zlin, Czech Republic<br> 013 * <br> 014 * This library is free software; you can redistribute it and/or 015 * modify it under the terms of the GNU Lesser General Public 016 * License as published by the Free Software Foundation; either 017 * version 2.1 of the License, or (at your option) any later version. 018 * <br><br> 019 * This library is distributed in the hope that it will be useful, 020 * but 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. 023 * <br><br> 024 * You should have received a copy of the GNU Lesser General Public 025 * License along with this library; if not, write to the Free Software 026 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 027 */ 028 029 public class SimpleNeighbour extends Neighbour { 030 private Variable iVariable = null; 031 private Value iValue = null; 032 033 /** Model 034 * @param variable variable to be assigned 035 * @param value value to be assigned to the given variable, null if the variable should be unassigned 036 */ 037 public SimpleNeighbour(Variable variable, Value value) { 038 iVariable = variable; 039 iValue = value; 040 } 041 042 /** Selected variable */ 043 public Variable getVariable() { 044 return iVariable; 045 } 046 047 /** Selected value */ 048 public Value getValue() { 049 return iValue; 050 } 051 052 /** Perform assignment */ 053 public void assign(long iteration) { 054 if (iVariable==null) return; 055 if (iValue!=null) 056 iVariable.assign(iteration, iValue); 057 else 058 iVariable.unassign(iteration); 059 } 060 061 /** Improvement in the solution value if this neighbour is accepted. */ 062 public double value() { 063 return 064 (iValue==null?0:iValue.toDouble()) - 065 (iVariable==null || iVariable.getAssignment()==null?0:iVariable.getAssignment().toDouble()); 066 } 067 068 069 public String toString() { 070 return iVariable.getName()+" "+(iVariable.getAssignment()==null?"null":iVariable.getAssignment().getName())+" -> "+(iValue==null?"null":iValue.getName()); 071 } 072 }