//
// Special Session on Real-Parameter Optimization at CEC-05
// Edinburgh, UK, 2-5 Sept. 2005
//
// Organizers:
// Prof. Kalyanmoy Deb
// deb@iitk.ac.in
// http://www.iitk.ac.in/kangal/deb.htm
// A/Prof. P. N. Suganthan
// epnsugan@ntu.edu.sg
// http://www.ntu.edu.sg/home/EPNSugan
//
// Java version of the org.uma.test functions
//
// Matlab reference code
// http://www.ntu.edu.sg/home/EPNSugan
//
// Java version developer:
// Assistant Prof. Ying-ping Chen
// Department of Computer Science
// National Chiao Tung University
// HsinChu City, Taiwan
// ypchen@csie.nctu.edu.tw
// http://www.csie.nctu.edu.tw/~ypchen/
//
// Typical use of the org.uma.test functions in the Benchmark:
//
// // Create a Benchmark object
// Benchmark theBenchmark = new Benchmark();
// // Use the factory function call to create a org.uma.test function object
// // org.uma.test function 3 with 50 dimension
// // the object class is "TestFunc"
// TestFunc aTestFunc = theBenchmark.testFunctionFactory(3, 50);
// // Invoke the function with x
// double experimentoutput = aTestFunc.f(x);
//
// Version 0.90
// Currently, this version cannot handle any numbers of dimensions.
// It cannot generate the shifted global optima and rotation matrices
// that are not provided with the Matlab reference code.
// It can handle all cases whose data files are provided with
// the Matlab reference code.
// Version 0.91
// Revised according to the Matlab reference code and the PDF document
// dated March 8, 2005.
//
package org.uma.jmetal.problem.singleobjective.cec2005competitioncode;
import org.uma.jmetal.util.JMetalException;
public class F05SchwefelGlobalOptBound extends TestFunc {
// Fixed (class) parameters
static final public String FUNCTION_NAME = "Schwefel's Problem 2.6 with Global Optimum on Bounds";
static final public String DEFAULT_FILE_DATA = Benchmark.CEC2005SUPPORTDATADIRECTORY + "/schwefel_206_data.txt";
// Shifted global optimum
private final double[] m_o;
private final double[][] m_A;
// In order to avoid excessive memory allocation,
// a fixed memory buffer is allocated for each function object.
private double[] m_B;
private double[] m_z;
// Constructors
public F05SchwefelGlobalOptBound(int dimension, double bias) throws JMetalException {
this(dimension, bias, DEFAULT_FILE_DATA);
}
public F05SchwefelGlobalOptBound(int dimension, double bias, String file_data)
throws JMetalException {
super(dimension, bias, FUNCTION_NAME);
// Note: dimension starts from 0
m_o = new double[mDimension];
m_A = new double[mDimension][mDimension];
m_B = new double[mDimension];
m_z = new double[mDimension];
double[][] m_data = new double[mDimension + 1][mDimension];
// Load the shifted global optimum
Benchmark.loadMatrixFromFile(file_data, mDimension + 1, mDimension, m_data);
for (int i = 0; i < mDimension; i++) {
if ((i + 1) <= Math.ceil(mDimension / 4.0)) {
m_o[i] = -100.0;
} else if ((i + 1) >= Math.floor((3.0 * mDimension) / 4.0)) {
m_o[i] = 100.0;
} else {
m_o[i] = m_data[0][i];
}
}
for (int i = 0; i < mDimension; i++) {
System.arraycopy(m_data[i + 1], 0, m_A[i], 0, mDimension);
}
Benchmark.Ax(m_B, m_A, m_o);
}
// Function body
public double f(double[] x) {
double max = Double.NEGATIVE_INFINITY;
Benchmark.Ax(m_z, m_A, x);
for (int i = 0; i < mDimension; i++) {
double temp = Math.abs(m_z[i] - m_B[i]);
if (max < temp) {
max = temp;
}
}
return (max + mBias);
}
}