// ArrayInt.java
//
// Author:
// Antonio J. Nebro <antonio@lcc.uma.es>
// Juan J. Durillo <durillo@lcc.uma.es>
//
// Copyright (c) 2011 Antonio J. Nebro, Juan J. Durillo
//
// This program 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 program 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 program. If not, see <http://www.gnu.org/licenses/>.
package jmetal.encodings.variable;
import jmetal.core.Problem;
import jmetal.core.Variable;
import jmetal.util.Configuration;
import jmetal.util.JMException;
import jmetal.util.PseudoRandom;
/**
* Class implementing a decision encodings.variable representing an array of integers.
* The integer values of the array have their own bounds.
*/
public class ArrayInt extends Variable {
/**
* Problem using the type
*/
private Problem problem_ ;
/**
* Stores an array of integer values
*/
public int [] array_;
/**
* Stores the length of the array
*/
private int size_;
/**
* Store the lower and upper bounds of each int value of the array in case of
* having each one different limits
*/
private int []lowerBounds_ ;
private int []upperBounds_ ;
/**
* Constructor
*/
public ArrayInt() {
lowerBounds_ = null ;
upperBounds_ = null ;
size_ = 0;
array_ = null;
problem_ = null ;
} // Constructor
/**
* Constructor
* @param size Size of the array
*/
public ArrayInt(int size) {
size_ = size;
array_ = new int[size_];
lowerBounds_ = new int[size_] ;
upperBounds_ = new int[size_] ;
} // Constructor
/**
* Constructor
* @param size Size of the array
*/
public ArrayInt(int size, Problem problem) {
problem_ = problem ;
size_ = size;
array_ = new int[size_];
lowerBounds_ = new int[size_] ;
upperBounds_ = new int[size_] ;
for (int i = 0; i < size_ ; i++) {
lowerBounds_[i] = (int)problem_.getLowerLimit(i);
upperBounds_[i] = (int)problem_.getUpperLimit(i);
array_[i] = PseudoRandom.randInt(lowerBounds_[i], upperBounds_[i]);
}
} // Constructor
/**
* Constructor
* @param size The size of the array
* @param lowerBounds Lower bounds
* @param upperBounds Upper bounds
*/
public ArrayInt(int size, double[] lowerBounds, double [] upperBounds) {
size_ = size;
array_ = new int[size_];
lowerBounds_ = new int[size_] ;
upperBounds_ = new int[size_] ;
for (int i = 0; i < size_ ; i++) {
lowerBounds_[i] = (int)lowerBounds[i] ;
upperBounds_[i] = (int)upperBounds[i] ;
array_[i] = PseudoRandom.randInt(lowerBounds_[i], upperBounds_[i]) ;
} // for
} // Constructor
/**
* Copy Constructor
* @param arrayInt The arrayInt to copy
*/
private ArrayInt(ArrayInt arrayInt) {
size_ = arrayInt.size_;
array_ = new int[size_];
lowerBounds_ = new int[size_] ;
upperBounds_ = new int[size_] ;
for (int i = 0; i < size_; i++) {
array_[i] = arrayInt.array_[i];
lowerBounds_[i] = arrayInt.lowerBounds_[i] ;
upperBounds_[i] = arrayInt.upperBounds_[i] ;
} // for
} // Copy Constructor
@Override
public Variable deepCopy() {
return new ArrayInt(this);
} // deepCopy
/**
* Returns the length of the arrayInt.
* @return The length
*/
public int getLength(){
return size_;
} // getLength
/**
* getValue
* @param index Index of value to be returned
* @return the value in position index
*/
public int getValue(int index) throws JMException {
if ((index >= 0) && (index < size_))
return array_[index] ;
else {
Configuration.logger_.severe(jmetal.encodings.variable.ArrayInt.class+".getValue(): index value (" + index + ") invalid");
throw new JMException(jmetal.encodings.variable.ArrayInt.class+": index value (" + index + ") invalid") ;
} // if
} // getValue
/**
* setValue
* @param index Index of value to be returned
* @param value The value to be set in position index
*/
public void setValue(int index, int value) throws JMException {
if ((index >= 0) && (index < size_))
array_[index] = value;
else {
Configuration.logger_.severe(jmetal.encodings.variable.ArrayInt.class+".setValue(): index value (" + index + ") invalid");
throw new JMException(jmetal.encodings.variable.ArrayInt.class+": index value (" + index + ") invalid") ;
} // else
} // setValue
/**
* Get the lower bound of a value
* @param index The index of the value
* @return the lower bound
*/
public double getLowerBound(int index) throws JMException {
if ((index >= 0) && (index < size_))
return lowerBounds_[index] ;
else {
Configuration.logger_.severe(jmetal.encodings.variable.ArrayInt.class+".getLowerBound(): index value (" + index + ") invalid");
throw new JMException(jmetal.encodings.variable.ArrayInt.class+".getLowerBound: index value (" + index + ") invalid") ;
} // else
} // getLowerBound
/**
* Get the upper bound of a value
* @param index The index of the value
* @return the upper bound
*/
public double getUpperBound(int index) throws JMException {
if ((index >= 0) && (index < size_))
return upperBounds_[index];
else {
Configuration.logger_.severe(jmetal.encodings.variable.ArrayInt.class+".getUpperBound(): index value (" + index + ") invalid");
throw new JMException(jmetal.encodings.variable.ArrayInt.class+".getUpperBound: index value (" + index + ") invalid") ;
} // else
} // getLowerBound
/**
* Returns a string representing the object
* @return The string
*/
public String toString(){
String string ;
string = "" ;
for (int i = 0; i < size_ ; i ++)
string += array_[i] + " " ;
return string ;
} // toString
} // ArrayInt