You can subscribe to this list here.
2003 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
(2) |
Sep
(7) |
Oct
(1) |
Nov
|
Dec
|
---|---|---|---|---|---|---|---|---|---|---|---|---|
2004 |
Jan
(13) |
Feb
(17) |
Mar
(5) |
Apr
(10) |
May
(10) |
Jun
(42) |
Jul
(23) |
Aug
(38) |
Sep
(12) |
Oct
(9) |
Nov
(6) |
Dec
|
2005 |
Jan
(3) |
Feb
(17) |
Mar
(6) |
Apr
|
May
(1) |
Jun
(10) |
Jul
|
Aug
(10) |
Sep
|
Oct
(8) |
Nov
(2) |
Dec
(2) |
2006 |
Jan
(2) |
Feb
(11) |
Mar
(44) |
Apr
(84) |
May
(120) |
Jun
(18) |
Jul
|
Aug
(12) |
Sep
(19) |
Oct
(22) |
Nov
(7) |
Dec
(11) |
2007 |
Jan
(6) |
Feb
(10) |
Mar
(24) |
Apr
(13) |
May
(46) |
Jun
(25) |
Jul
(46) |
Aug
(47) |
Sep
(60) |
Oct
(61) |
Nov
(138) |
Dec
(47) |
2008 |
Jan
(6) |
Feb
(23) |
Mar
(58) |
Apr
(78) |
May
(82) |
Jun
(34) |
Jul
(56) |
Aug
(59) |
Sep
(54) |
Oct
(127) |
Nov
(47) |
Dec
(33) |
2009 |
Jan
(16) |
Feb
(18) |
Mar
(37) |
Apr
(162) |
May
(49) |
Jun
(58) |
Jul
(59) |
Aug
(17) |
Sep
(10) |
Oct
|
Nov
|
Dec
|
From: Gary P. <gpa...@gm...> - 2009-08-03 09:33:58
|
Here are the list of topics currently cooking in CIlib. Commits prefixed with '-' are in 'pu' with commits prefixed with '+' have already been merged into 'next'. Commits prefixed with '.' have not yet been included in a branch. I've not had too much time to review some of the more complex patches and as a result they have not been accepted yet. A rough timeline for releases: * 0.7.1 (2009-08-14) ----------------------------------------------------------------------- [New topics] * gp/immutable-matrix (2009-08-03 08:10:57) 1 commit . Immutable Matrix type The immutable matrix is required to ensure that the data is consistent. The patch is an immutable matrix type. * gp/fitness-methods (2009-07-31 09:50:11) 2 commits . Always increment evaluations problem. . Removed calculateFitness(boolean) from Entity. A cleanup on the Entity API to remove some ambiguous methods. Also includes a correction to the interpretation of the number of fitness evaluations. * gp/documentation + Update to cilib.net * gp/evolutionary-programming (2009-07-30 09:34:33) 5 commits . Removed enum EntityType.Individual. . Strategy parameter initialization for EC. . sumOf() utility method. . EP: Remove deprecated method usage. . Initial EP algorithm. Basic implementation of the EP. More additions to come. This is the basic CEP algorithm. ----------------------------------------------------------------------- [Graduated to "master"] Nothing this week. ----------------------------------------------------------------------- [Stalled] * mg/multi-response (2009-06-15 16:35:34) 2 commits . Additional response strategies . MultipleResponseStrategy to maintain a list of strategies. ----------------------------------------------------------------------- [On Hold] * gp/nichepso (2009-06-18 11:39:39) 5 commits . Added debugging for NichePSO. . Niching algorithm fixes and unit tests. . Added niching test cases. . Added length() to Vector. Synonym for norm(). . Updated NichePSO algorithm. The NichePSO needs some more testing. A few behaviors of the particles does not make sense - sub-swarms are merged too aggressively on test problems. * jd/dynamic (2009-07-09 19:26:16) 1 commit . Dynamic files added. The dynamic patch needs some work. I'm slowly moving through it. The immutable matrix patch was created to fix some of the issues with this patch. More work is required though - I've added corrections where applicable so far. |
From: Gary P. <gpa...@gm...> - 2009-08-03 06:14:35
|
The operations on a Matrix, result in a new Matrix instance. This class builds on this idea and provides an immutable matrix implementation that is an instance of Type, but is implemented using a double[][] for speed. Signed-off-by: Gary Pampara <gpa...@gm...> --- pom.xml | 6 + .../net/sourceforge/cilib/container/Matrix.java | 204 ----------- .../problem/dataset/MatrixDataSetBuilder.java | 18 +- .../mappingproblem/CurvilinearCompEvaluator.java | 6 +- .../mappingproblem/CurvilinearDistEvaluator.java | 6 +- .../problem/mappingproblem/KruskalEvaluator.java | 8 +- .../mappingproblem/LinearMappingProblem.java | 10 +- .../problem/mappingproblem/MappingEvaluator.java | 4 +- .../problem/mappingproblem/MappingProblem.java | 130 +------ .../cilib/type/types/container/Matrix.java | 376 ++++++++++++++++++++ .../java/net/sourceforge/cilib/util/Vectors.java | 13 +- .../sourceforge/cilib/container/MatrixTest.java | 197 ---------- .../cilib/type/types/container/MatrixTest.java | 249 +++++++++++++ 13 files changed, 692 insertions(+), 535 deletions(-) delete mode 100644 src/main/java/net/sourceforge/cilib/container/Matrix.java create mode 100644 src/main/java/net/sourceforge/cilib/type/types/container/Matrix.java delete mode 100644 src/test/java/net/sourceforge/cilib/container/MatrixTest.java create mode 100644 src/test/java/net/sourceforge/cilib/type/types/container/MatrixTest.java diff --git a/pom.xml b/pom.xml index 07fa70d..bf3b9f4 100644 --- a/pom.xml +++ b/pom.xml @@ -126,6 +126,11 @@ <artifactId>commons-math</artifactId> <version>1.1</version> </dependency> + <dependency> + <groupId>com.google.collections</groupId> + <artifactId>google-collections</artifactId> + <version>1.0-rc2</version> + </dependency> </dependencies> <build> <defaultGoal>package</defaultGoal> @@ -308,3 +313,4 @@ </plugins> </reporting> </project> + diff --git a/src/main/java/net/sourceforge/cilib/container/Matrix.java b/src/main/java/net/sourceforge/cilib/container/Matrix.java deleted file mode 100644 index 1119584..0000000 --- a/src/main/java/net/sourceforge/cilib/container/Matrix.java +++ /dev/null @@ -1,204 +0,0 @@ -/** - * Copyright (C) 2003 - 2009 - * Computational Intelligence Research Group (CIRG@UP) - * Department of Computer Science - * University of Pretoria - * South Africa - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package net.sourceforge.cilib.container; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Vector; - -import net.sourceforge.cilib.util.Cloneable; - -/** - * Representation of a <code>Matrix</code>, with the rows and the columns represented - * as a 2D array. The 2D array has been implemented as a Object array as the needed - * data stored within the Matrix is variable. - * - * @author Gary Pampara - * @param <E> The parameterized type. - */ -@Deprecated -public class Matrix<E> implements Cloneable { - private static final long serialVersionUID = 4621194915276987567L; - - private ArrayList< ArrayList<E> > data; // This is the ArrayList of the 1st dimension - private int rows; - private int cols; - - /** - * Create a new <code>Matrix</code> object with dimensions: rows x columns. - * @param rows The number of rows the <code>Matrix</code> should contain. - * @param cols The number of columns the <code>Matrix</code> should contain. - */ - public Matrix(int rows, int cols) { - if (rows == 0 || cols == 0) { - throw new IllegalArgumentException("Cannot create a Matrix with row or column dimension < 1"); - } - - this.rows = rows; - this.cols = cols; - - data = new ArrayList< ArrayList<E> >(); - - for (int i = 0; i < rows; i++) { - ArrayList<E> tmp = new ArrayList<E>(); - - for (int j = 0; j < cols; j++) { - tmp.add(null); - } - - data.add(tmp); - } - } - - - /** - * Copy constructor. - * @param copy The instance to copy. - */ - public Matrix(Matrix<E> copy) { - rows = copy.rows; - cols = copy.cols; - - data = new ArrayList<ArrayList<E>>(); - - for (ArrayList<E> item : data) { - ArrayList<E> cloneList = new ArrayList<E>(); - - for (E j : item) - cloneList.add(j); - } - } - - - /** - * {@inheritDoc} - */ - public Matrix<E> getClone() { - return new Matrix<E>(this); - } - - /** - * Place an <code>Object</code> at a point (row, column) within the <code>Matrix</code>. - * @param row The row where the needed item is located - * @param col The column where the needed item is located - * @param object The <code>Object</code> to place the <code>Matrix</code> at prosition (row, column) - */ - public void set(int row, int col, E object) { - if ((row >= rows || col >= cols) && (row >= 0 || col >= 0)) - throw new IndexOutOfBoundsException("Cannot set item at out of bounds index"); - - ArrayList<E> tmp = data.get(row); - tmp.set(col, object); - } - - /** - * Return the current item within the grid, located at (row, column). - * @param row The row where the needed item is located - * @param col The column where the needed item is located - * @return The <code>Object</code> within the <code>Matrix</code> at position (row, column) - */ - public E get(int row, int col) { - if ((row >= rows || col >= cols) && (row >= 0 || col >= 0)) - throw new IndexOutOfBoundsException("Cannot acces element - index out of bounds"); - - return data.get(row).get(col); - } - - /** - * Get the number of columns in the <code>Matrix</code>. - * @return The number of columns in the <code>Matrix</code>. - */ - public int getColumnCount() { - return cols; - } - - /** - * Get the number of rows in the <code>Matrix</code>. - * @return The number of rows in the <code>Matrix</code>. - */ - public int getRowCount() { - return rows; - } - - /** - * {@inheritDoc} - */ - @Override - public boolean equals(Object obj) { - return false; - } - - /** - * {@inheritDoc} - */ - @Override - public int hashCode() { - return super.hashCode(); - } - - /** - * Clear the current <code>Matrix</code> of it's internal state. - */ - public void clear() { - data = null; - data = new ArrayList< ArrayList<E> >(); - - for (int i = 0; i < rows; i++) { - ArrayList<E> tmp = new ArrayList<E>(); - - for (int j = 0; j < cols; j++) - tmp.add(null); - - data.add(tmp); - } - } - - /** - * Get a <code>Vector</code> representing the row within the <code>Matrix</code> at the given index. - * @param row The row index of the row to be returned, indexed from 0. - * @return A <code>Vector</code> representing the row within the <code>Matrix</code>. - */ - public Collection<E> getRow(int row) { - ArrayList<E> tmp = new ArrayList<E>(); - - for (int i = 0; i < cols; i++) { - tmp.add(this.get(row, i)); - } - - return tmp; - } - - /** - * Get a <code>Vector</code> representing the column within the <code>Matrix</code> at the given index. - * @param col The column index of the row to be returned, indexed from 0. - * @return A <code>Vector</code> representing the column within the <code>Matrix</code>. - */ - public Collection<E> getColumn(int col) { - Collection<E> tmp = new Vector<E>(); - - for (int i = 0; i < rows; i++) - tmp.add(this.get(i, col)); - - return tmp; - } - -} diff --git a/src/main/java/net/sourceforge/cilib/problem/dataset/MatrixDataSetBuilder.java b/src/main/java/net/sourceforge/cilib/problem/dataset/MatrixDataSetBuilder.java index 8b9b7f1..43d97ea 100644 --- a/src/main/java/net/sourceforge/cilib/problem/dataset/MatrixDataSetBuilder.java +++ b/src/main/java/net/sourceforge/cilib/problem/dataset/MatrixDataSetBuilder.java @@ -25,8 +25,9 @@ import java.io.EOFException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.StreamTokenizer; - -import net.sourceforge.cilib.container.Matrix; +import java.util.ArrayList; +import java.util.List; +import net.sourceforge.cilib.type.types.container.Matrix; /** * TODO: This needs to implement the reading of a matrix as needed by MappingProblem. @@ -35,7 +36,7 @@ import net.sourceforge.cilib.container.Matrix; public class MatrixDataSetBuilder extends BinaryDataSetBuilder { private static final long serialVersionUID = 1141280214032774956L; - private Matrix<Double> matrix; + private Matrix matrix; private int numvectors = 0; private int m = -1; private int d = -1; @@ -57,6 +58,7 @@ public class MatrixDataSetBuilder extends BinaryDataSetBuilder { @Override public void initialise() { + Matrix.Builder matrixBuilder = null; try { InputStream is = this.getDataSet(0).getInputStream(); @@ -79,7 +81,7 @@ public class MatrixDataSetBuilder extends BinaryDataSetBuilder { if (m <= 0) throw new IllegalStateException("Need to have a positive number as the input dimensions"); - matrix = new Matrix<Double>(numvectors, m); + matrixBuilder = Matrix.builder().rows(numvectors).columns(m); if (tok.nextToken() != StreamTokenizer.TT_NUMBER) throw new IllegalStateException("Expected an integer number as the third token in the dataset"); @@ -93,6 +95,7 @@ public class MatrixDataSetBuilder extends BinaryDataSetBuilder { throw new IllegalStateException("Output dimension must be less than input dimension"); for (int i = 0; i < numvectors; i++) { + List<Double> rowVector = new ArrayList<Double>(); for (int j = 0; j < m; j++) { int tok_ret = tok.nextToken(); while (tok_ret != StreamTokenizer.TT_NUMBER) { @@ -106,20 +109,23 @@ public class MatrixDataSetBuilder extends BinaryDataSetBuilder { } } - matrix.set(i, j, tok.nval); + rowVector.add(tok.nval); } + matrixBuilder.addRow(rowVector); } } catch (Exception e) { throw new RuntimeException(e); } + + matrix = matrixBuilder.build(); } /** * Get the constructed {@see net.sourceforge.cilib.container.Matrix Matrix}. * @return The current {@code Matrix} instance. */ - public Matrix<Double> getMatrix() { + public Matrix getMatrix() { return this.matrix; } diff --git a/src/main/java/net/sourceforge/cilib/problem/mappingproblem/CurvilinearCompEvaluator.java b/src/main/java/net/sourceforge/cilib/problem/mappingproblem/CurvilinearCompEvaluator.java index dd414ef..c16d435 100644 --- a/src/main/java/net/sourceforge/cilib/problem/mappingproblem/CurvilinearCompEvaluator.java +++ b/src/main/java/net/sourceforge/cilib/problem/mappingproblem/CurvilinearCompEvaluator.java @@ -21,9 +21,9 @@ */ package net.sourceforge.cilib.problem.mappingproblem; -import net.sourceforge.cilib.container.Matrix; import net.sourceforge.cilib.problem.Fitness; import net.sourceforge.cilib.problem.MinimisationFitness; +import net.sourceforge.cilib.type.types.container.Matrix; /** @@ -42,14 +42,14 @@ public class CurvilinearCompEvaluator implements MappingEvaluator { * * @author jkroon */ - public Fitness evaluateMapping(Matrix<Double> dist) { + public Fitness evaluateMapping(Matrix dist) { int numvect = prob.getNumInputVectors(); double res = 0.0; for(int i = 0; i < numvect; i++) for(int j = i + 1; j < numvect; j++) { double inp = prob.getDistanceInputVect(i, j); - double tmp = inp - dist.get(i, j); + double tmp = inp - dist.valueAt(i, j); res += tmp * tmp * f(inp); } diff --git a/src/main/java/net/sourceforge/cilib/problem/mappingproblem/CurvilinearDistEvaluator.java b/src/main/java/net/sourceforge/cilib/problem/mappingproblem/CurvilinearDistEvaluator.java index 0a3bed9..e213059 100644 --- a/src/main/java/net/sourceforge/cilib/problem/mappingproblem/CurvilinearDistEvaluator.java +++ b/src/main/java/net/sourceforge/cilib/problem/mappingproblem/CurvilinearDistEvaluator.java @@ -21,9 +21,9 @@ */ package net.sourceforge.cilib.problem.mappingproblem; -import net.sourceforge.cilib.container.Matrix; import net.sourceforge.cilib.problem.Fitness; import net.sourceforge.cilib.problem.MinimisationFitness; +import net.sourceforge.cilib.type.types.container.Matrix; /** * Implements the Curvilinear Distance function for evaluating the @@ -41,14 +41,14 @@ public class CurvilinearDistEvaluator implements MappingEvaluator { * * @author jkroon */ - public Fitness evaluateMapping(Matrix<Double> d) { + public Fitness evaluateMapping(Matrix d) { int numvect = prob.getNumInputVectors(); double res = 0.0; for(int i = 0; i < numvect; i++) for(int j = i + 1; j < numvect; j++) { double inp = dist.getDistance(i, j); - double tmp = inp - d.get(i, j); + double tmp = inp - d.valueAt(i, j); res += tmp * tmp * f(inp); } diff --git a/src/main/java/net/sourceforge/cilib/problem/mappingproblem/KruskalEvaluator.java b/src/main/java/net/sourceforge/cilib/problem/mappingproblem/KruskalEvaluator.java index df5daec..676d053 100644 --- a/src/main/java/net/sourceforge/cilib/problem/mappingproblem/KruskalEvaluator.java +++ b/src/main/java/net/sourceforge/cilib/problem/mappingproblem/KruskalEvaluator.java @@ -21,9 +21,9 @@ */ package net.sourceforge.cilib.problem.mappingproblem; -import net.sourceforge.cilib.container.Matrix; import net.sourceforge.cilib.problem.Fitness; import net.sourceforge.cilib.problem.MinimisationFitness; +import net.sourceforge.cilib.type.types.container.Matrix; /** * Implements the Kruskal stress function for evaluating the fitness of the MappingProblem. @@ -40,7 +40,7 @@ public class KruskalEvaluator implements MappingEvaluator { * * @author jkroon */ - public Fitness evaluateMapping(Matrix<Double> dist) { + public Fitness evaluateMapping(Matrix dist) { double above = 0.0; double below = 0.0; @@ -49,11 +49,11 @@ public class KruskalEvaluator implements MappingEvaluator { for(int i = 0; i < numvect; i++) { for(int j = i + 1; j < numvect; j++) { double inp_dist = prob.getDistanceInputVect(i, j); - double tmp = inp_dist - dist.get(i, j); + double tmp = inp_dist - dist.valueAt(i, j); above += tmp * tmp; // below += inp_dist * inp_dist; - below += dist.get(i, j) * dist.get(i, j); + below += dist.valueAt(i, j) * dist.valueAt(i, j); } } diff --git a/src/main/java/net/sourceforge/cilib/problem/mappingproblem/LinearMappingProblem.java b/src/main/java/net/sourceforge/cilib/problem/mappingproblem/LinearMappingProblem.java index 34b33bf..7ed790e 100644 --- a/src/main/java/net/sourceforge/cilib/problem/mappingproblem/LinearMappingProblem.java +++ b/src/main/java/net/sourceforge/cilib/problem/mappingproblem/LinearMappingProblem.java @@ -21,8 +21,8 @@ */ package net.sourceforge.cilib.problem.mappingproblem; -import net.sourceforge.cilib.container.Matrix; import net.sourceforge.cilib.type.DomainRegistry; +import net.sourceforge.cilib.type.types.container.Matrix; import net.sourceforge.cilib.type.types.container.Vector; /** @@ -75,7 +75,7 @@ public class LinearMappingProblem extends MappingProblem { * * @author jkroon */ - protected final void performMapping(Matrix<Double> input, Vector matrix, Matrix<Double> output) { + protected final void performMapping(Matrix input, Vector matrix, Matrix output) { int outputDimension = getOutputDim(); // D int inputDimension = getInputDim(); // M int numberOfVectors = getNumInputVectors(); // N @@ -83,11 +83,11 @@ public class LinearMappingProblem extends MappingProblem { for(int v = 0; v < numberOfVectors; v++) { int base = 0; for(int d = 0; d < outputDimension; d++) { - output.set(v, d, 0.0); +// output.set(v, d, 0.0); for(int m = 0; m < inputDimension; m++) { - double value = matrix.getReal(base+m) * input.get(v, m); + double value = matrix.getReal(base+m) * input.valueAt(v, m); //output[v][d] += matrix[base + m] * input[v][m]; - output.set(v, d, value); +// output.set(v, d, value); } base += inputDimension; } diff --git a/src/main/java/net/sourceforge/cilib/problem/mappingproblem/MappingEvaluator.java b/src/main/java/net/sourceforge/cilib/problem/mappingproblem/MappingEvaluator.java index c777793..3d4dae4 100644 --- a/src/main/java/net/sourceforge/cilib/problem/mappingproblem/MappingEvaluator.java +++ b/src/main/java/net/sourceforge/cilib/problem/mappingproblem/MappingEvaluator.java @@ -21,8 +21,8 @@ */ package net.sourceforge.cilib.problem.mappingproblem; -import net.sourceforge.cilib.container.Matrix; import net.sourceforge.cilib.problem.Fitness; +import net.sourceforge.cilib.type.types.container.Matrix; /** * Class that actually evaluates a given Mapping. This is to allow using @@ -40,7 +40,7 @@ public interface MappingEvaluator { * * @author jkroon */ - public Fitness evaluateMapping(Matrix<Double> dist); + public Fitness evaluateMapping(Matrix dist); /** * Gets called when attached to a MappingProblem. This is to allow diff --git a/src/main/java/net/sourceforge/cilib/problem/mappingproblem/MappingProblem.java b/src/main/java/net/sourceforge/cilib/problem/mappingproblem/MappingProblem.java index b868357..71a6f73 100644 --- a/src/main/java/net/sourceforge/cilib/problem/mappingproblem/MappingProblem.java +++ b/src/main/java/net/sourceforge/cilib/problem/mappingproblem/MappingProblem.java @@ -21,12 +21,12 @@ */ package net.sourceforge.cilib.problem.mappingproblem; -import net.sourceforge.cilib.container.Matrix; import net.sourceforge.cilib.problem.Fitness; import net.sourceforge.cilib.problem.OptimisationProblemAdapter; import net.sourceforge.cilib.problem.dataset.DataSetBuilder; import net.sourceforge.cilib.problem.dataset.MatrixDataSetBuilder; import net.sourceforge.cilib.type.types.Type; +import net.sourceforge.cilib.type.types.container.Matrix; import net.sourceforge.cilib.type.types.container.Vector; import net.sourceforge.cilib.util.DistanceMeasure; import net.sourceforge.cilib.util.EuclideanDistanceMeasure; @@ -47,8 +47,8 @@ public abstract class MappingProblem extends OptimisationProblemAdapter { private int outputDimension = -1; private int inputDimension = -1; private int numvectors = -1; - private Matrix<Double> inputs = null; - private Matrix<Double> inpDistMatrix = null; + private Matrix inputs = null; + private Matrix inpDistMatrix = null; private MappingEvaluator evaluator = null; private DistanceMeasure distanceMeasure = null; @@ -76,19 +76,23 @@ public abstract class MappingProblem extends OptimisationProblemAdapter { protected final Fitness calculateFitness(Type solution) { Vector matrix = (Vector) solution; - Matrix<Double> distmatrix = new Matrix<Double>(numvectors, numvectors); - Matrix<Double> outputs = new Matrix<Double>(numvectors, outputDimension); + Matrix distmatrix = null; +// new Matrix<Double>(numvectors, numvectors); + Matrix outputs = null; +// new Matrix<Double>(numvectors, outputDimension); performMapping(inputs, matrix, outputs); matrix = null; + Matrix.Builder builder = Matrix.builder(); + for(int a = 0; a < numvectors; a++) { - distmatrix.set(a, a, 0.0); +// distmatrix.set(a, a, 0.0); for(int b = 0; b < a; b++) { double distance = this.distanceMeasure.distance(outputs.getRow(a), outputs.getRow(b)); - distmatrix.set(a, b, distance); - distmatrix.set(b, a, distance); +// distmatrix.set(a, b, distance); +// distmatrix.set(b, a, distance); } } @@ -112,7 +116,7 @@ public abstract class MappingProblem extends OptimisationProblemAdapter { * * @author jkroon */ - protected abstract void performMapping(Matrix<Double> inputs, Vector distmatrix, Matrix<Double> outputs); + protected abstract void performMapping(Matrix inputs, Vector distmatrix, Matrix outputs); /** @@ -127,32 +131,6 @@ public abstract class MappingProblem extends OptimisationProblemAdapter { /** - * Returns the DomainComponent representing this mapping. The actual - * ^ depends on the mapping scheme, so your mapping scheme will need - * to override getMatrixSize(). - * - * (-1000,1000) might not be sufficient. Atm there is no way to - * alter this other than changing it here. - * - * @return An instance of DomainComponent as explained above. - * - * @author jkroon - */ - /*public final DomainComponent getDomain() { - if(domain == null) - domain = ComponentFactory.instance().newComponent("R(-1000,1000)^" + getMatrixSize()); - - return domain; - }*/ - /*public final Domain getDomain() { - if (domain == null) { - domain = Domain.getInstance(); - } - return domain; - }*/ - - - /** * Gets the value of M, the input dimension. * * @return The current value of M. @@ -214,90 +192,22 @@ public abstract class MappingProblem extends OptimisationProblemAdapter { public void setDataSetBuilder(DataSetBuilder dataSetBuilder) { super.setDataSetBuilder(dataSetBuilder); - MatrixDataSetBuilder matrixBuilder = (MatrixDataSetBuilder) dataSetBuilder; - inputs = matrixBuilder.getMatrix(); + MatrixDataSetBuilder matrixDataSetBuilder = (MatrixDataSetBuilder) dataSetBuilder; + inputs = matrixDataSetBuilder.getMatrix(); - inpDistMatrix = new Matrix<Double>(numvectors, numvectors); + Matrix.Builder matrixBuilder = Matrix.builder().rows(numvectors).columns(numvectors); for(int i = 0; i < numvectors; i++) { - inpDistMatrix.set(i, i, 0.0); for(int j = 0; j < i; j++) { double distance = this.distanceMeasure.distance(inputs.getRow(i), inputs.getRow(j)); - this.inpDistMatrix.set(i, j, distance); - this.inpDistMatrix.set(j, i, distance); + matrixBuilder.valueAt(i, j, distance); + matrixBuilder.valueAt(j, i, distance); } } + inpDistMatrix = matrixBuilder.build(); } - /*this.dataSetBuilder = dataSetBuilder; - - try { - InputStream is = this.dataSetBuilder.getDataSet(0).getInputStream(); - - StreamTokenizer tok = new StreamTokenizer(new InputStreamReader(is)); - - if(tok.nextToken() != StreamTokenizer.TT_NUMBER) - throw new IllegalStateException("Expected an integer number as the first token in the dataset"); - - numvectors = (int)tok.nval; - - if(numvectors <= 0) - throw new IllegalStateException("Must have a positive number of vectors in input file"); - - if(tok.nextToken() != StreamTokenizer.TT_NUMBER) - throw new IllegalStateException("Expected an integer number as the second token in the dataset"); - - M = (int)tok.nval; - - if(M <= 0) - throw new IllegalStateException("Need to have a positive number as the input dimensions"); - - inputs = new double[numvectors][M]; - - if(tok.nextToken() != StreamTokenizer.TT_NUMBER) - throw new IllegalStateException("Expected an integer number as the third token in the dataset"); - - D = (int)tok.nval; - - if(D <= 0) - throw new IllegalStateException("Need to have a positive number as the input dimensions"); - - if(!(D <= M)) - throw new IllegalStateException("Output dimension must be less than input dimension"); - - for(int i = 0; i < numvectors; i++) { - for(int m = 0; m < M; m++) { - int tok_ret = tok.nextToken(); - while(tok_ret != StreamTokenizer.TT_NUMBER) - { - switch(tok_ret) { - case StreamTokenizer.TT_EOF: - throw new EOFException(); - case StreamTokenizer.TT_WORD: - throw new IllegalStateException("Only numerical input expected (line " + tok.lineno() + ")"); - } - } - - inputs[i][m] = tok.nval; - - } - } - } - catch(Exception e) - { - throw new RuntimeException(e); - } - - inp_distmatrix = new double[numvectors][numvectors]; - for(int i = 0; i < numvectors; i++) { - inp_distmatrix[i][i] = 0.0; - for(int j = 0; j < i; j++) - inp_distmatrix[i][j] = inp_distmatrix[j][i] = - calcDistance(inputs[i], inputs[j]); - } - }*/ - /** * Retrieve the distance between the two given input vectors. * @@ -309,7 +219,7 @@ public abstract class MappingProblem extends OptimisationProblemAdapter { * @author jkroon */ public final double getDistanceInputVect(int i1, int i2) { - return inpDistMatrix.get(i2, i1); + return inpDistMatrix.valueAt(i2, i1); } diff --git a/src/main/java/net/sourceforge/cilib/type/types/container/Matrix.java b/src/main/java/net/sourceforge/cilib/type/types/container/Matrix.java new file mode 100644 index 0000000..f42abb6 --- /dev/null +++ b/src/main/java/net/sourceforge/cilib/type/types/container/Matrix.java @@ -0,0 +1,376 @@ +/** + * Copyright (C) 2003 - 2009 + * Computational Intelligence Research Group (CIRG@UP) + * Department of Computer Science + * University of Pretoria + * South Africa + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +package net.sourceforge.cilib.type.types.container; + +import com.google.common.base.Preconditions; +import com.google.common.collect.Iterables; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import net.sourceforge.cilib.type.types.Type; +import net.sourceforge.cilib.util.Vectors; + +/** + * Representation of a Matrix. This class is immutable with the intention that + * all opertions on a Matrix will result in a new resulting Matrix. + */ +public final class Matrix implements Type { + private static final long serialVersionUID = 7726056815026772629L; + + private final double[][] contents; + + private Matrix(int x, int y) { + Preconditions.checkArgument(x > 0, "Zero row length does not make sense."); + Preconditions.checkArgument(y > 0, "Zero column length does not make sense."); + + this.contents = new double[x][y]; + } + + /** + * Determine if the {@code Matrix} is square. In other words, if the number + * of rows and columns are the same. + * @return {@code true} if the matrix is square, {@code false} otherwise. + */ + public boolean isSquare() { + Preconditions.checkState(this.contents.length >= 1); + return (contents.length == contents[0].length) ? true : false; + } + + /** + * Obtain the current value within the matrix at the provided co-ordinates. + * @param row The row to lookup, indexed from 0. + * @param col The column to lookup, indexed from 0. + * @return The value located at the position {@code [row][col]}. + */ + public double valueAt(int row, int col) { + return this.contents[row][col]; + } + + /** + * Obtain the row vector for the given row, indexed from 0. + * @param row The row number to obtain. + * @return A {@code Vector} representing the row. + */ + public Vector getRow(int row) { + List<Double> rowList = new ArrayList<Double>(this.contents[row].length); + + for (double d : this.contents[row]) + rowList.add(d); + + return Vectors.create(rowList); + } + + /** + * Get the number of rows within the matrix. + * @return The number of rows. + */ + public int getRows() { + return this.contents.length; + } + + /** + * Get the number of columns within the matrix. + * @return The number of columns. + */ + public int getColumns() { + return this.contents[0].length; + } + + /** + * Apply the addition operation on the current matrix and the provided + * matrix. The result is a new matrix. + * @param b The matrix to add. + * @return A new {@code Matrix} representing the result of the addition. + */ + public final Matrix plus(final Matrix b) { + Preconditions.checkArgument((this.getRows() == b.getRows()) && (this.getColumns() == b.getColumns()), + "Illegal matrix dimensions for matrix addition."); + + Matrix result = new Matrix(this.getRows(), this.getColumns()); + for (int i = 0; i < getRows(); i++) { + for (int j = 0; j < getColumns(); j++) { + result.contents[i][j] = this.contents[i][j] + b.contents[i][j]; + } + } + return result; + } + + /** + * Apply the subtration operation on the current matrix and the provided + * matrix. The result is a new matrix. + * @param b The matrix to subtract. + * @return A new {@code Matrix} representing the result of the subtraction. + */ + public final Matrix minus(final Matrix b) { + Preconditions.checkArgument((this.getRows() == b.getRows()) && (this.getColumns() == b.getColumns()), + "Illegal matrix dimensions for matrix subtraction."); + + Matrix result = new Matrix(this.getRows(), this.getColumns()); + for (int i = 0; i < getRows(); i++) { + for (int j = 0; j < getColumns(); j++) { + result.contents[i][j] = this.contents[i][j] - b.contents[i][j]; + } + } + return result; + } + + /** + * Perform multiplication on the current {@code Matrix} and the provided {@code Matrix}. + * Naturally, matrix multiplication can only be performed on matricies that adhere + * to the required matrix multiplication rules. + * <p> + * The result of this operation is a new immutable matrix. + * @param b The {@code Matrix} to to multiply the current {@code Matrix} with. + * @return A new {@code Matrix} representing the result of the multiplication. + */ + public Matrix times(Matrix b) { + Preconditions.checkArgument(this.getRows() == b.getColumns(), "Illegal matrix dimensions for matrix multiplication."); + + Matrix result = new Matrix(this.getRows(), b.getColumns()); + for (int i = 0; i < result.getColumns(); i++) { + for (int j = 0; j < result.getRows(); j++) { + for (int k = 0; k < this.getRows(); k++) + result.contents[i][j] += this.contents[i][k] * b.contents[k][j]; + } + } + return result; + } + + /** + * Obtain the transposition of the current {@code Matrix} instance. + * @return A new {@code Matrix} that is the transpose of the current {@code Matrix}. + */ + public Matrix transpose() { + Matrix result = new Matrix(this.getColumns(), this.getRows()); + for (int i = 0; i < this.getRows(); i++) + for (int j = 0; j < this.getColumns(); j++) + result.contents[j][i] = this.contents[i][j]; + return result; + } + + /** + * {@inheritDoc} + */ + @Override + public Type getClone() { + throw new UnsupportedOperationException("Cloning a Matrix is not possible."); + } + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + + if (getClass() != obj.getClass()) { + return false; + } + + final Matrix other = (Matrix) obj; + return Arrays.deepEquals(this.contents, other.contents); + } + + @Override + public int hashCode() { + int hash = 0; + + for (double[] array : this.contents) + hash += Arrays.hashCode(array); + + return hash; + } + + /** + * Obtain a builder for {@code Matrix} instances. + * @return A {@link Matrix.Builder} instance. + */ + public static Builder builder() { + return new Builder(); + } + + /** + * A builder object to help with the construction of {@link Matrix} instances. + */ + public static final class Builder { + private int rowNumber; + private int colNumber; + private List<List<Double>> rows; + private List<DataPoint> tuples; + private boolean identity; + + private Builder() { + reset(); + } + + /** + * Define the number of rows that the built up {@code Matrix} will contain. + * @param rows The required number of rows. + * @return The current {@code Builder}. + */ + public Builder rows(int rows) { + this.rowNumber = rows; + return this; + } + + /** + * Define the number of coloumns that the built up {@code Matrix} will contain. + * @param colummns The required number of columns. + * @return The current {@code Builder}. + */ + public Builder columns(int colummns) { + this.colNumber = colummns; + return this; + } + + /** + * Add a row vector, for inclusion in the built up {@code Matrix}. + * @param columnValues The values for the columns. + * @return the current {@code Builder}. + * @throws IllegalArgumentException if the {@code columnValues} are not the same + * dimensions / length that is expected. + */ + public Builder addRow(Double... columnValues) { + Preconditions.checkArgument(columnValues.length == this.colNumber, + "Cannot add a row with a differing column length. Expected: " + this.colNumber + ", got: " + columnValues.length); + + List<Double> rowVector = Arrays.asList(columnValues); + this.rows.add(rowVector); + return this; + } + + /** + * Add a row vector, for inclusion in the built up {@code Matrix}. + * @param iterable The values for the columns. + * @return the current {@code Builder}. + * @throws IllegalArgumentException if the {@code columnValues} are not the same + * dimensions / length that is expected. + */ + public Builder addRow(Iterable<Double> iterable) { + List<Double> list = new ArrayList<Double>(); + Iterables.addAll(list, iterable); + this.rows.add(list); + return this; + } + + /** + * Define that the built up {@code Matrix} should be an identity {@code Matrix}. + * All added row vectors or position values will be discarded if the built up {@code Matrix} + * is to be an identity {@code Matrix}. + * @return The current {@code Builder}. + */ + public Builder identity() { + Preconditions.checkState(this.rowNumber == this.colNumber, "Identity on non-sqaure matrix is not allowed."); + this.identity = true; + return this; + } + + /** + * Define that at a specific value for a defined grid point within the built + * up {@code Matrix}. + * <p> + * This operation will override any values specified by a row vector addition. + * @param row The row number, indexed from 0. + * @param col The column number, indexed from 0. + * @param value The value to be set at the defined location. + * @return The curret {@code Builder}. + */ + public Builder valueAt(int row, int col, double value) { + this.tuples.add(new DataPoint(row, col, value)); + return this; + } + + /** + * Reset the builder into a clean state. + */ + private void reset() { + this.rowNumber = 0; + this.colNumber = 0; + this.rows = new ArrayList<List<Double>>(); + this.tuples = new ArrayList<DataPoint>(); + this.identity = false; + } + + /** + * Build the {@code Matrix} instance, based on the currently defined builder. + * @return A new immutable {@code Matrix} instance. + */ + public Matrix build() { + Matrix matrix = new Matrix(rowNumber, colNumber); + + if (identity) { + for (int i = 0; i < rowNumber; i++) { + for (int j = 0; j < colNumber; j++) { + matrix.contents[i][j] = (i == j) ? 1.0 : 0.0; + } + } + + return matrix; + } + + if (this.rows.size() >= 1) { + for (int i = 0; i < rowNumber; i++) { + for (int j = 0; j < colNumber; j++) { + matrix.contents[i][j] = this.rows.get(i).get(j); + } + } + } + + if (this.tuples.size() >= 0) { + for (DataPoint tuple : this.tuples) { + matrix.contents[tuple.getX()][tuple.getY()] = tuple.getValue(); + } + } + + reset(); // Reset the builder to the default state, so that it may be used again, if needed. + + return matrix; + } + } + + /** + * Class defining a [row, col, value] tuple for building up of a {@code Matrix}. + */ + private static final class DataPoint { + private int x; + private int y; + private double value; + + public DataPoint(int x, int y, double value) { + this.x = x; + this.y = y; + this.value = value; + } + + public double getValue() { + return value; + } + + public int getX() { + return x; + } + + public int getY() { + return y; + } + } +} diff --git a/src/main/java/net/sourceforge/cilib/util/Vectors.java b/src/main/java/net/sourceforge/cilib/util/Vectors.java index 35679e8..36a7dab 100644 --- a/src/main/java/net/sourceforge/cilib/util/Vectors.java +++ b/src/main/java/net/sourceforge/cilib/util/Vectors.java @@ -21,6 +21,7 @@ */ package net.sourceforge.cilib.util; +import java.util.Arrays; import net.sourceforge.cilib.type.types.Numeric; import net.sourceforge.cilib.type.types.Real; import net.sourceforge.cilib.type.types.Type; @@ -83,9 +84,19 @@ public final class Vectors { * @return The created {@linkplain Vector} object, containing the provided list of items. */ public static <T extends Number> Vector create(T... result) { + return create(Arrays.asList(result)); + } + + /** + * Create a {@code Vector} from the provided {@code Iterable}. + * @param <T> The number type. + * @param iterable The iterable of data elements. + * @return A {@code Vector} of the provided objects. + */ + public static <T extends Number> Vector create(Iterable<T> iterable) { Vector vector = new Vector(); - for (T element : result) + for (T element : iterable) vector.add(new Real(element.doubleValue())); return vector; diff --git a/src/test/java/net/sourceforge/cilib/container/MatrixTest.java b/src/test/java/net/sourceforge/cilib/container/MatrixTest.java deleted file mode 100644 index d4cba40..0000000 --- a/src/test/java/net/sourceforge/cilib/container/MatrixTest.java +++ /dev/null @@ -1,197 +0,0 @@ -/** - * Copyright (C) 2003 - 2009 - * Computational Intelligence Research Group (CIRG@UP) - * Department of Computer Science - * University of Pretoria - * South Africa - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package net.sourceforge.cilib.container; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertSame; -import static org.junit.Assert.fail; - -import java.util.Collection; -import java.util.Iterator; - -import org.junit.Test; - - - -/** - * This Unit test tests all the needed operations of the Matrix class. - * - * @author Gary Pampara - */ -public class MatrixTest { - - @Test - public void testMatrixCreation() { - Matrix<Double> m = new Matrix<Double>(3, 3); - assertEquals(3, m.getColumnCount()); - assertEquals(3, m.getRowCount()); - } - - @Test(expected = IllegalArgumentException.class) - public void testMatrixExceptionCreation() { - new Matrix<Double>(0, 0); - } - - @Test - public void testDataMatrixInputOutputOperation() { - Matrix<Integer> m = new Matrix<Integer>(10, 5); - - for (int i = 0; i < m.getRowCount(); i++) { - for (int j = 0; j < m.getColumnCount(); j++) { - int tmp = i*j; - m.set(i, j, tmp); - assertSame(tmp, m.get(i, j)); - assertEquals(tmp, m.get(i, j).intValue()); - } - } - } - - @Test - public void testNullGet() { - Matrix<Integer> m = new Matrix<Integer>(5, 5); - - for (int i = 0; i < m.getRowCount(); i++) { - for (int j = 0; j < m.getColumnCount(); j++) { - assertEquals(null, m.get(i, j)); - } - } - } - - @Test - public void testOutOfBoundsSetOperation() { - Matrix<Double> m = new Matrix<Double>(2, 2); - try { - m.set(-1, 1, null); - } - catch (IndexOutOfBoundsException i1) { - try { - m.set(1, -1, null); - } - catch (IndexOutOfBoundsException i2) { - try { - m.set(0, 2, null); - } - catch (IndexOutOfBoundsException i3) { - try { - m.set(2, 0, null); - } - catch (IndexOutOfBoundsException i4) { - return; - } - } - } - } - fail("Boundary cases fail on the Matrix set operation"); - } - - @Test - public void testOutOfBoundsGetOperation() { - Matrix<Double> m = new Matrix<Double>(2, 2); - // Get operation - try { - m.get(-1, 1); - } - catch (IndexOutOfBoundsException i) { - try { - m.get(1, -1); - } - catch (IndexOutOfBoundsException i2) { - try { - m.get(0, 2); - } - catch (IndexOutOfBoundsException i3) { - try { - m.get(2, 0); - } - catch (IndexOutOfBoundsException i4) { - return; - } - } - } - } - fail("Boundary cases fail on the Matrix get operation"); - } - - @Test - public void testClearOperation() { - Matrix<Double> m = new Matrix<Double>(2, 2); - - m.set(0, 0, new Double(5.0)); - m.set(0, 1, new Double(4.0)); - m.set(1, 0, new Double(3.0)); - m.set(1, 1, new Double(2.0)); - - m.clear(); - - assertEquals(null, m.get(0, 0)); - assertEquals(null, m.get(0, 1)); - assertEquals(null, m.get(1, 0)); - assertEquals(null, m.get(1, 1)); - } - - @Test - public void testGetRow() { - Matrix<Double> m = new Matrix<Double>(2, 2); - - m.set(0, 0, new Double(5.0)); - m.set(0, 1, new Double(4.0)); - m.set(1, 0, new Double(3.0)); - m.set(1, 1, new Double(2.0)); - - Collection<Double> c1 = m.getRow(0); - Collection<Double> c2 = m.getRow(1); - - Iterator<Double> i1 = c1.iterator(); - Iterator<Double> i2 = c2.iterator(); - - for (int i = 0; i < m.getColumnCount(); i++) { - if (i1.hasNext()) assertEquals(m.get(0, i), i1.next()); - else fail(); - - if (i2.hasNext()) assertEquals(m.get(1, i), i2.next()); - else fail(); - } - } - - @Test - public void testGetColumn() { - Matrix<Double> m = new Matrix<Double>(2, 2); - - m.set(0, 0, new Double(5.0)); - m.set(0, 1, new Double(4.0)); - m.set(1, 0, new Double(3.0)); - m.set(1, 1, new Double(2.0)); - - Collection<Double> c1 = m.getColumn(0); - Collection<Double> c2 = m.getColumn(1); - - Iterator<Double> i1 = c1.iterator(); - Iterator<Double> i2 = c2.iterator(); - - for (int i = 0; i < m.getColumnCount(); i++) { - if (i1.hasNext()) assertEquals(m.get(i, 0), i1.next()); - else fail(); - if (i2.hasNext()) assertEquals(m.get(i, 1), i2.next()); - else fail(); - } - } -} diff --git a/src/test/java/net/sourceforge/cilib/type/types/container/MatrixTest.java b/src/test/java/net/sourceforge/cilib/type/types/container/MatrixTest.java new file mode 100644 index 0000000..6144707 --- /dev/null +++ b/src/test/java/net/sourceforge/cilib/type/types/container/MatrixTest.java @@ -0,0 +1,249 @@ +/** + * Copyright (C) 2003 - 2009 + * Computational Intelligence Research Group (CIRG@UP) + * Department of Computer Science + * University of Pretoria + * South Africa + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +package net.sourceforge.cilib.type.types.container; + +import net.sourceforge.cilib.util.Vectors; +import org.junit.Assert; +import org.junit.Test; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.equalTo; + +/** + * + */ +public class MatrixTest { + + @Test(expected=IllegalArgumentException.class) + public void constructionZeroRow() { + Matrix.builder().rows(0).build(); + } + + @Test(expected=IllegalArgumentException.class) + public void constructionZeroColumn() { + Matrix.builder().columns(0).build(); + } + + @Test + public void square() { + Matrix a = Matrix.builder().rows(2).columns(2).build(); + Assert.assertTrue(a.isSquare()); + } + + @Test + public void notSquare() { + Matrix a = Matrix.builder().rows(3).columns(4).build(); + Assert.assertFalse(a.isSquare()); + } + + @Test + public void valueAt() { + Matrix a = Matrix.builder().rows(1).columns(2) + .addRow(1.0, 2.0) + .build(); + + Assert.assertThat(a.valueAt(0, 0), is(1.0)); + Assert.assertThat(a.valueAt(0, 1), is(2.0)); + } + + @Test(expected=IndexOutOfBoundsException.class) + public void invalidValueOf() { + Matrix a = Matrix.builder().rows(1).columns(1).build(); + a.valueAt(1, 2); + } + + @Test + public void getRow() { + Matrix a = Matrix.builder().rows(2).columns(2) + .addRow(1.0, 1.0) + .addRow(2.0, 2.0) + .build(); + + Vector row = a.getRow(0); + + Assert.assertThat(row.getReal(0), is(1.0)); + Assert.assertThat(row.getReal(1), is(1.0)); + } + + @Test + public void rowNumber() { + Matrix a = Matrix.builder().rows(4).columns(5).build(); + Assert.assertThat(a.getRows(), is(4)); + } + + @Test + public void columnNumber() { + Matrix a = Matrix.builder().rows(5).columns(8).build(); + Assert.assertThat(a.getColumns(), is(8)); + } + + @Test + public void addition() { + Matrix a = Matrix.builder().rows(2).columns(2) + .addRow(1.0, 2.0) + .addRow(3.0, 4.0) + .build(); + Matrix b = Matrix.builder().rows(2).columns(2) + .addRow(1.0, 2.0) + .addRow(3.0, 4.0) + .build(); + + Matrix c = a.plus(b); + + Assert.assertThat(c.getRow(0), equalTo(Vectors.create(2.0, 4.0))); + Assert.assertThat(c.getRow(1), equalTo(Vectors.create(6.0, 8.0))); + } + + @Test(expected=IllegalArgumentException.class) + public void invalidAddition() { + Matrix a = Matrix.builder().rows(3).columns(2).build(); + Matrix b = Matrix.builder().rows(1).columns(2).build(); + a.plus(b); + } + + @Test + public void subtraction() { + Matrix a = Matrix.builder().rows(2).columns(2) + .addRow(2.0, 4.0) + .addRow(6.0, 8.0) + .build(); + Matrix b = Matrix.builder().rows(2).columns(2) + .addRow(1.0, 2.0) + .addRow(3.0, 4.0) + .build(); + + Matrix c = a.minus(b); + + Assert.assertThat(c.getRow(0), equalTo(Vectors.create(1.0, 2.0))); + Assert.assertThat(c.getRow(1), equalTo(Vectors.create(3.0, 4.0))); + } + + @Test(expected=IllegalArgumentException.class) + public void invalidSubtraction() { + Matrix a = Matrix.builder().rows(2).columns(2).build(); + Matrix b = Matrix.builder().rows(2).columns(3).build(); + a.minus(b); + } + + @Test + public void multiplication() { + Matrix a = Matrix.builder().rows(2).columns(2) + .addRow(2.0, 4.0) + .addRow(6.0, 8.0) + .build(); + Matrix b = Matrix.builder().rows(2).columns(2) + .addRow(1.0, 2.0) + .addRow(3.0, 4.0) + .build(); + + Matrix c = a.times(b); + + Assert.assertThat(c.getRow(0), equalTo(Vectors.create(14.0, 20.0))); + Assert.assertThat(c.getRow(1), equalTo(Vectors.create(30.0, 44.0))); + } + + @Test + public void squareTranspose() { + Matrix a = Matrix.builder().rows(2).columns(2) + .addRow(2.0, 4.0) + .addRow(6.0, 8.0) + .build(); + + Matrix c = a.transpose(); + + Assert.assertThat(c.getRow(0), equalTo(Vectors.create(2.0, 6.0))); + Assert.assertThat(c.getRow(1), equalTo(Vectors.create(4.0, 8.0))); + } + + @Test + public void transposeRowVector() { + Matrix a = Matrix.builder().rows(1).columns(2) + .addRow(2.0, 4.0) + .build(); + + Matrix c = a.transpose(); + + Assert.assertThat(c.getRows(), is(2)); + Assert.assertThat(c.getColumns(), is(1)); + } + + @Test + public void transposeColumnVector() { + Matrix a = Matrix.builder().rows(2).columns(1) + .addRow(2.0) + .addRow(4.0) + .build(); + + Matrix c = a.transpose(); + + Assert.assertThat(c.getRows(), is(1)); + Assert.assertThat(c.getColumns(), is(2)); + } + + @Test + public void identity() { + Matrix identity = Matrix.builder().rows(4).columns(4).identity().build(); + + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + if (i == j) Assert.assertThat(identity.valueAt(i, j), is(1.0)); + else Assert.assertThat(identity.valueAt(i, j), is(0.0)); + } + } + } + + @Test(expected=IllegalStateException.class) + public void invalidIdentity() { + Matrix.builder().rows(2).columns(5).identity().build(); + } + + @Test + public void uniquePositionSetting() { + Matrix a = Matrix.builder().rows(2).columns(2) + .valueAt(0, 0, 3.0) + .build(); + + Assert.assertThat(a.valueAt(0, 0), is(3.0)); + Assert.assertThat(a.valueAt(0, 1), is(0.0)); + Assert.assertThat(a.valueAt(1, 0), is(0.0)); + Assert.assertThat(a.valueAt(1, 1), is(0.0)); + } + + @Test + public void equal() { + Matrix.Builder builder = Matrix.builder(); + Matrix a = builder.rows(1).columns(1).valueAt(0, 0, 2.0).build(); + Matrix b = builder.rows(1).columns(1).valueAt(0, 0, 2.0).build(); + + Assert.assertTrue(a.equals(b)); + } + + @Test + public void hash() { + Matrix.Builder builder = Matrix.builder(); + Matrix a = builder.rows(1).columns(1).valueAt(0, 0, 2.0).build(); + Matrix b = builder.rows(1).columns(1).valueAt(0, 0, 2.0).build(); + + Assert.assertTrue(a.hashCode() == b.hashCode()); + } + +} -- 1.6.4 |
From: Gary P. <gpa...@gm...> - 2009-07-31 08:31:48
|
Chatted to Leo. There are exceptions when it comes to dynamic environments. Positions that have not changed that need to be re-evaluated based on an environment change should not count as a fitness evaluation. Will adjust the patch to cater for such situations. On Friday 31 July 2009 09:56:20 Gary Pampara wrote: > When the fitness is determined from the problem, the number of fitness > evaluations must be incremented. > > Signed-off-by: Gary Pampara <gpa...@gm...> > --- > .../algorithm/MultistartOptimisationAlgorithm.java | 2 +- > .../net/sourceforge/cilib/boa/bee/AbstractBee.java | 2 +- > .../cilib/clustering/kmeans/KMeans.java | 6 +- > .../cilib/cooperative/CooperativeEntity.java | 9 +-- > .../SelectiveContributionUpdateStrategy.java | 2 +- > .../java/net/sourceforge/cilib/ec/Individual.java | 2 +- > .../java/net/sourceforge/cilib/entity/Harmony.java | 2 +- > .../criterion/CriterionBasedMOProblemAdapter.java | 2 +- > .../ArchivingIterationStrategy.java | 4 +- > .../foundation/NeuralNetworkProblem.java | 7 +- > .../CooperativeOptimisationProblemAdapter.java | 2 +- > .../net/sourceforge/cilib/problem/MOFitness.java | 8 +- > .../cilib/problem/MOOptimisationProblem.java | 12 ++-- > .../cilib/problem/OptimisationProblem.java | 3 +- > .../cilib/problem/OptimisationProblemAdapter.java | 6 +- > .../cilib/pso/dynamic/DynamicParticle.java | 2 +- > .../RandomSentryDetectionStrategy.java | 2 +- > .../ArchiveReevaluationResponseStrategy.java | 4 +- > ...lutionParticleReevaluationResponseStrategy.java | 2 +- > .../DominantGuideUpdateStrategy.java | 4 +- > .../cilib/pso/particle/MultiObjectiveParticle.java | 2 +- > .../cilib/pso/particle/StandardParticle.java | 2 +- > .../DEPositionUpdateStrategy.java | 4 +- > .../GCVelocityUpdateStrategy.java | 2 +- > .../calculator/EntityBasedFitnessCalculator.java | 6 +- > .../cilib/util/calculator/FitnessCalculator.java | 4 +- > .../calculator/PropertyBasedFitnessCalculator.java | 4 +- > .../StructuredTypeFitnessCalculator.java | 4 +- > .../crossover/BlendCrossoverStrategyTest.java | 2 +- > .../crossover/OnePointCrossoverStrategyTest.java | 2 +- > .../crossover/UniformCrossoverStrategyTest.java | 2 +- > .../cilib/moo/archive/constrained/ArchiveTest.java | 74 > ++++++++++---------- .../constrained/ConstrainedArchiveTest.java | > 4 +- > .../solutionweighing/SolutionWeighingTest.java | 12 ++-- > .../sourceforge/cilib/problem/MOFitnessTest.java | 10 +-- > 35 files changed, 104 insertions(+), 113 deletions(-) > > diff --git > a/src/main/java/net/sourceforge/cilib/algorithm/MultistartOptimisationAlgor >ithm.java > b/src/main/java/net/sourceforge/cilib/algorithm/MultistartOptimisationAlgor >ithm.java index 0ed1bc5..8ef8f51 100644 > --- > a/src/main/java/net/sourceforge/cilib/algorithm/MultistartOptimisationAlgor >ithm.java +++ > b/src/main/java/net/sourceforge/cilib/algorithm/MultistartOptimisationAlgor >ithm.java @@ -251,7 +251,7 @@ public class MultistartOptimisationAlgorithm > extends Algorithm implements Partic * @see > net.sourceforge.cilib.Problem.OptimisationProblemAdapter#calculateFitness(j >ava.lang.Object) */ > protected Fitness calculateFitness(Type solution) { > - return target.getFitness(solution, true); > + return target.getFitness(solution); > } > > public void resetFitnessCounter() { > diff --git a/src/main/java/net/sourceforge/cilib/boa/bee/AbstractBee.java > b/src/main/java/net/sourceforge/cilib/boa/bee/AbstractBee.java index > ceea52b..2f4e1ab 100644 > --- a/src/main/java/net/sourceforge/cilib/boa/bee/AbstractBee.java > +++ b/src/main/java/net/sourceforge/cilib/boa/bee/AbstractBee.java > @@ -97,7 +97,7 @@ public abstract class AbstractBee extends AbstractEntity > implements HoneyBee { */ > @Override > public void calculateFitness() { > - this.getProperties().put(EntityType.FITNESS, > getFitnessCalculator().getFitness(this, true)); + > this.getProperties().put(EntityType.FITNESS, > getFitnessCalculator().getFitness(this)); } > > /** > diff --git > a/src/main/java/net/sourceforge/cilib/clustering/kmeans/KMeans.java > b/src/main/java/net/sourceforge/cilib/clustering/kmeans/KMeans.java index > d4fd66c..8f85a73 100644 > --- a/src/main/java/net/sourceforge/cilib/clustering/kmeans/KMeans.java > +++ b/src/main/java/net/sourceforge/cilib/clustering/kmeans/KMeans.java > @@ -73,7 +73,7 @@ public class KMeans extends SingularAlgorithm { > > /** > * Create a copy of the provided instance. > - * @param rhs The instance to copy. > + * @param copy The instance to copy. > */ > public KMeans(KMeans copy) { > super(copy); > @@ -105,7 +105,7 @@ public class KMeans extends SingularAlgorithm { > */ > @Override > public void algorithmIteration() { > - calculator.getFitness(centroids, true); > + calculator.getFitness(centroids); > > // the fitness calculation step already arranged the clusters and > centroids for us ClusteringUtils helper = ClusteringUtils.get(); > @@ -163,7 +163,7 @@ public class KMeans extends SingularAlgorithm { > */ > @Override > public OptimisationSolution getBestSolution() { > - return new OptimisationSolution(centroids.getClone(), > getOptimisationProblem().getFitness(centroids, false)); + return new > OptimisationSolution(centroids.getClone(), > getOptimisationProblem().getFitness(centroids)); } > > /** > diff --git > a/src/main/java/net/sourceforge/cilib/cooperative/CooperativeEntity.java > b/src/main/java/net/sourceforge/cilib/cooperative/CooperativeEntity.java > index 4ae1f95..640c41d 100644 > --- > a/src/main/java/net/sourceforge/cilib/cooperative/CooperativeEntity.java > +++ > b/src/main/java/net/sourceforge/cilib/cooperative/CooperativeEntity.java @@ > -29,7 +29,6 @@ import net.sourceforge.cilib.problem.OptimisationProblem; > import net.sourceforge.cilib.type.types.Numeric; > import net.sourceforge.cilib.type.types.Type; > import net.sourceforge.cilib.type.types.container.StructuredType; > -import net.sourceforge.cilib.type.types.container.TypeList; > import net.sourceforge.cilib.type.types.container.Vector; > > /** > @@ -52,6 +51,7 @@ public class CooperativeEntity extends AbstractEntity { > fitness = rhs.fitness; > } > > + @Override > public CooperativeEntity getClone() { > return new CooperativeEntity(this); > } > @@ -137,11 +137,8 @@ public class CooperativeEntity extends AbstractEntity > { throw new UnsupportedOperationException("Methd not implemented"); } > > + @Override > public void calculateFitness() { > - calculateFitness(true); > - } > - > - public void calculateFitness(boolean count) { > - fitness = getFitnessCalculator().getFitness(this, count); > + fitness = getFitnessCalculator().getFitness(this); > } > } > diff --git > a/src/main/java/net/sourceforge/cilib/cooperative/contributionupdatestrateg >ies/SelectiveContributionUpdateStrategy.java > b/src/main/java/net/sourceforge/cilib/cooperative/contributionupdatestrateg >ies/SelectiveContributionUpdateStrategy.java index 5452c99..ddf5bef 100644 > --- > a/src/main/java/net/sourceforge/cilib/cooperative/contributionupdatestrateg >ies/SelectiveContributionUpdateStrategy.java +++ > b/src/main/java/net/sourceforge/cilib/cooperative/contributionupdatestrateg >ies/SelectiveContributionUpdateStrategy.java @@ -38,7 +38,7 @@ public class > SelectiveContributionUpdateStrategy implements ContributionUpdateSt > dstTest.update(src, srcPos, dstPos, length); > > // calculate new fitness of updated clone > - dstTest.calculateFitness(false); > + dstTest.calculateFitness(); > > // if updated clone is better than original context, update > context if(dstTest.compareTo(dst) > 0) { > diff --git a/src/main/java/net/sourceforge/cilib/ec/Individual.java > b/src/main/java/net/sourceforge/cilib/ec/Individual.java index > c1ea82f..c6373e0 100644 > --- a/src/main/java/net/sourceforge/cilib/ec/Individual.java > +++ b/src/main/java/net/sourceforge/cilib/ec/Individual.java > @@ -145,7 +145,7 @@ public class Individual extends AbstractEntity { > */ > @Override > public void calculateFitness() { > - this.getProperties().put(EntityType.FITNESS, > this.getFitnessCalculator().getFitness(this, true)); + > this.getProperties().put(EntityType.FITNESS, > this.getFitnessCalculator().getFitness(this)); } > > /** > diff --git a/src/main/java/net/sourceforge/cilib/entity/Harmony.java > b/src/main/java/net/sourceforge/cilib/entity/Harmony.java index > 85fe665..6b21457 100644 > --- a/src/main/java/net/sourceforge/cilib/entity/Harmony.java > +++ b/src/main/java/net/sourceforge/cilib/entity/Harmony.java > @@ -80,7 +80,7 @@ public class Harmony extends AbstractEntity { > */ > @Override > public void calculateFitness() { > - Fitness fitness = getFitnessCalculator().getFitness(this, true); > + Fitness fitness = getFitnessCalculator().getFitness(this); > this.getProperties().put(EntityType.FITNESS, fitness); > } > > diff --git > a/src/main/java/net/sourceforge/cilib/moo/criterion/CriterionBasedMOProblem >Adapter.java > b/src/main/java/net/sourceforge/cilib/moo/criterion/CriterionBasedMOProblem >Adapter.java index e2687c0..c0c23ff 100644 > --- > a/src/main/java/net/sourceforge/cilib/moo/criterion/CriterionBasedMOProblem >Adapter.java +++ > b/src/main/java/net/sourceforge/cilib/moo/criterion/CriterionBasedMOProblem >Adapter.java @@ -83,7 +83,7 @@ public class CriterionBasedMOProblemAdapter > extends OptimisationProblemAdapter { > > @Override > protected Fitness calculateFitness(Type solution) { > - return this.problem.getFitness(this.activeIndex, solution, true); > + return this.problem.getFitness(this.activeIndex, solution); > } > > @Override > diff --git > a/src/main/java/net/sourceforge/cilib/moo/iterationstrategies/ArchivingIter >ationStrategy.java > b/src/main/java/net/sourceforge/cilib/moo/iterationstrategies/ArchivingIter >ationStrategy.java index f8e38ff..124747d 100644 > --- > a/src/main/java/net/sourceforge/cilib/moo/iterationstrategies/ArchivingIter >ationStrategy.java +++ > b/src/main/java/net/sourceforge/cilib/moo/iterationstrategies/ArchivingIter >ationStrategy.java @@ -72,12 +72,12 @@ public class > ArchivingIterationStrategy<E extends PopulationBasedAlgorithm> impl } > > protected void updateArchive(Topology<? extends Entity> population) { > - Algorithm topLevelAlgorithm = (Algorithm) > Algorithm.getAlgorithmList().get(0); + Algorithm topLevelAlgorithm = > Algorithm.getAlgorithmList().get(0); List<OptimisationSolution> > optimisationSolutions = new ArrayList<OptimisationSolution>(); for (Entity > entity : population) { > Type solution = entity.getCandidateSolution().getClone(); > optimisationSolutions.add(new OptimisationSolution(solution, > - > topLevelAlgorithm.getOptimisationProblem().getFitness(solution, false))); + > > topLevelAlgorithm.getOptimisationProblem().getFitness(solution))); } > Archive.get().addAll(optimisationSolutions); > } > diff --git > a/src/main/java/net/sourceforge/cilib/neuralnetwork/foundation/NeuralNetwor >kProblem.java > b/src/main/java/net/sourceforge/cilib/neuralnetwork/foundation/NeuralNetwor >kProblem.java index 8f54433..de82adf 100644 > --- > a/src/main/java/net/sourceforge/cilib/neuralnetwork/foundation/NeuralNetwor >kProblem.java +++ > b/src/main/java/net/sourceforge/cilib/neuralnetwork/foundation/NeuralNetwor >kProblem.java @@ -76,11 +76,10 @@ public class NeuralNetworkProblem > implements OptimisationProblem, Initializable return > evaluationStrategy.evaluate(p); > } > > - public Fitness getFitness(Type solution, boolean count) { > + @Override > + public Fitness getFitness(Type solution) { > + ++fitnessEvaluations; > > - if (count) { > - ++fitnessEvaluations; > - } > this.getTopology().setWeights((Vector) solution); > > //Defaults to first error element as the main fitness... > diff --git > a/src/main/java/net/sourceforge/cilib/problem/CooperativeOptimisationProble >mAdapter.java > b/src/main/java/net/sourceforge/cilib/problem/CooperativeOptimisationProble >mAdapter.java index 316d620..42ed4ab 100644 > --- > a/src/main/java/net/sourceforge/cilib/problem/CooperativeOptimisationProble >mAdapter.java +++ > b/src/main/java/net/sourceforge/cilib/problem/CooperativeOptimisationProble >mAdapter.java @@ -111,7 +111,7 @@ public class > CooperativeOptimisationProblemAdapter extends OptimisationProblemAd for > (int i = 0; i < dimension; ++i) { > ((Vector) context.getCandidateSolution()).setReal(offset + i, > participant.getReal(i)); } > - return problem.getFitness(context.getCandidateSolution(), true); > + return problem.getFitness(context.getCandidateSolution()); > } > > public DomainRegistry getDomain() { > diff --git a/src/main/java/net/sourceforge/cilib/problem/MOFitness.java > b/src/main/java/net/sourceforge/cilib/problem/MOFitness.java index > a6144a6..4edfc45 100644 > --- a/src/main/java/net/sourceforge/cilib/problem/MOFitness.java > +++ b/src/main/java/net/sourceforge/cilib/problem/MOFitness.java > @@ -34,19 +34,19 @@ public class MOFitness implements Fitness { > private static final long serialVersionUID = 1477723759384827131L; > private Fitness[] fitnesses; > > - public MOFitness(MOOptimisationProblem problem, Type[] solution, > boolean count) { + public MOFitness(MOOptimisationProblem problem, > Type[] solution) { int size = problem.size(); > fitnesses = new Fitness[size]; > for (int i = 0; i < size; ++i) { > - fitnesses[i] = problem.getFitness(i, solution[i], count); > + fitnesses[i] = problem.getFitness(i, solution[i]); > } > } > > - public MOFitness(MOOptimisationProblem problem, Type solution, boolean > count) { + public MOFitness(MOOptimisationProblem problem, Type > solution) { int size = problem.size(); > fitnesses = new Fitness[size]; > for (int i = 0; i < size; ++i) { > - fitnesses[i] = problem.getFitness(i, solution, count); > + fitnesses[i] = problem.getFitness(i, solution); > } > } > > diff --git > a/src/main/java/net/sourceforge/cilib/problem/MOOptimisationProblem.java > b/src/main/java/net/sourceforge/cilib/problem/MOOptimisationProblem.java > index 54b4b4a..ccc139f 100644 > --- > a/src/main/java/net/sourceforge/cilib/problem/MOOptimisationProblem.java > +++ > b/src/main/java/net/sourceforge/cilib/problem/MOOptimisationProblem.java @@ > -56,17 +56,17 @@ public class MOOptimisationProblem implements > OptimisationProblem, List<Optimisa return new MOOptimisationProblem(this); > } > > - public MOFitness getFitness(Type[] solutions, boolean count) { > - return new MOFitness(this, solutions, count); > + public MOFitness getFitness(Type[] solutions) { > + return new MOFitness(this, solutions); > } > > @Override > - public MOFitness getFitness(Type solution, boolean count) { > - return new MOFitness(this, solution, count); > + public MOFitness getFitness(Type solution) { > + return new MOFitness(this, solution); > } > > - public Fitness getFitness(int index, Type solution, boolean count) { > - return problems.get(index).getFitness(solution, count); > + public Fitness getFitness(int index, Type solution) { > + return problems.get(index).getFitness(solution); > } > > @Override > diff --git > a/src/main/java/net/sourceforge/cilib/problem/OptimisationProblem.java > b/src/main/java/net/sourceforge/cilib/problem/OptimisationProblem.java > index a5437c2..454aaa9 100644 > --- a/src/main/java/net/sourceforge/cilib/problem/OptimisationProblem.java > +++ b/src/main/java/net/sourceforge/cilib/problem/OptimisationProblem.java > @@ -53,10 +53,9 @@ public interface OptimisationProblem extends Problem { > * falls outside the search space of this problem. > * > * @param solution The potential solution found by the optimisation > algorithm. - * @param count True if this call should contribute to the > fitness evaluation count, see {@link #getFitnessEvaluations()}. * @return > The fitness of the solution. > */ > - public Fitness getFitness(Type solution, boolean count); > + public Fitness getFitness(Type solution); > > /** > * Returns the number of times the underlying fitness function has > been evaluated. diff --git > a/src/main/java/net/sourceforge/cilib/problem/OptimisationProblemAdapter.ja >va > b/src/main/java/net/sourceforge/cilib/problem/OptimisationProblemAdapter.ja >va index 1b2e37d..aa7288d 100644 > --- > a/src/main/java/net/sourceforge/cilib/problem/OptimisationProblemAdapter.ja >va +++ > b/src/main/java/net/sourceforge/cilib/problem/OptimisationProblemAdapter.ja >va @@ -72,10 +72,8 @@ public abstract class OptimisationProblemAdapter > implements OptimisationProblem /** > * {@inheritDoc} > */ > - public final Fitness getFitness(Type solution, boolean count) { > - if (count) { > - fitnessEvaluations.incrementAndGet(); > - } > + public final Fitness getFitness(Type solution) { > + fitnessEvaluations.incrementAndGet(); > > if (this.changeStrategy.shouldApply(this)) > changeEnvironment(); > diff --git > a/src/main/java/net/sourceforge/cilib/pso/dynamic/DynamicParticle.java > b/src/main/java/net/sourceforge/cilib/pso/dynamic/DynamicParticle.java > index efa583e..a69ac96 100644 > --- a/src/main/java/net/sourceforge/cilib/pso/dynamic/DynamicParticle.java > +++ b/src/main/java/net/sourceforge/cilib/pso/dynamic/DynamicParticle.java > @@ -52,7 +52,7 @@ public class DynamicParticle extends StandardParticle { > * Re-evaluate both best and current position of the particle. > */ > public void reevaluate() { > - this.getProperties().put(EntityType.Particle.BEST_FITNESS, > getFitnessCalculator().getFitness(this, true)); + > this.getProperties().put(EntityType.Particle.BEST_FITNESS, > getFitnessCalculator().getFitness(this)); this.calculateFitness(); > } > } > diff --git > a/src/main/java/net/sourceforge/cilib/pso/dynamic/detectionstrategies/Rando >mSentryDetectionStrategy.java > b/src/main/java/net/sourceforge/cilib/pso/dynamic/detectionstrategies/Rando >mSentryDetectionStrategy.java index 11f0fb3..95387a7 100644 > --- > a/src/main/java/net/sourceforge/cilib/pso/dynamic/detectionstrategies/Rando >mSentryDetectionStrategy.java +++ > b/src/main/java/net/sourceforge/cilib/pso/dynamic/detectionstrategies/Rando >mSentryDetectionStrategy.java @@ -79,7 +79,7 @@ public class > RandomSentryDetectionStrategy<E extends PopulationBasedAlgorithm> e for > (Entity nextSentry : sentryList) { > double oldSentryFitness = nextSentry.getFitness().getValue(); > nextSentry.calculateFitness(); > - double newSentryFitness = > algorithm.getOptimisationProblem().getFitness(nextSentry.getCandidateSoluti >on(), false).getValue(); + double newSentryFitness = > algorithm.getOptimisationProblem().getFitness(nextSentry.getCandidateSoluti >on()).getValue(); > > if(Math.abs(oldSentryFitness - newSentryFitness) >= theta) { > envChangeOccured = true; > diff --git > a/src/main/java/net/sourceforge/cilib/pso/dynamic/responsestrategies/Archiv >eReevaluationResponseStrategy.java > b/src/main/java/net/sourceforge/cilib/pso/dynamic/responsestrategies/Archiv >eReevaluationResponseStrategy.java index 10db1e8..cce4afd 100644 > --- > a/src/main/java/net/sourceforge/cilib/pso/dynamic/responsestrategies/Archiv >eReevaluationResponseStrategy.java +++ > b/src/main/java/net/sourceforge/cilib/pso/dynamic/responsestrategies/Archiv >eReevaluationResponseStrategy.java @@ -46,7 +46,7 @@ public class > ArchiveReevaluationResponseStrategy extends EnvironmentChangeRespon > @Override > protected void performReaction(PopulationBasedAlgorithm algorithm) { > for (Entity entity : algorithm.getTopology()) { > - entity.getProperties().put(EntityType.Particle.BEST_FITNESS, > entity.getFitnessCalculator().getFitness(entity, true)); + > entity.getProperties().put(EntityType.Particle.BEST_FITNESS, > entity.getFitnessCalculator().getFitness(entity)); > //entity.getProperties().put(EntityType.Particle.BEST_POSITION, > entity.getCandidateSolution()); entity.calculateFitness(); > } > @@ -56,7 +56,7 @@ public class ArchiveReevaluationResponseStrategy extends > EnvironmentChangeRespon > > List<OptimisationSolution> newList = new > LinkedList<OptimisationSolution>(); for (OptimisationSolution solution : > Archive.get()) { > - OptimisationSolution os = new > OptimisationSolution(solution.getPosition(), > problem.getFitness(solution.getPosition(), false)); + > OptimisationSolution os = new OptimisationSolution(solution.getPosition(), > problem.getFitness(solution.getPosition())); newList.add(os); > } > > diff --git > a/src/main/java/net/sourceforge/cilib/pso/dynamic/responsestrategies/Compet >itiveCoevolutionParticleReevaluationResponseStrategy.java > b/src/main/java/net/sourceforge/cilib/pso/dynamic/responsestrategies/Compet >itiveCoevolutionParticleReevaluationResponseStrategy.java index > f3140f8..15c0b15 100644 > --- > a/src/main/java/net/sourceforge/cilib/pso/dynamic/responsestrategies/Compet >itiveCoevolutionParticleReevaluationResponseStrategy.java +++ > b/src/main/java/net/sourceforge/cilib/pso/dynamic/responsestrategies/Compet >itiveCoevolutionParticleReevaluationResponseStrategy.java @@ -70,7 +70,7 @@ > public class CompetitiveCoevolutionParticleReevaluationResponseStrategy<E > extend Blackboard<Enum<?>, Type> blackboard = new Blackboard<Enum<?>, > Type>(); blackboard.put(EntityType.CANDIDATE_SOLUTION, > ((AbstractParticle)e).getBestPosition()); > blackboard.put(EntityType.Coevolution.BOARD, new EntityScoreboard()); - > Fitness val = > currentAlgorithm.getOptimisationProblem().getFitness(blackboard, false); + > Fitness val = > currentAlgorithm.getOptimisationProblem().getFitness(blackboard); > e.getProperties().put(EntityType.Particle.BEST_FITNESS, val); //if currentV > is better than re-evaluated pBest, then replace it if > (e.getFitness().compareTo(e.getBestFitness()) > 0) { diff --git > a/src/main/java/net/sourceforge/cilib/pso/moo/guideupdatestrategies/Dominan >tGuideUpdateStrategy.java > b/src/main/java/net/sourceforge/cilib/pso/moo/guideupdatestrategies/Dominan >tGuideUpdateStrategy.java index 22d529e..fccbd7d 100644 > --- > a/src/main/java/net/sourceforge/cilib/pso/moo/guideupdatestrategies/Dominan >tGuideUpdateStrategy.java +++ > b/src/main/java/net/sourceforge/cilib/pso/moo/guideupdatestrategies/Dominan >tGuideUpdateStrategy.java @@ -56,8 +56,8 @@ public class > DominantGuideUpdateStrategy implements GuideUpdateStrategy { Vector > previousGuide = (Vector) particle.getProperties().get(guideType); Algorithm > topLevelAlgorithm = Algorithm.getAlgorithmList().get(0); > OptimisationProblem problem = topLevelAlgorithm.getOptimisationProblem(); - > Fitness currentFitness = problem.getFitness(newGuide, false); - > if (previousGuide == null || > currentFitness.compareTo(problem.getFitness(previousGuide, false)) > 0) { + > Fitness currentFitness = problem.getFitness(newGuide); > + if (previousGuide == null || > currentFitness.compareTo(problem.getFitness(previousGuide)) > 0) { > particle.getProperties().put(guideType, newGuide); > } > } > diff --git > a/src/main/java/net/sourceforge/cilib/pso/particle/MultiObjectiveParticle.j >ava > b/src/main/java/net/sourceforge/cilib/pso/particle/MultiObjectiveParticle.j >ava index 272f0ab..cc66ed5 100644 > --- > a/src/main/java/net/sourceforge/cilib/pso/particle/MultiObjectiveParticle.j >ava +++ > b/src/main/java/net/sourceforge/cilib/pso/particle/MultiObjectiveParticle.j >ava @@ -33,7 +33,7 @@ public class MultiObjectiveParticle extends > StandardParticle { private static final long serialVersionUID = > 2449622504036301616L; > > public void setBestPosition(Type bestPosition) { > - Fitness bestPositionFitness = > Algorithm.get().getOptimisationProblem().getFitness(bestPosition, false); + > Fitness bestPositionFitness = > Algorithm.get().getOptimisationProblem().getFitness(bestPosition); > > this.getProperties().put(EntityType.Particle.BEST_POSITION, > bestPosition.getClone()); > this.getProperties().put(EntityType.Particle.BEST_FITNESS, > bestPositionFitness); diff --git > a/src/main/java/net/sourceforge/cilib/pso/particle/StandardParticle.java > b/src/main/java/net/sourceforge/cilib/pso/particle/StandardParticle.java > index 5176e8f..6f2cb2d 100644 > --- > a/src/main/java/net/sourceforge/cilib/pso/particle/StandardParticle.java > +++ > b/src/main/java/net/sourceforge/cilib/pso/particle/StandardParticle.java @@ > -163,7 +163,7 @@ public class StandardParticle extends AbstractParticle { > */ > @Override > public void calculateFitness() { > - Fitness fitness = getFitnessCalculator().getFitness(this, true); > + Fitness fitness = getFitnessCalculator().getFitness(this); > this.getProperties().put(EntityType.FITNESS, fitness); > > this.personalBestUpdateStrategy.updatePersonalBest(this); > diff --git > a/src/main/java/net/sourceforge/cilib/pso/positionupdatestrategies/DEPositi >onUpdateStrategy.java > b/src/main/java/net/sourceforge/cilib/pso/positionupdatestrategies/DEPositi >onUpdateStrategy.java index 3c244cd..2ac5646 100755 > --- > a/src/main/java/net/sourceforge/cilib/pso/positionupdatestrategies/DEPositi >onUpdateStrategy.java +++ > b/src/main/java/net/sourceforge/cilib/pso/positionupdatestrategies/DEPositi >onUpdateStrategy.java @@ -123,8 +123,8 @@ public class > DEPositionUpdateStrategy implements PositionUpdateStrategy { > > > //position should only become the offspring if its fitness is > better - Fitness trialFitness = > pso.getOptimisationProblem().getFitness(dePosition, false); - > Fitness currentFitness = > pso.getOptimisationProblem().getFitness(particle.getCandidateSolution(), > false); + Fitness trialFitness = > pso.getOptimisationProblem().getFitness(dePosition); + Fitness > currentFitness = > pso.getOptimisationProblem().getFitness(particle.getCandidateSolution()); > > if (trialFitness.compareTo(currentFitness) > 0) { > particle.setCandidateSolution(dePosition); > diff --git > a/src/main/java/net/sourceforge/cilib/pso/velocityupdatestrategies/GCVeloci >tyUpdateStrategy.java > b/src/main/java/net/sourceforge/cilib/pso/velocityupdatestrategies/GCVeloci >tyUpdateStrategy.java index 9bdfee4..cba2489 100644 > --- > a/src/main/java/net/sourceforge/cilib/pso/velocityupdatestrategies/GCVeloci >tyUpdateStrategy.java +++ > b/src/main/java/net/sourceforge/cilib/pso/velocityupdatestrategies/GCVeloci >tyUpdateStrategy.java @@ -159,7 +159,7 @@ public class > GCVelocityUpdateStrategy extends StandardVelocityUpdate { PSO pso = (PSO) > Algorithm.get(); > > if (particle == pso.getTopology().getBestEntity(new > SocialBestFitnessComparator<Particle>())) { - Fitness newFitness > = particle.getFitnessCalculator().getFitness(particle, false); + > Fitness newFitness = particle.getFitnessCalculator().getFitness(particle); > > if (!newFitness.equals(oldFitness)) { > this.failureCount = 0; > diff --git > a/src/main/java/net/sourceforge/cilib/util/calculator/EntityBasedFitnessCal >culator.java > b/src/main/java/net/sourceforge/cilib/util/calculator/EntityBasedFitnessCal >culator.java index afd5933..8b19b18 100644 > --- > a/src/main/java/net/sourceforge/cilib/util/calculator/EntityBasedFitnessCal >culator.java +++ > b/src/main/java/net/sourceforge/cilib/util/calculator/EntityBasedFitnessCal >culator.java @@ -35,6 +35,7 @@ public class EntityBasedFitnessCalculator > implements FitnessCalculator<Entity> { /** > * {@inheritDoc} > */ > + @Override > public EntityBasedFitnessCalculator getClone() { > return this; > } > @@ -42,9 +43,10 @@ public class EntityBasedFitnessCalculator implements > FitnessCalculator<Entity> { /** > * {@inheritDoc} > */ > - public Fitness getFitness(Entity entity, boolean count) { > + @Override > + public Fitness getFitness(Entity entity) { > Algorithm algorithm = Algorithm.get(); > - return > algorithm.getOptimisationProblem().getFitness(entity.getCandidateSolution() >, count); + return > algorithm.getOptimisationProblem().getFitness(entity.getCandidateSolution() >); } > > } > diff --git > a/src/main/java/net/sourceforge/cilib/util/calculator/FitnessCalculator.jav >a > b/src/main/java/net/sourceforge/cilib/util/calculator/FitnessCalculator.jav >a index 51ecf75..8ef9a07 100644 > --- > a/src/main/java/net/sourceforge/cilib/util/calculator/FitnessCalculator.jav >a +++ > b/src/main/java/net/sourceforge/cilib/util/calculator/FitnessCalculator.jav >a @@ -34,14 +34,14 @@ public interface FitnessCalculator<T> extends > Cloneable { /** > * {@inheritDoc} > */ > + @Override > public FitnessCalculator<T> getClone(); > > /** > * Get the fitness, given the <code>position</code>. > * @param entity The <code>Type</code> to base the calculation on. > - * @param count Whether or not the evaluation is to be counted. > * @return A <code>Fitness</code> object representing the fitness of > the <code>position</code>. */ > - public Fitness getFitness(T entity, boolean count); > + public Fitness getFitness(T entity); > > } > diff --git > a/src/main/java/net/sourceforge/cilib/util/calculator/PropertyBasedFitnessC >alculator.java > b/src/main/java/net/sourceforge/cilib/util/calculator/PropertyBasedFitnessC >alculator.java index 78783d3..39479ee 100644 > --- > a/src/main/java/net/sourceforge/cilib/util/calculator/PropertyBasedFitnessC >alculator.java +++ > b/src/main/java/net/sourceforge/cilib/util/calculator/PropertyBasedFitnessC >alculator.java @@ -45,8 +45,8 @@ public class PropertyBasedFitnessCalculator > implements * {@inheritDoc} > */ > @Override > - public Fitness getFitness(Entity entity, boolean count) { > + public Fitness getFitness(Entity entity) { > Algorithm algorithm = Algorithm.get(); > - return > algorithm.getOptimisationProblem().getFitness(entity.getProperties(), > count); + return > algorithm.getOptimisationProblem().getFitness(entity.getProperties()); } > } > diff --git > a/src/main/java/net/sourceforge/cilib/util/calculator/StructuredTypeFitness >Calculator.java > b/src/main/java/net/sourceforge/cilib/util/calculator/StructuredTypeFitness >Calculator.java index 5fe4d24..5e77f38 100644 > --- > a/src/main/java/net/sourceforge/cilib/util/calculator/StructuredTypeFitness >Calculator.java +++ > b/src/main/java/net/sourceforge/cilib/util/calculator/StructuredTypeFitness >Calculator.java @@ -46,9 +46,9 @@ public class > StructuredTypeFitnessCalculator<T extends StructuredType<?>> implem * > {@inheritDoc} > */ > @Override > - public Fitness getFitness(T structure, boolean count) { > + public Fitness getFitness(T structure) { > Algorithm algorithm = Algorithm.get(); > - return algorithm.getOptimisationProblem().getFitness(structure, > count); + return > algorithm.getOptimisationProblem().getFitness(structure); } > > } > diff --git > a/src/test/java/net/sourceforge/cilib/entity/operators/crossover/BlendCross >overStrategyTest.java > b/src/test/java/net/sourceforge/cilib/entity/operators/crossover/BlendCross >overStrategyTest.java index b66511a..7035d52 100644 > --- > a/src/test/java/net/sourceforge/cilib/entity/operators/crossover/BlendCross >overStrategyTest.java +++ > b/src/test/java/net/sourceforge/cilib/entity/operators/crossover/BlendCross >overStrategyTest.java @@ -84,7 +84,7 @@ public class > BlendCrossoverStrategyTest { > } > > @Override > - public Fitness getFitness(Individual entity, boolean count) { > + public Fitness getFitness(Individual entity) { > return InferiorFitness.instance(); > } > } > diff --git > a/src/test/java/net/sourceforge/cilib/entity/operators/crossover/OnePointCr >ossoverStrategyTest.java > b/src/test/java/net/sourceforge/cilib/entity/operators/crossover/OnePointCr >ossoverStrategyTest.java index e7805ca..f6a97df 100644 > --- > a/src/test/java/net/sourceforge/cilib/entity/operators/crossover/OnePointCr >ossoverStrategyTest.java +++ > b/src/test/java/net/sourceforge/cilib/entity/operators/crossover/OnePointCr >ossoverStrategyTest.java @@ -84,7 +84,7 @@ public class > OnePointCrossoverStrategyTest { > } > > @Override > - public Fitness getFitness(Individual entity, boolean count) { > + public Fitness getFitness(Individual entity) { > return InferiorFitness.instance(); > } > } > diff --git > a/src/test/java/net/sourceforge/cilib/entity/operators/crossover/UniformCro >ssoverStrategyTest.java > b/src/test/java/net/sourceforge/cilib/entity/operators/crossover/UniformCro >ssoverStrategyTest.java index daae496..f132db1 100644 > --- > a/src/test/java/net/sourceforge/cilib/entity/operators/crossover/UniformCro >ssoverStrategyTest.java +++ > b/src/test/java/net/sourceforge/cilib/entity/operators/crossover/UniformCro >ssoverStrategyTest.java @@ -84,7 +84,7 @@ public class > UniformCrossoverStrategyTest { > } > > @Override > - public Fitness getFitness(Individual entity, boolean count) { > + public Fitness getFitness(Individual entity) { > return InferiorFitness.instance(); > } > } > diff --git > a/src/test/java/net/sourceforge/cilib/moo/archive/constrained/ArchiveTest.j >ava > b/src/test/java/net/sourceforge/cilib/moo/archive/constrained/ArchiveTest.j >ava index a6cbc2a..8a1a84a 100644 > --- > a/src/test/java/net/sourceforge/cilib/moo/archive/constrained/ArchiveTest.j >ava +++ > b/src/test/java/net/sourceforge/cilib/moo/archive/constrained/ArchiveTest.j >ava @@ -234,29 +234,29 @@ public class ArchiveTest { > // and test if the fitness-value is correct. > Iterator<Vector> vectorIterator = testVectors.iterator(); > Vector testVector = vectorIterator.next(); > - MOFitness fitness = (MOFitness) problem.getFitness(testVector, > false); + MOFitness fitness = problem.getFitness(testVector); > assertThat(fitness.getDimension(), is(2)); > assertEquals(1.46361111111, fitness.getFitness(0).getValue(), > EPSILON); assertEquals(55, fitness.getFitness(1).getValue(), EPSILON); - > archive.addAll(Arrays.asList(new OptimisationSolution(testVector, > problem.getFitness(testVector, false)))); - > assertThat(archive.contains(new OptimisationSolution(testVector, > problem.getFitness(testVector, false))), is(true)); + > archive.addAll(Arrays.asList(new OptimisationSolution(testVector, > problem.getFitness(testVector)))); + assertThat(archive.contains(new > OptimisationSolution(testVector, problem.getFitness(testVector))), > is(true)); > > testVector = vectorIterator.next(); > - fitness = (MOFitness) problem.getFitness(testVector, false); > + fitness = problem.getFitness(testVector); > assertThat(fitness.getDimension(), is(2)); > assertEquals(0.491388888889, fitness.getFitness(0).getValue(), > EPSILON); assertEquals(90, fitness.getFitness(1).getValue(), EPSILON); - > archive.addAll(Arrays.asList(new OptimisationSolution(testVector, > problem.getFitness(testVector, false)))); - > assertThat(archive.contains(new OptimisationSolution(testVector, > problem.getFitness(testVector, false))), is(true)); + > archive.addAll(Arrays.asList(new OptimisationSolution(testVector, > problem.getFitness(testVector)))); + assertThat(archive.contains(new > OptimisationSolution(testVector, problem.getFitness(testVector))), > is(true)); assertThat(archive.size(), is(2)); > > testVector = vectorIterator.next(); > - fitness = (MOFitness) problem.getFitness(testVector, false); > + fitness = problem.getFitness(testVector); > assertThat(fitness.getDimension(), is(2)); > assertEquals(0.261797052154, fitness.getFitness(0).getValue(), > EPSILON); assertEquals(135, fitness.getFitness(1).getValue(), EPSILON); - > archive.addAll(Arrays.asList(new OptimisationSolution(testVector, > problem.getFitness(testVector, false)))); - > assertThat(archive.contains(new OptimisationSolution(testVector, > problem.getFitness(testVector, false))), is(true)); + > archive.addAll(Arrays.asList(new OptimisationSolution(testVector, > problem.getFitness(testVector)))); + assertThat(archive.contains(new > OptimisationSolution(testVector, problem.getFitness(testVector))), > is(true)); assertThat(archive.size(), is(3)); > > // After the archive size has been monitored continuously, insert > the exact same solutions into the archive again. @@ -264,9 +264,9 @@ public > class ArchiveTest { > vectorIterator = testVectors.iterator(); > while (vectorIterator.hasNext()) { > testVector = vectorIterator.next(); > - fitness = (MOFitness) problem.getFitness(testVector, false); > + fitness = problem.getFitness(testVector); > assertThat(fitness.getDimension(), is(2)); > - archive.addAll(Arrays.asList(new > OptimisationSolution(testVector, problem.getFitness(testVector, false)))); > + archive.addAll(Arrays.asList(new > OptimisationSolution(testVector, problem.getFitness(testVector)))); } > // Archive size must stay the same due to set-based behavior of > archive. assertThat(archive.size(), is(3)); > @@ -284,7 +284,7 @@ public class ArchiveTest { > DummyOptimisationProblem1 problem1 = new > DummyOptimisationProblem1(); Collection<Vector> testVectors = > createDummyVectors(); > for (Vector testVector : testVectors) { > - archive.addAll(Arrays.asList(new > OptimisationSolution(testVector, problem1.getFitness(testVector, false)))); > + archive.addAll(Arrays.asList(new > OptimisationSolution(testVector, problem1.getFitness(testVector)))); } > // Arhive size is now 3. > assertThat(archive.size(), is(3)); > @@ -296,13 +296,13 @@ public class ArchiveTest { > DummyOptimisationProblem2 problem2 = new > DummyOptimisationProblem2(); Iterator<Vector> vectorIterator = > testVectors.iterator(); Vector testVector = vectorIterator.next(); > - MOFitness fitness = (MOFitness) problem2.getFitness(testVector, > false); + MOFitness fitness = problem2.getFitness(testVector); > assertThat(fitness.getDimension(), is(2)); > assertEquals(2.92722222222, fitness.getFitness(0).getValue(), > EPSILON); assertEquals(110, fitness.getFitness(1).getValue(), EPSILON); > > // Then, check which solutions (corresponding to problem 1) > dominates the first external solution corresponding to problem 2. - > Collection<OptimisationSolution> dominantSolutions = archive.dominates(new > OptimisationSolution(testVector, problem2.getFitness(testVector, false))); > + Collection<OptimisationSolution> dominantSolutions = > archive.dominates(new OptimisationSolution(testVector, > problem2.getFitness(testVector))); assertThat(dominantSolutions.size(), > is(2)); > Iterator<OptimisationSolution> dominantIterator = > dominantSolutions.iterator(); > > @@ -323,22 +323,22 @@ public class ArchiveTest { > // solution with fitness (2.92722222222, 110) which is correct. > > // Finally, check that archive does not accept this solution. > - archive.addAll(Arrays.asList(new OptimisationSolution(testVector, > problem2.getFitness(testVector, false)))); + > archive.addAll(Arrays.asList(new OptimisationSolution(testVector, > problem2.getFitness(testVector)))); assertThat(archive.size(), is(3)); > - assertThat(archive.contains(new OptimisationSolution(testVector, > problem2.getFitness(testVector, false))), is(false)); + > assertThat(archive.contains(new OptimisationSolution(testVector, > problem2.getFitness(testVector))), is(false)); > > > > > // For the second vector (2,3,4,5,6) calculate the fitness in > terms of optimisation problem 2 and check it. testVector = > vectorIterator.next(); > - fitness = (MOFitness) problem2.getFitness(testVector, false); > + fitness = problem2.getFitness(testVector); > assertThat(fitness.getDimension(), is(2)); > assertEquals(0.982777777778, fitness.getFitness(0).getValue(), > EPSILON); assertEquals(180, fitness.getFitness(1).getValue(), EPSILON); > > // Now, check which solutions (corresponding to problem 1) > dominates the second external solution corresponding to problem 2. - > dominantSolutions = archive.dominates(new OptimisationSolution(testVector, > problem2.getFitness(testVector, false))); + dominantSolutions = > archive.dominates(new OptimisationSolution(testVector, > problem2.getFitness(testVector))); assertThat(dominantSolutions.size(), > is(2)); > dominantIterator = dominantSolutions.iterator(); > > @@ -359,22 +359,22 @@ public class ArchiveTest { > // solution with fitness (0.982777777778, 180) which is correct. > > // Finally, check that archive does not accept this solution. > - archive.addAll(Arrays.asList(new OptimisationSolution(testVector, > problem2.getFitness(testVector, false)))); + > archive.addAll(Arrays.asList(new OptimisationSolution(testVector, > problem2.getFitness(testVector)))); assertThat(archive.size(), is(3)); > - assertThat(archive.contains(new OptimisationSolution(testVector, > problem2.getFitness(testVector, false))), is(false)); + > assertThat(archive.contains(new OptimisationSolution(testVector, > problem2.getFitness(testVector))), is(false)); > > > > > // For the third vector (3,4,5,6,7) calculate the fitness in terms > of optimisation problem 2 and check it. testVector = vectorIterator.next(); > - fitness = (MOFitness) problem2.getFitness(testVector, false); > + fitness = problem2.getFitness(testVector); > assertThat(fitness.getDimension(), is(2)); > assertEquals(0.523594104308, fitness.getFitness(0).getValue(), > EPSILON); assertEquals(270, fitness.getFitness(1).getValue(), EPSILON); > > // Now, check which solutions (corresponding to problem 1) > dominates the second solution corresponding to problem 2. - > dominantSolutions = archive.dominates(new OptimisationSolution(testVector, > problem2.getFitness(testVector, false))); + dominantSolutions = > archive.dominates(new OptimisationSolution(testVector, > problem2.getFitness(testVector))); assertThat(dominantSolutions.size(), > is(2)); > dominantIterator = dominantSolutions.iterator(); > > @@ -395,9 +395,9 @@ public class ArchiveTest { > // solution with fitness (0.523594104308, 270) which is correct. > > // Finally, check that archive does not accept this solution. > - archive.addAll(Arrays.asList(new OptimisationSolution(testVector, > problem2.getFitness(testVector, false)))); + > archive.addAll(Arrays.asList(new OptimisationSolution(testVector, > problem2.getFitness(testVector)))); assertThat(archive.size(), is(3)); > - assertThat(archive.contains(new OptimisationSolution(testVector, > problem2.getFitness(testVector, false))), is(false)); + > assertThat(archive.contains(new OptimisationSolution(testVector, > problem2.getFitness(testVector))), is(false)); } > > /** > @@ -413,7 +413,7 @@ public class ArchiveTest { > DummyOptimisationProblem2 problem2 = new > DummyOptimisationProblem2(); Collection<Vector> testVectors = > createDummyVectors(); > for (Vector testVector : testVectors) { > - archive.addAll(Arrays.asList(new > OptimisationSolution(testVector, problem2.getFitness(testVector, false)))); > + archive.addAll(Arrays.asList(new > OptimisationSolution(testVector, problem2.getFitness(testVector)))); } > // Arhive size is now 3. > assertThat(archive.size(), is(3)); > @@ -425,13 +425,13 @@ public class ArchiveTest { > DummyOptimisationProblem1 problem1 = new > DummyOptimisationProblem1(); Iterator<Vector> vectorIterator = > testVectors.iterator(); Vector testVector = vectorIterator.next(); > - MOFitness fitness = (MOFitness) problem1.getFitness(testVector, > false); + MOFitness fitness = problem1.getFitness(testVector); > assertThat(fitness.getDimension(), is(2)); > assertEquals(1.46361111111, fitness.getFitness(0).getValue(), > EPSILON); assertEquals(55, fitness.getFitness(1).getValue(), EPSILON); > > // Then, check which solutions (corresponding to problem 2) is > dominated by the first external solution corresponding to problem 1. - > Collection<OptimisationSolution> dominatedSolutions = > archive.isDominatedBy(new OptimisationSolution(testVector, > problem1.getFitness(testVector, false))); + > Collection<OptimisationSolution> dominatedSolutions = > archive.isDominatedBy(new OptimisationSolution(testVector, > problem1.getFitness(testVector))); assertThat(dominatedSolutions.size(), > is(1)); > Iterator<OptimisationSolution> dominatedIterator = > dominatedSolutions.iterator(); > > @@ -445,10 +445,10 @@ public class ArchiveTest { > // Thus, no more solutions in archive is dominated by this > external solution. > > // Now, insert this external solution and it should replace > abovementioned dominated solution. - > archive.addAll(Arrays.asList(new OptimisationSolution(testVector, > problem1.getFitness(testVector, false)))); + > archive.addAll(Arrays.asList(new OptimisationSolution(testVector, > problem1.getFitness(testVector)))); assertThat(archive.size(), is(3)); > assertThat(archive.contains(dominatedSolution), is(false)); > - assertThat(archive.contains(new OptimisationSolution(testVector, > problem1.getFitness(testVector, false))), is(true)); + > assertThat(archive.contains(new OptimisationSolution(testVector, > problem1.getFitness(testVector))), is(true)); > > // -- Arhive contains (0.982777777778, 180); (0.523594104308, > 270); new --> (1.46361111111, 55) <-- new; > > @@ -457,13 +457,13 @@ public class ArchiveTest { > > // For the second vector (2,3,4,5,6) calculate the fitness in > terms of optimisation problem 1 and check it. testVector = > vectorIterator.next(); > - fitness = (MOFitness) problem1.getFitness(testVector, false); > + fitness = problem1.getFitness(testVector); > assertThat(fitness.getDimension(), is(2)); > assertEquals(0.491388888889, fitness.getFitness(0).getValue(), > EPSILON); assertEquals(90, fitness.getFitness(1).getValue(), EPSILON); > > // Then, check which solutions (corresponding to problem 2) is > dominated by the second external solution corresponding to problem 1. - > dominatedSolutions = archive.isDominatedBy(new > OptimisationSolution(testVector, problem1.getFitness(testVector, false))); > + dominatedSolutions = archive.isDominatedBy(new > OptimisationSolution(testVector, problem1.getFitness(testVector))); > assertThat(dominatedSolutions.size(), is(2)); > dominatedIterator = dominatedSolutions.iterator(); > > @@ -480,11 +480,11 @@ public class ArchiveTest { > assertEquals(270, ((MOFitness) > dominatedSolution2.getFitness()).getFitness(1).getValue(), EPSILON); > > // Now, insert this external solution and it should replace both > of the abovementioned dominated solutions. - > archive.addAll(Arrays.asList(new OptimisationSolution(testVector, > problem1.getFitness(testVector, false)))); + > archive.addAll(Arrays.asList(new OptimisationSolution(testVector, > problem1.getFitness(testVector)))); assertThat(archive.size(), is(2)); > assertThat(archive.contains(dominatedSolution1), is(false)); > assertThat(archive.contains(dominatedSolution2), is(false)); > - assertThat(archive.contains(new OptimisationSolution(testVector, > problem1.getFitness(testVector, false))), is(true)); + > assertThat(archive.contains(new OptimisationSolution(testVector, > problem1.getFitness(testVector))), is(true)); > > // -- Arhive contains (1.46361111111, 55); new --> > (0.491388888889, 90) <-- new; > > @@ -493,19 +493,19 @@ public class ArchiveTest { > > // For the third vector (3,4,5,6,7) calculate the fitness in terms > of optimisation problem 1 and check it. testVector = vectorIterator.next(); > - fitness = (MOFitness) problem1.getFitness(testVector, false); > + fitness = problem1.getFitness(testVector); > assertThat(fitness.getDimension(), is(2)); > assertEquals(0.261797052154, fitness.getFitness(0).getValue(), > EPSILON); assertEquals(135, fitness.getFitness(1).getValue(), EPSILON); > > // Then, check which solutions (corresponding to problem 2) is > dominated by the second external solution corresponding to problem 1. - > dominatedSolutions = archive.isDominatedBy(new > OptimisationSolution(testVector, problem1.getFitness(testVector, false))); > + dominatedSolutions = archive.isDominatedBy(new > OptimisationSolution(testVector, problem1.getFitness(testVector))); > assertThat(dominatedSolutions.size(), is(0)); // No solutions dominate > external solution. > > // Now, insert this external solution and it should be accepted in > archive and not replace any other solution. - > archive.addAll(Arrays.asList(new OptimisationSolution(testVector, > problem1.getFitness(testVector, false)))); + > archive.addAll(Arrays.asList(new OptimisationSolution(testVector, > problem1.getFitness(testVector)))); assertThat(archive.size(), is(3)); > - assertThat(archive.contains(new OptimisationSolution(testVector, > problem1.getFitness(testVector, false))), is(true)); + > assertThat(archive.contains(new OptimisationSolution(testVector, > problem1.getFitness(testVector))), is(true)); > > // -- Archive contains (1.46361111111, 55); (0.491388888889, 90); > (0.261797052154, 135); } > diff --git > a/src/test/java/net/sourceforge/cilib/moo/archive/constrained/ConstrainedAr >chiveTest.java > b/src/test/java/net/sourceforge/cilib/moo/archive/constrained/ConstrainedAr >chiveTest.java index 05b3737..8a8491f 100644 > --- > a/src/test/java/net/sourceforge/cilib/moo/archive/constrained/ConstrainedAr >chiveTest.java +++ > b/src/test/java/net/sourceforge/cilib/moo/archive/constrained/ConstrainedAr >chiveTest.java @@ -190,7 +190,7 @@ public class ConstrainedArchiveTest { > for (int j = i; j < i + 5; ++j) { > vector.add(new Real(j)); > } > - archive.addAll(Arrays.asList(new OptimisationSolution(vector, > problem.getFitness(vector, false)))); + > archive.addAll(Arrays.asList(new OptimisationSolution(vector, > problem.getFitness(vector)))); } > assertThat(archive.size(), is(100)); > archive.clear(); > @@ -201,7 +201,7 @@ public class ConstrainedArchiveTest { > for (int j = i; j < i + 5; ++j) { > vector.add(new Real(j)); > } > - solutions.add(new OptimisationSolution(vector, > problem.getFitness(vector, false))); + solutions.add(new > OptimisationSolution(vector, problem.getFitness(vector))); } > archive.addAll(solutions); > assertThat(archive.size(), is(100)); > diff --git > a/src/test/java/net/sourceforge/cilib/moo/archive/solutionweighing/Solution >WeighingTest.java > b/src/test/java/net/sourceforge/cilib/moo/archive/solutionweighing/Solution >WeighingTest.java index ae30953..9d2ef20 100644 > --- > a/src/test/java/net/sourceforge/cilib/moo/archive/solutionweighing/Solution >WeighingTest.java +++ > b/src/test/java/net/sourceforge/cilib/moo/archive/solutionweighing/Solution >WeighingTest.java @@ -72,7 +72,7 @@ public class SolutionWeighingTest { > } > > @Override > - public Fitness getFitness(Type solution, boolean count) { > + public Fitness getFitness(Type solution) { > Vector position = (Vector) solution; > return new MinimisationFitness(position.getReal(index)); > } > @@ -123,27 +123,27 @@ public class SolutionWeighingTest { > Vector position = new Vector(); > position.add(new Real(1)); > position.add(new Real(1)); > - solutions.add(new OptimisationSolution(position, > moProblem.getFitness(position, false))); + solutions.add(new > OptimisationSolution(position, moProblem.getFitness(position))); > > position = new Vector(); > position.add(new Real(2)); > position.add(new Real(4)); > - solutions.add(new OptimisationSolution(position, > moProblem.getFitness(position, false))); + solutions.add(new > OptimisationSolution(position, moProblem.getFitness(position))); > > position = new Vector(); > position.add(new Real(3)); > position.add(new Real(2)); > - solutions.add(new OptimisationSolution(position, > moProblem.getFitness(position, false))); + solutions.add(new > OptimisationSolution(position, moProblem.getFitness(position))); > > position = new Vector(); > position.add(new Real(4)); > position.add(new Real(6)); > - solutions.add(new OptimisationSolution(position, > moProblem.getFitness(position, false))); + solutions.add(new > OptimisationSolution(position, moProblem.getFitness(position))); > > position = new Vector(); > position.add(new Real(5)); > position.add(new Real(1)); > - solutions.add(new OptimisationSolution(position, > moProblem.getFitness(position, false))); + solutions.add(new > OptimisationSolution(position, moProblem.getFitness(position))); } > > @Test > diff --git a/src/test/java/net/sourceforge/cilib/problem/MOFitnessTest.java > b/src/test/java/net/sourceforge/cilib/problem/MOFitnessTest.java index > 407bc25..ae5d5d5 100644 > --- a/src/test/java/net/sourceforge/cilib/problem/MOFitnessTest.java > +++ b/src/test/java/net/sourceforge/cilib/problem/MOFitnessTest.java > @@ -56,8 +56,8 @@ public class MOFitnessTest { > new MinimisationFitness(new Integer(1).doubleValue()), > new MinimisationFitness(new Integer(1).doubleValue())}; > > - Fitness f1 = moproblem.getFitness(inferior, false); > - Fitness f2 = moproblem.getFitness(oneFitness, false); > + Fitness f1 = moproblem.getFitness(inferior); > + Fitness f2 = moproblem.getFitness(oneFitness); > > assertTrue(f1.compareTo(f2) < 0); > assertTrue(f2.compareTo(f1) > 0); > @@ -80,14 +80,10 @@ public class MOFitnessTest { > } > > @Override > - public Fitness getFitness(Type solution, boolean count) { > + public Fitness getFitness(Type solution) { > return (Fitness) solution; > } > > - public Fitness getFitness(Type[] solution, boolean count) { > - return (Fitness) solution[i]; > - } > - > @Override > public int getFitnessEvaluations() { > return 0; |
From: Gary P. <gpa...@gm...> - 2009-07-31 07:56:47
|
When the fitness is determined from the problem, the number of fitness evaluations must be incremented. Signed-off-by: Gary Pampara <gpa...@gm...> --- .../algorithm/MultistartOptimisationAlgorithm.java | 2 +- .../net/sourceforge/cilib/boa/bee/AbstractBee.java | 2 +- .../cilib/clustering/kmeans/KMeans.java | 6 +- .../cilib/cooperative/CooperativeEntity.java | 9 +-- .../SelectiveContributionUpdateStrategy.java | 2 +- .../java/net/sourceforge/cilib/ec/Individual.java | 2 +- .../java/net/sourceforge/cilib/entity/Harmony.java | 2 +- .../criterion/CriterionBasedMOProblemAdapter.java | 2 +- .../ArchivingIterationStrategy.java | 4 +- .../foundation/NeuralNetworkProblem.java | 7 +- .../CooperativeOptimisationProblemAdapter.java | 2 +- .../net/sourceforge/cilib/problem/MOFitness.java | 8 +- .../cilib/problem/MOOptimisationProblem.java | 12 ++-- .../cilib/problem/OptimisationProblem.java | 3 +- .../cilib/problem/OptimisationProblemAdapter.java | 6 +- .../cilib/pso/dynamic/DynamicParticle.java | 2 +- .../RandomSentryDetectionStrategy.java | 2 +- .../ArchiveReevaluationResponseStrategy.java | 4 +- ...lutionParticleReevaluationResponseStrategy.java | 2 +- .../DominantGuideUpdateStrategy.java | 4 +- .../cilib/pso/particle/MultiObjectiveParticle.java | 2 +- .../cilib/pso/particle/StandardParticle.java | 2 +- .../DEPositionUpdateStrategy.java | 4 +- .../GCVelocityUpdateStrategy.java | 2 +- .../calculator/EntityBasedFitnessCalculator.java | 6 +- .../cilib/util/calculator/FitnessCalculator.java | 4 +- .../calculator/PropertyBasedFitnessCalculator.java | 4 +- .../StructuredTypeFitnessCalculator.java | 4 +- .../crossover/BlendCrossoverStrategyTest.java | 2 +- .../crossover/OnePointCrossoverStrategyTest.java | 2 +- .../crossover/UniformCrossoverStrategyTest.java | 2 +- .../cilib/moo/archive/constrained/ArchiveTest.java | 74 ++++++++++---------- .../constrained/ConstrainedArchiveTest.java | 4 +- .../solutionweighing/SolutionWeighingTest.java | 12 ++-- .../sourceforge/cilib/problem/MOFitnessTest.java | 10 +-- 35 files changed, 104 insertions(+), 113 deletions(-) diff --git a/src/main/java/net/sourceforge/cilib/algorithm/MultistartOptimisationAlgorithm.java b/src/main/java/net/sourceforge/cilib/algorithm/MultistartOptimisationAlgorithm.java index 0ed1bc5..8ef8f51 100644 --- a/src/main/java/net/sourceforge/cilib/algorithm/MultistartOptimisationAlgorithm.java +++ b/src/main/java/net/sourceforge/cilib/algorithm/MultistartOptimisationAlgorithm.java @@ -251,7 +251,7 @@ public class MultistartOptimisationAlgorithm extends Algorithm implements Partic * @see net.sourceforge.cilib.Problem.OptimisationProblemAdapter#calculateFitness(java.lang.Object) */ protected Fitness calculateFitness(Type solution) { - return target.getFitness(solution, true); + return target.getFitness(solution); } public void resetFitnessCounter() { diff --git a/src/main/java/net/sourceforge/cilib/boa/bee/AbstractBee.java b/src/main/java/net/sourceforge/cilib/boa/bee/AbstractBee.java index ceea52b..2f4e1ab 100644 --- a/src/main/java/net/sourceforge/cilib/boa/bee/AbstractBee.java +++ b/src/main/java/net/sourceforge/cilib/boa/bee/AbstractBee.java @@ -97,7 +97,7 @@ public abstract class AbstractBee extends AbstractEntity implements HoneyBee { */ @Override public void calculateFitness() { - this.getProperties().put(EntityType.FITNESS, getFitnessCalculator().getFitness(this, true)); + this.getProperties().put(EntityType.FITNESS, getFitnessCalculator().getFitness(this)); } /** diff --git a/src/main/java/net/sourceforge/cilib/clustering/kmeans/KMeans.java b/src/main/java/net/sourceforge/cilib/clustering/kmeans/KMeans.java index d4fd66c..8f85a73 100644 --- a/src/main/java/net/sourceforge/cilib/clustering/kmeans/KMeans.java +++ b/src/main/java/net/sourceforge/cilib/clustering/kmeans/KMeans.java @@ -73,7 +73,7 @@ public class KMeans extends SingularAlgorithm { /** * Create a copy of the provided instance. - * @param rhs The instance to copy. + * @param copy The instance to copy. */ public KMeans(KMeans copy) { super(copy); @@ -105,7 +105,7 @@ public class KMeans extends SingularAlgorithm { */ @Override public void algorithmIteration() { - calculator.getFitness(centroids, true); + calculator.getFitness(centroids); // the fitness calculation step already arranged the clusters and centroids for us ClusteringUtils helper = ClusteringUtils.get(); @@ -163,7 +163,7 @@ public class KMeans extends SingularAlgorithm { */ @Override public OptimisationSolution getBestSolution() { - return new OptimisationSolution(centroids.getClone(), getOptimisationProblem().getFitness(centroids, false)); + return new OptimisationSolution(centroids.getClone(), getOptimisationProblem().getFitness(centroids)); } /** diff --git a/src/main/java/net/sourceforge/cilib/cooperative/CooperativeEntity.java b/src/main/java/net/sourceforge/cilib/cooperative/CooperativeEntity.java index 4ae1f95..640c41d 100644 --- a/src/main/java/net/sourceforge/cilib/cooperative/CooperativeEntity.java +++ b/src/main/java/net/sourceforge/cilib/cooperative/CooperativeEntity.java @@ -29,7 +29,6 @@ import net.sourceforge.cilib.problem.OptimisationProblem; import net.sourceforge.cilib.type.types.Numeric; import net.sourceforge.cilib.type.types.Type; import net.sourceforge.cilib.type.types.container.StructuredType; -import net.sourceforge.cilib.type.types.container.TypeList; import net.sourceforge.cilib.type.types.container.Vector; /** @@ -52,6 +51,7 @@ public class CooperativeEntity extends AbstractEntity { fitness = rhs.fitness; } + @Override public CooperativeEntity getClone() { return new CooperativeEntity(this); } @@ -137,11 +137,8 @@ public class CooperativeEntity extends AbstractEntity { throw new UnsupportedOperationException("Methd not implemented"); } + @Override public void calculateFitness() { - calculateFitness(true); - } - - public void calculateFitness(boolean count) { - fitness = getFitnessCalculator().getFitness(this, count); + fitness = getFitnessCalculator().getFitness(this); } } diff --git a/src/main/java/net/sourceforge/cilib/cooperative/contributionupdatestrategies/SelectiveContributionUpdateStrategy.java b/src/main/java/net/sourceforge/cilib/cooperative/contributionupdatestrategies/SelectiveContributionUpdateStrategy.java index 5452c99..ddf5bef 100644 --- a/src/main/java/net/sourceforge/cilib/cooperative/contributionupdatestrategies/SelectiveContributionUpdateStrategy.java +++ b/src/main/java/net/sourceforge/cilib/cooperative/contributionupdatestrategies/SelectiveContributionUpdateStrategy.java @@ -38,7 +38,7 @@ public class SelectiveContributionUpdateStrategy implements ContributionUpdateSt dstTest.update(src, srcPos, dstPos, length); // calculate new fitness of updated clone - dstTest.calculateFitness(false); + dstTest.calculateFitness(); // if updated clone is better than original context, update context if(dstTest.compareTo(dst) > 0) { diff --git a/src/main/java/net/sourceforge/cilib/ec/Individual.java b/src/main/java/net/sourceforge/cilib/ec/Individual.java index c1ea82f..c6373e0 100644 --- a/src/main/java/net/sourceforge/cilib/ec/Individual.java +++ b/src/main/java/net/sourceforge/cilib/ec/Individual.java @@ -145,7 +145,7 @@ public class Individual extends AbstractEntity { */ @Override public void calculateFitness() { - this.getProperties().put(EntityType.FITNESS, this.getFitnessCalculator().getFitness(this, true)); + this.getProperties().put(EntityType.FITNESS, this.getFitnessCalculator().getFitness(this)); } /** diff --git a/src/main/java/net/sourceforge/cilib/entity/Harmony.java b/src/main/java/net/sourceforge/cilib/entity/Harmony.java index 85fe665..6b21457 100644 --- a/src/main/java/net/sourceforge/cilib/entity/Harmony.java +++ b/src/main/java/net/sourceforge/cilib/entity/Harmony.java @@ -80,7 +80,7 @@ public class Harmony extends AbstractEntity { */ @Override public void calculateFitness() { - Fitness fitness = getFitnessCalculator().getFitness(this, true); + Fitness fitness = getFitnessCalculator().getFitness(this); this.getProperties().put(EntityType.FITNESS, fitness); } diff --git a/src/main/java/net/sourceforge/cilib/moo/criterion/CriterionBasedMOProblemAdapter.java b/src/main/java/net/sourceforge/cilib/moo/criterion/CriterionBasedMOProblemAdapter.java index e2687c0..c0c23ff 100644 --- a/src/main/java/net/sourceforge/cilib/moo/criterion/CriterionBasedMOProblemAdapter.java +++ b/src/main/java/net/sourceforge/cilib/moo/criterion/CriterionBasedMOProblemAdapter.java @@ -83,7 +83,7 @@ public class CriterionBasedMOProblemAdapter extends OptimisationProblemAdapter { @Override protected Fitness calculateFitness(Type solution) { - return this.problem.getFitness(this.activeIndex, solution, true); + return this.problem.getFitness(this.activeIndex, solution); } @Override diff --git a/src/main/java/net/sourceforge/cilib/moo/iterationstrategies/ArchivingIterationStrategy.java b/src/main/java/net/sourceforge/cilib/moo/iterationstrategies/ArchivingIterationStrategy.java index f8e38ff..124747d 100644 --- a/src/main/java/net/sourceforge/cilib/moo/iterationstrategies/ArchivingIterationStrategy.java +++ b/src/main/java/net/sourceforge/cilib/moo/iterationstrategies/ArchivingIterationStrategy.java @@ -72,12 +72,12 @@ public class ArchivingIterationStrategy<E extends PopulationBasedAlgorithm> impl } protected void updateArchive(Topology<? extends Entity> population) { - Algorithm topLevelAlgorithm = (Algorithm) Algorithm.getAlgorithmList().get(0); + Algorithm topLevelAlgorithm = Algorithm.getAlgorithmList().get(0); List<OptimisationSolution> optimisationSolutions = new ArrayList<OptimisationSolution>(); for (Entity entity : population) { Type solution = entity.getCandidateSolution().getClone(); optimisationSolutions.add(new OptimisationSolution(solution, - topLevelAlgorithm.getOptimisationProblem().getFitness(solution, false))); + topLevelAlgorithm.getOptimisationProblem().getFitness(solution))); } Archive.get().addAll(optimisationSolutions); } diff --git a/src/main/java/net/sourceforge/cilib/neuralnetwork/foundation/NeuralNetworkProblem.java b/src/main/java/net/sourceforge/cilib/neuralnetwork/foundation/NeuralNetworkProblem.java index 8f54433..de82adf 100644 --- a/src/main/java/net/sourceforge/cilib/neuralnetwork/foundation/NeuralNetworkProblem.java +++ b/src/main/java/net/sourceforge/cilib/neuralnetwork/foundation/NeuralNetworkProblem.java @@ -76,11 +76,10 @@ public class NeuralNetworkProblem implements OptimisationProblem, Initializable return evaluationStrategy.evaluate(p); } - public Fitness getFitness(Type solution, boolean count) { + @Override + public Fitness getFitness(Type solution) { + ++fitnessEvaluations; - if (count) { - ++fitnessEvaluations; - } this.getTopology().setWeights((Vector) solution); //Defaults to first error element as the main fitness... diff --git a/src/main/java/net/sourceforge/cilib/problem/CooperativeOptimisationProblemAdapter.java b/src/main/java/net/sourceforge/cilib/problem/CooperativeOptimisationProblemAdapter.java index 316d620..42ed4ab 100644 --- a/src/main/java/net/sourceforge/cilib/problem/CooperativeOptimisationProblemAdapter.java +++ b/src/main/java/net/sourceforge/cilib/problem/CooperativeOptimisationProblemAdapter.java @@ -111,7 +111,7 @@ public class CooperativeOptimisationProblemAdapter extends OptimisationProblemAd for (int i = 0; i < dimension; ++i) { ((Vector) context.getCandidateSolution()).setReal(offset + i, participant.getReal(i)); } - return problem.getFitness(context.getCandidateSolution(), true); + return problem.getFitness(context.getCandidateSolution()); } public DomainRegistry getDomain() { diff --git a/src/main/java/net/sourceforge/cilib/problem/MOFitness.java b/src/main/java/net/sourceforge/cilib/problem/MOFitness.java index a6144a6..4edfc45 100644 --- a/src/main/java/net/sourceforge/cilib/problem/MOFitness.java +++ b/src/main/java/net/sourceforge/cilib/problem/MOFitness.java @@ -34,19 +34,19 @@ public class MOFitness implements Fitness { private static final long serialVersionUID = 1477723759384827131L; private Fitness[] fitnesses; - public MOFitness(MOOptimisationProblem problem, Type[] solution, boolean count) { + public MOFitness(MOOptimisationProblem problem, Type[] solution) { int size = problem.size(); fitnesses = new Fitness[size]; for (int i = 0; i < size; ++i) { - fitnesses[i] = problem.getFitness(i, solution[i], count); + fitnesses[i] = problem.getFitness(i, solution[i]); } } - public MOFitness(MOOptimisationProblem problem, Type solution, boolean count) { + public MOFitness(MOOptimisationProblem problem, Type solution) { int size = problem.size(); fitnesses = new Fitness[size]; for (int i = 0; i < size; ++i) { - fitnesses[i] = problem.getFitness(i, solution, count); + fitnesses[i] = problem.getFitness(i, solution); } } diff --git a/src/main/java/net/sourceforge/cilib/problem/MOOptimisationProblem.java b/src/main/java/net/sourceforge/cilib/problem/MOOptimisationProblem.java index 54b4b4a..ccc139f 100644 --- a/src/main/java/net/sourceforge/cilib/problem/MOOptimisationProblem.java +++ b/src/main/java/net/sourceforge/cilib/problem/MOOptimisationProblem.java @@ -56,17 +56,17 @@ public class MOOptimisationProblem implements OptimisationProblem, List<Optimisa return new MOOptimisationProblem(this); } - public MOFitness getFitness(Type[] solutions, boolean count) { - return new MOFitness(this, solutions, count); + public MOFitness getFitness(Type[] solutions) { + return new MOFitness(this, solutions); } @Override - public MOFitness getFitness(Type solution, boolean count) { - return new MOFitness(this, solution, count); + public MOFitness getFitness(Type solution) { + return new MOFitness(this, solution); } - public Fitness getFitness(int index, Type solution, boolean count) { - return problems.get(index).getFitness(solution, count); + public Fitness getFitness(int index, Type solution) { + return problems.get(index).getFitness(solution); } @Override diff --git a/src/main/java/net/sourceforge/cilib/problem/OptimisationProblem.java b/src/main/java/net/sourceforge/cilib/problem/OptimisationProblem.java index a5437c2..454aaa9 100644 --- a/src/main/java/net/sourceforge/cilib/problem/OptimisationProblem.java +++ b/src/main/java/net/sourceforge/cilib/problem/OptimisationProblem.java @@ -53,10 +53,9 @@ public interface OptimisationProblem extends Problem { * falls outside the search space of this problem. * * @param solution The potential solution found by the optimisation algorithm. - * @param count True if this call should contribute to the fitness evaluation count, see {@link #getFitnessEvaluations()}. * @return The fitness of the solution. */ - public Fitness getFitness(Type solution, boolean count); + public Fitness getFitness(Type solution); /** * Returns the number of times the underlying fitness function has been evaluated. diff --git a/src/main/java/net/sourceforge/cilib/problem/OptimisationProblemAdapter.java b/src/main/java/net/sourceforge/cilib/problem/OptimisationProblemAdapter.java index 1b2e37d..aa7288d 100644 --- a/src/main/java/net/sourceforge/cilib/problem/OptimisationProblemAdapter.java +++ b/src/main/java/net/sourceforge/cilib/problem/OptimisationProblemAdapter.java @@ -72,10 +72,8 @@ public abstract class OptimisationProblemAdapter implements OptimisationProblem /** * {@inheritDoc} */ - public final Fitness getFitness(Type solution, boolean count) { - if (count) { - fitnessEvaluations.incrementAndGet(); - } + public final Fitness getFitness(Type solution) { + fitnessEvaluations.incrementAndGet(); if (this.changeStrategy.shouldApply(this)) changeEnvironment(); diff --git a/src/main/java/net/sourceforge/cilib/pso/dynamic/DynamicParticle.java b/src/main/java/net/sourceforge/cilib/pso/dynamic/DynamicParticle.java index efa583e..a69ac96 100644 --- a/src/main/java/net/sourceforge/cilib/pso/dynamic/DynamicParticle.java +++ b/src/main/java/net/sourceforge/cilib/pso/dynamic/DynamicParticle.java @@ -52,7 +52,7 @@ public class DynamicParticle extends StandardParticle { * Re-evaluate both best and current position of the particle. */ public void reevaluate() { - this.getProperties().put(EntityType.Particle.BEST_FITNESS, getFitnessCalculator().getFitness(this, true)); + this.getProperties().put(EntityType.Particle.BEST_FITNESS, getFitnessCalculator().getFitness(this)); this.calculateFitness(); } } diff --git a/src/main/java/net/sourceforge/cilib/pso/dynamic/detectionstrategies/RandomSentryDetectionStrategy.java b/src/main/java/net/sourceforge/cilib/pso/dynamic/detectionstrategies/RandomSentryDetectionStrategy.java index 11f0fb3..95387a7 100644 --- a/src/main/java/net/sourceforge/cilib/pso/dynamic/detectionstrategies/RandomSentryDetectionStrategy.java +++ b/src/main/java/net/sourceforge/cilib/pso/dynamic/detectionstrategies/RandomSentryDetectionStrategy.java @@ -79,7 +79,7 @@ public class RandomSentryDetectionStrategy<E extends PopulationBasedAlgorithm> e for (Entity nextSentry : sentryList) { double oldSentryFitness = nextSentry.getFitness().getValue(); nextSentry.calculateFitness(); - double newSentryFitness = algorithm.getOptimisationProblem().getFitness(nextSentry.getCandidateSolution(), false).getValue(); + double newSentryFitness = algorithm.getOptimisationProblem().getFitness(nextSentry.getCandidateSolution()).getValue(); if(Math.abs(oldSentryFitness - newSentryFitness) >= theta) { envChangeOccured = true; diff --git a/src/main/java/net/sourceforge/cilib/pso/dynamic/responsestrategies/ArchiveReevaluationResponseStrategy.java b/src/main/java/net/sourceforge/cilib/pso/dynamic/responsestrategies/ArchiveReevaluationResponseStrategy.java index 10db1e8..cce4afd 100644 --- a/src/main/java/net/sourceforge/cilib/pso/dynamic/responsestrategies/ArchiveReevaluationResponseStrategy.java +++ b/src/main/java/net/sourceforge/cilib/pso/dynamic/responsestrategies/ArchiveReevaluationResponseStrategy.java @@ -46,7 +46,7 @@ public class ArchiveReevaluationResponseStrategy extends EnvironmentChangeRespon @Override protected void performReaction(PopulationBasedAlgorithm algorithm) { for (Entity entity : algorithm.getTopology()) { - entity.getProperties().put(EntityType.Particle.BEST_FITNESS, entity.getFitnessCalculator().getFitness(entity, true)); + entity.getProperties().put(EntityType.Particle.BEST_FITNESS, entity.getFitnessCalculator().getFitness(entity)); //entity.getProperties().put(EntityType.Particle.BEST_POSITION, entity.getCandidateSolution()); entity.calculateFitness(); } @@ -56,7 +56,7 @@ public class ArchiveReevaluationResponseStrategy extends EnvironmentChangeRespon List<OptimisationSolution> newList = new LinkedList<OptimisationSolution>(); for (OptimisationSolution solution : Archive.get()) { - OptimisationSolution os = new OptimisationSolution(solution.getPosition(), problem.getFitness(solution.getPosition(), false)); + OptimisationSolution os = new OptimisationSolution(solution.getPosition(), problem.getFitness(solution.getPosition())); newList.add(os); } diff --git a/src/main/java/net/sourceforge/cilib/pso/dynamic/responsestrategies/CompetitiveCoevolutionParticleReevaluationResponseStrategy.java b/src/main/java/net/sourceforge/cilib/pso/dynamic/responsestrategies/CompetitiveCoevolutionParticleReevaluationResponseStrategy.java index f3140f8..15c0b15 100644 --- a/src/main/java/net/sourceforge/cilib/pso/dynamic/responsestrategies/CompetitiveCoevolutionParticleReevaluationResponseStrategy.java +++ b/src/main/java/net/sourceforge/cilib/pso/dynamic/responsestrategies/CompetitiveCoevolutionParticleReevaluationResponseStrategy.java @@ -70,7 +70,7 @@ public class CompetitiveCoevolutionParticleReevaluationResponseStrategy<E extend Blackboard<Enum<?>, Type> blackboard = new Blackboard<Enum<?>, Type>(); blackboard.put(EntityType.CANDIDATE_SOLUTION, ((AbstractParticle)e).getBestPosition()); blackboard.put(EntityType.Coevolution.BOARD, new EntityScoreboard()); - Fitness val = currentAlgorithm.getOptimisationProblem().getFitness(blackboard, false); + Fitness val = currentAlgorithm.getOptimisationProblem().getFitness(blackboard); e.getProperties().put(EntityType.Particle.BEST_FITNESS, val); //if currentV is better than re-evaluated pBest, then replace it if (e.getFitness().compareTo(e.getBestFitness()) > 0) { diff --git a/src/main/java/net/sourceforge/cilib/pso/moo/guideupdatestrategies/DominantGuideUpdateStrategy.java b/src/main/java/net/sourceforge/cilib/pso/moo/guideupdatestrategies/DominantGuideUpdateStrategy.java index 22d529e..fccbd7d 100644 --- a/src/main/java/net/sourceforge/cilib/pso/moo/guideupdatestrategies/DominantGuideUpdateStrategy.java +++ b/src/main/java/net/sourceforge/cilib/pso/moo/guideupdatestrategies/DominantGuideUpdateStrategy.java @@ -56,8 +56,8 @@ public class DominantGuideUpdateStrategy implements GuideUpdateStrategy { Vector previousGuide = (Vector) particle.getProperties().get(guideType); Algorithm topLevelAlgorithm = Algorithm.getAlgorithmList().get(0); OptimisationProblem problem = topLevelAlgorithm.getOptimisationProblem(); - Fitness currentFitness = problem.getFitness(newGuide, false); - if (previousGuide == null || currentFitness.compareTo(problem.getFitness(previousGuide, false)) > 0) { + Fitness currentFitness = problem.getFitness(newGuide); + if (previousGuide == null || currentFitness.compareTo(problem.getFitness(previousGuide)) > 0) { particle.getProperties().put(guideType, newGuide); } } diff --git a/src/main/java/net/sourceforge/cilib/pso/particle/MultiObjectiveParticle.java b/src/main/java/net/sourceforge/cilib/pso/particle/MultiObjectiveParticle.java index 272f0ab..cc66ed5 100644 --- a/src/main/java/net/sourceforge/cilib/pso/particle/MultiObjectiveParticle.java +++ b/src/main/java/net/sourceforge/cilib/pso/particle/MultiObjectiveParticle.java @@ -33,7 +33,7 @@ public class MultiObjectiveParticle extends StandardParticle { private static final long serialVersionUID = 2449622504036301616L; public void setBestPosition(Type bestPosition) { - Fitness bestPositionFitness = Algorithm.get().getOptimisationProblem().getFitness(bestPosition, false); + Fitness bestPositionFitness = Algorithm.get().getOptimisationProblem().getFitness(bestPosition); this.getProperties().put(EntityType.Particle.BEST_POSITION, bestPosition.getClone()); this.getProperties().put(EntityType.Particle.BEST_FITNESS, bestPositionFitness); diff --git a/src/main/java/net/sourceforge/cilib/pso/particle/StandardParticle.java b/src/main/java/net/sourceforge/cilib/pso/particle/StandardParticle.java index 5176e8f..6f2cb2d 100644 --- a/src/main/java/net/sourceforge/cilib/pso/particle/StandardParticle.java +++ b/src/main/java/net/sourceforge/cilib/pso/particle/StandardParticle.java @@ -163,7 +163,7 @@ public class StandardParticle extends AbstractParticle { */ @Override public void calculateFitness() { - Fitness fitness = getFitnessCalculator().getFitness(this, true); + Fitness fitness = getFitnessCalculator().getFitness(this); this.getProperties().put(EntityType.FITNESS, fitness); this.personalBestUpdateStrategy.updatePersonalBest(this); diff --git a/src/main/java/net/sourceforge/cilib/pso/positionupdatestrategies/DEPositionUpdateStrategy.java b/src/main/java/net/sourceforge/cilib/pso/positionupdatestrategies/DEPositionUpdateStrategy.java index 3c244cd..2ac5646 100755 --- a/src/main/java/net/sourceforge/cilib/pso/positionupdatestrategies/DEPositionUpdateStrategy.java +++ b/src/main/java/net/sourceforge/cilib/pso/positionupdatestrategies/DEPositionUpdateStrategy.java @@ -123,8 +123,8 @@ public class DEPositionUpdateStrategy implements PositionUpdateStrategy { //position should only become the offspring if its fitness is better - Fitness trialFitness = pso.getOptimisationProblem().getFitness(dePosition, false); - Fitness currentFitness = pso.getOptimisationProblem().getFitness(particle.getCandidateSolution(), false); + Fitness trialFitness = pso.getOptimisationProblem().getFitness(dePosition); + Fitness currentFitness = pso.getOptimisationProblem().getFitness(particle.getCandidateSolution()); if (trialFitness.compareTo(currentFitness) > 0) { particle.setCandidateSolution(dePosition); diff --git a/src/main/java/net/sourceforge/cilib/pso/velocityupdatestrategies/GCVelocityUpdateStrategy.java b/src/main/java/net/sourceforge/cilib/pso/velocityupdatestrategies/GCVelocityUpdateStrategy.java index 9bdfee4..cba2489 100644 --- a/src/main/java/net/sourceforge/cilib/pso/velocityupdatestrategies/GCVelocityUpdateStrategy.java +++ b/src/main/java/net/sourceforge/cilib/pso/velocityupdatestrategies/GCVelocityUpdateStrategy.java @@ -159,7 +159,7 @@ public class GCVelocityUpdateStrategy extends StandardVelocityUpdate { PSO pso = (PSO) Algorithm.get(); if (particle == pso.getTopology().getBestEntity(new SocialBestFitnessComparator<Particle>())) { - Fitness newFitness = particle.getFitnessCalculator().getFitness(particle, false); + Fitness newFitness = particle.getFitnessCalculator().getFitness(particle); if (!newFitness.equals(oldFitness)) { this.failureCount = 0; diff --git a/src/main/java/net/sourceforge/cilib/util/calculator/EntityBasedFitnessCalculator.java b/src/main/java/net/sourceforge/cilib/util/calculator/EntityBasedFitnessCalculator.java index afd5933..8b19b18 100644 --- a/src/main/java/net/sourceforge/cilib/util/calculator/EntityBasedFitnessCalculator.java +++ b/src/main/java/net/sourceforge/cilib/util/calculator/EntityBasedFitnessCalculator.java @@ -35,6 +35,7 @@ public class EntityBasedFitnessCalculator implements FitnessCalculator<Entity> { /** * {@inheritDoc} */ + @Override public EntityBasedFitnessCalculator getClone() { return this; } @@ -42,9 +43,10 @@ public class EntityBasedFitnessCalculator implements FitnessCalculator<Entity> { /** * {@inheritDoc} */ - public Fitness getFitness(Entity entity, boolean count) { + @Override + public Fitness getFitness(Entity entity) { Algorithm algorithm = Algorithm.get(); - return algorithm.getOptimisationProblem().getFitness(entity.getCandidateSolution(), count); + return algorithm.getOptimisationProblem().getFitness(entity.getCandidateSolution()); } } diff --git a/src/main/java/net/sourceforge/cilib/util/calculator/FitnessCalculator.java b/src/main/java/net/sourceforge/cilib/util/calculator/FitnessCalculator.java index 51ecf75..8ef9a07 100644 --- a/src/main/java/net/sourceforge/cilib/util/calculator/FitnessCalculator.java +++ b/src/main/java/net/sourceforge/cilib/util/calculator/FitnessCalculator.java @@ -34,14 +34,14 @@ public interface FitnessCalculator<T> extends Cloneable { /** * {@inheritDoc} */ + @Override public FitnessCalculator<T> getClone(); /** * Get the fitness, given the <code>position</code>. * @param entity The <code>Type</code> to base the calculation on. - * @param count Whether or not the evaluation is to be counted. * @return A <code>Fitness</code> object representing the fitness of the <code>position</code>. */ - public Fitness getFitness(T entity, boolean count); + public Fitness getFitness(T entity); } diff --git a/src/main/java/net/sourceforge/cilib/util/calculator/PropertyBasedFitnessCalculator.java b/src/main/java/net/sourceforge/cilib/util/calculator/PropertyBasedFitnessCalculator.java index 78783d3..39479ee 100644 --- a/src/main/java/net/sourceforge/cilib/util/calculator/PropertyBasedFitnessCalculator.java +++ b/src/main/java/net/sourceforge/cilib/util/calculator/PropertyBasedFitnessCalculator.java @@ -45,8 +45,8 @@ public class PropertyBasedFitnessCalculator implements * {@inheritDoc} */ @Override - public Fitness getFitness(Entity entity, boolean count) { + public Fitness getFitness(Entity entity) { Algorithm algorithm = Algorithm.get(); - return algorithm.getOptimisationProblem().getFitness(entity.getProperties(), count); + return algorithm.getOptimisationProblem().getFitness(entity.getProperties()); } } diff --git a/src/main/java/net/sourceforge/cilib/util/calculator/StructuredTypeFitnessCalculator.java b/src/main/java/net/sourceforge/cilib/util/calculator/StructuredTypeFitnessCalculator.java index 5fe4d24..5e77f38 100644 --- a/src/main/java/net/sourceforge/cilib/util/calculator/StructuredTypeFitnessCalculator.java +++ b/src/main/java/net/sourceforge/cilib/util/calculator/StructuredTypeFitnessCalculator.java @@ -46,9 +46,9 @@ public class StructuredTypeFitnessCalculator<T extends StructuredType<?>> implem * {@inheritDoc} */ @Override - public Fitness getFitness(T structure, boolean count) { + public Fitness getFitness(T structure) { Algorithm algorithm = Algorithm.get(); - return algorithm.getOptimisationProblem().getFitness(structure, count); + return algorithm.getOptimisationProblem().getFitness(structure); } } diff --git a/src/test/java/net/sourceforge/cilib/entity/operators/crossover/BlendCrossoverStrategyTest.java b/src/test/java/net/sourceforge/cilib/entity/operators/crossover/BlendCrossoverStrategyTest.java index b66511a..7035d52 100644 --- a/src/test/java/net/sourceforge/cilib/entity/operators/crossover/BlendCrossoverStrategyTest.java +++ b/src/test/java/net/sourceforge/cilib/entity/operators/crossover/BlendCrossoverStrategyTest.java @@ -84,7 +84,7 @@ public class BlendCrossoverStrategyTest { } @Override - public Fitness getFitness(Individual entity, boolean count) { + public Fitness getFitness(Individual entity) { return InferiorFitness.instance(); } } diff --git a/src/test/java/net/sourceforge/cilib/entity/operators/crossover/OnePointCrossoverStrategyTest.java b/src/test/java/net/sourceforge/cilib/entity/operators/crossover/OnePointCrossoverStrategyTest.java index e7805ca..f6a97df 100644 --- a/src/test/java/net/sourceforge/cilib/entity/operators/crossover/OnePointCrossoverStrategyTest.java +++ b/src/test/java/net/sourceforge/cilib/entity/operators/crossover/OnePointCrossoverStrategyTest.java @@ -84,7 +84,7 @@ public class OnePointCrossoverStrategyTest { } @Override - public Fitness getFitness(Individual entity, boolean count) { + public Fitness getFitness(Individual entity) { return InferiorFitness.instance(); } } diff --git a/src/test/java/net/sourceforge/cilib/entity/operators/crossover/UniformCrossoverStrategyTest.java b/src/test/java/net/sourceforge/cilib/entity/operators/crossover/UniformCrossoverStrategyTest.java index daae496..f132db1 100644 --- a/src/test/java/net/sourceforge/cilib/entity/operators/crossover/UniformCrossoverStrategyTest.java +++ b/src/test/java/net/sourceforge/cilib/entity/operators/crossover/UniformCrossoverStrategyTest.java @@ -84,7 +84,7 @@ public class UniformCrossoverStrategyTest { } @Override - public Fitness getFitness(Individual entity, boolean count) { + public Fitness getFitness(Individual entity) { return InferiorFitness.instance(); } } diff --git a/src/test/java/net/sourceforge/cilib/moo/archive/constrained/ArchiveTest.java b/src/test/java/net/sourceforge/cilib/moo/archive/constrained/ArchiveTest.java index a6cbc2a..8a1a84a 100644 --- a/src/test/java/net/sourceforge/cilib/moo/archive/constrained/ArchiveTest.java +++ b/src/test/java/net/sourceforge/cilib/moo/archive/constrained/ArchiveTest.java @@ -234,29 +234,29 @@ public class ArchiveTest { // and test if the fitness-value is correct. Iterator<Vector> vectorIterator = testVectors.iterator(); Vector testVector = vectorIterator.next(); - MOFitness fitness = (MOFitness) problem.getFitness(testVector, false); + MOFitness fitness = problem.getFitness(testVector); assertThat(fitness.getDimension(), is(2)); assertEquals(1.46361111111, fitness.getFitness(0).getValue(), EPSILON); assertEquals(55, fitness.getFitness(1).getValue(), EPSILON); - archive.addAll(Arrays.asList(new OptimisationSolution(testVector, problem.getFitness(testVector, false)))); - assertThat(archive.contains(new OptimisationSolution(testVector, problem.getFitness(testVector, false))), is(true)); + archive.addAll(Arrays.asList(new OptimisationSolution(testVector, problem.getFitness(testVector)))); + assertThat(archive.contains(new OptimisationSolution(testVector, problem.getFitness(testVector))), is(true)); testVector = vectorIterator.next(); - fitness = (MOFitness) problem.getFitness(testVector, false); + fitness = problem.getFitness(testVector); assertThat(fitness.getDimension(), is(2)); assertEquals(0.491388888889, fitness.getFitness(0).getValue(), EPSILON); assertEquals(90, fitness.getFitness(1).getValue(), EPSILON); - archive.addAll(Arrays.asList(new OptimisationSolution(testVector, problem.getFitness(testVector, false)))); - assertThat(archive.contains(new OptimisationSolution(testVector, problem.getFitness(testVector, false))), is(true)); + archive.addAll(Arrays.asList(new OptimisationSolution(testVector, problem.getFitness(testVector)))); + assertThat(archive.contains(new OptimisationSolution(testVector, problem.getFitness(testVector))), is(true)); assertThat(archive.size(), is(2)); testVector = vectorIterator.next(); - fitness = (MOFitness) problem.getFitness(testVector, false); + fitness = problem.getFitness(testVector); assertThat(fitness.getDimension(), is(2)); assertEquals(0.261797052154, fitness.getFitness(0).getValue(), EPSILON); assertEquals(135, fitness.getFitness(1).getValue(), EPSILON); - archive.addAll(Arrays.asList(new OptimisationSolution(testVector, problem.getFitness(testVector, false)))); - assertThat(archive.contains(new OptimisationSolution(testVector, problem.getFitness(testVector, false))), is(true)); + archive.addAll(Arrays.asList(new OptimisationSolution(testVector, problem.getFitness(testVector)))); + assertThat(archive.contains(new OptimisationSolution(testVector, problem.getFitness(testVector))), is(true)); assertThat(archive.size(), is(3)); // After the archive size has been monitored continuously, insert the exact same solutions into the archive again. @@ -264,9 +264,9 @@ public class ArchiveTest { vectorIterator = testVectors.iterator(); while (vectorIterator.hasNext()) { testVector = vectorIterator.next(); - fitness = (MOFitness) problem.getFitness(testVector, false); + fitness = problem.getFitness(testVector); assertThat(fitness.getDimension(), is(2)); - archive.addAll(Arrays.asList(new OptimisationSolution(testVector, problem.getFitness(testVector, false)))); + archive.addAll(Arrays.asList(new OptimisationSolution(testVector, problem.getFitness(testVector)))); } // Archive size must stay the same due to set-based behavior of archive. assertThat(archive.size(), is(3)); @@ -284,7 +284,7 @@ public class ArchiveTest { DummyOptimisationProblem1 problem1 = new DummyOptimisationProblem1(); Collection<Vector> testVectors = createDummyVectors(); for (Vector testVector : testVectors) { - archive.addAll(Arrays.asList(new OptimisationSolution(testVector, problem1.getFitness(testVector, false)))); + archive.addAll(Arrays.asList(new OptimisationSolution(testVector, problem1.getFitness(testVector)))); } // Arhive size is now 3. assertThat(archive.size(), is(3)); @@ -296,13 +296,13 @@ public class ArchiveTest { DummyOptimisationProblem2 problem2 = new DummyOptimisationProblem2(); Iterator<Vector> vectorIterator = testVectors.iterator(); Vector testVector = vectorIterator.next(); - MOFitness fitness = (MOFitness) problem2.getFitness(testVector, false); + MOFitness fitness = problem2.getFitness(testVector); assertThat(fitness.getDimension(), is(2)); assertEquals(2.92722222222, fitness.getFitness(0).getValue(), EPSILON); assertEquals(110, fitness.getFitness(1).getValue(), EPSILON); // Then, check which solutions (corresponding to problem 1) dominates the first external solution corresponding to problem 2. - Collection<OptimisationSolution> dominantSolutions = archive.dominates(new OptimisationSolution(testVector, problem2.getFitness(testVector, false))); + Collection<OptimisationSolution> dominantSolutions = archive.dominates(new OptimisationSolution(testVector, problem2.getFitness(testVector))); assertThat(dominantSolutions.size(), is(2)); Iterator<OptimisationSolution> dominantIterator = dominantSolutions.iterator(); @@ -323,22 +323,22 @@ public class ArchiveTest { // solution with fitness (2.92722222222, 110) which is correct. // Finally, check that archive does not accept this solution. - archive.addAll(Arrays.asList(new OptimisationSolution(testVector, problem2.getFitness(testVector, false)))); + archive.addAll(Arrays.asList(new OptimisationSolution(testVector, problem2.getFitness(testVector)))); assertThat(archive.size(), is(3)); - assertThat(archive.contains(new OptimisationSolution(testVector, problem2.getFitness(testVector, false))), is(false)); + assertThat(archive.contains(new OptimisationSolution(testVector, problem2.getFitness(testVector))), is(false)); // For the second vector (2,3,4,5,6) calculate the fitness in terms of optimisation problem 2 and check it. testVector = vectorIterator.next(); - fitness = (MOFitness) problem2.getFitness(testVector, false); + fitness = problem2.getFitness(testVector); assertThat(fitness.getDimension(), is(2)); assertEquals(0.982777777778, fitness.getFitness(0).getValue(), EPSILON); assertEquals(180, fitness.getFitness(1).getValue(), EPSILON); // Now, check which solutions (corresponding to problem 1) dominates the second external solution corresponding to problem 2. - dominantSolutions = archive.dominates(new OptimisationSolution(testVector, problem2.getFitness(testVector, false))); + dominantSolutions = archive.dominates(new OptimisationSolution(testVector, problem2.getFitness(testVector))); assertThat(dominantSolutions.size(), is(2)); dominantIterator = dominantSolutions.iterator(); @@ -359,22 +359,22 @@ public class ArchiveTest { // solution with fitness (0.982777777778, 180) which is correct. // Finally, check that archive does not accept this solution. - archive.addAll(Arrays.asList(new OptimisationSolution(testVector, problem2.getFitness(testVector, false)))); + archive.addAll(Arrays.asList(new OptimisationSolution(testVector, problem2.getFitness(testVector)))); assertThat(archive.size(), is(3)); - assertThat(archive.contains(new OptimisationSolution(testVector, problem2.getFitness(testVector, false))), is(false)); + assertThat(archive.contains(new OptimisationSolution(testVector, problem2.getFitness(testVector))), is(false)); // For the third vector (3,4,5,6,7) calculate the fitness in terms of optimisation problem 2 and check it. testVector = vectorIterator.next(); - fitness = (MOFitness) problem2.getFitness(testVector, false); + fitness = problem2.getFitness(testVector); assertThat(fitness.getDimension(), is(2)); assertEquals(0.523594104308, fitness.getFitness(0).getValue(), EPSILON); assertEquals(270, fitness.getFitness(1).getValue(), EPSILON); // Now, check which solutions (corresponding to problem 1) dominates the second solution corresponding to problem 2. - dominantSolutions = archive.dominates(new OptimisationSolution(testVector, problem2.getFitness(testVector, false))); + dominantSolutions = archive.dominates(new OptimisationSolution(testVector, problem2.getFitness(testVector))); assertThat(dominantSolutions.size(), is(2)); dominantIterator = dominantSolutions.iterator(); @@ -395,9 +395,9 @@ public class ArchiveTest { // solution with fitness (0.523594104308, 270) which is correct. // Finally, check that archive does not accept this solution. - archive.addAll(Arrays.asList(new OptimisationSolution(testVector, problem2.getFitness(testVector, false)))); + archive.addAll(Arrays.asList(new OptimisationSolution(testVector, problem2.getFitness(testVector)))); assertThat(archive.size(), is(3)); - assertThat(archive.contains(new OptimisationSolution(testVector, problem2.getFitness(testVector, false))), is(false)); + assertThat(archive.contains(new OptimisationSolution(testVector, problem2.getFitness(testVector))), is(false)); } /** @@ -413,7 +413,7 @@ public class ArchiveTest { DummyOptimisationProblem2 problem2 = new DummyOptimisationProblem2(); Collection<Vector> testVectors = createDummyVectors(); for (Vector testVector : testVectors) { - archive.addAll(Arrays.asList(new OptimisationSolution(testVector, problem2.getFitness(testVector, false)))); + archive.addAll(Arrays.asList(new OptimisationSolution(testVector, problem2.getFitness(testVector)))); } // Arhive size is now 3. assertThat(archive.size(), is(3)); @@ -425,13 +425,13 @@ public class ArchiveTest { DummyOptimisationProblem1 problem1 = new DummyOptimisationProblem1(); Iterator<Vector> vectorIterator = testVectors.iterator(); Vector testVector = vectorIterator.next(); - MOFitness fitness = (MOFitness) problem1.getFitness(testVector, false); + MOFitness fitness = problem1.getFitness(testVector); assertThat(fitness.getDimension(), is(2)); assertEquals(1.46361111111, fitness.getFitness(0).getValue(), EPSILON); assertEquals(55, fitness.getFitness(1).getValue(), EPSILON); // Then, check which solutions (corresponding to problem 2) is dominated by the first external solution corresponding to problem 1. - Collection<OptimisationSolution> dominatedSolutions = archive.isDominatedBy(new OptimisationSolution(testVector, problem1.getFitness(testVector, false))); + Collection<OptimisationSolution> dominatedSolutions = archive.isDominatedBy(new OptimisationSolution(testVector, problem1.getFitness(testVector))); assertThat(dominatedSolutions.size(), is(1)); Iterator<OptimisationSolution> dominatedIterator = dominatedSolutions.iterator(); @@ -445,10 +445,10 @@ public class ArchiveTest { // Thus, no more solutions in archive is dominated by this external solution. // Now, insert this external solution and it should replace abovementioned dominated solution. - archive.addAll(Arrays.asList(new OptimisationSolution(testVector, problem1.getFitness(testVector, false)))); + archive.addAll(Arrays.asList(new OptimisationSolution(testVector, problem1.getFitness(testVector)))); assertThat(archive.size(), is(3)); assertThat(archive.contains(dominatedSolution), is(false)); - assertThat(archive.contains(new OptimisationSolution(testVector, problem1.getFitness(testVector, false))), is(true)); + assertThat(archive.contains(new OptimisationSolution(testVector, problem1.getFitness(testVector))), is(true)); // -- Arhive contains (0.982777777778, 180); (0.523594104308, 270); new --> (1.46361111111, 55) <-- new; @@ -457,13 +457,13 @@ public class ArchiveTest { // For the second vector (2,3,4,5,6) calculate the fitness in terms of optimisation problem 1 and check it. testVector = vectorIterator.next(); - fitness = (MOFitness) problem1.getFitness(testVector, false); + fitness = problem1.getFitness(testVector); assertThat(fitness.getDimension(), is(2)); assertEquals(0.491388888889, fitness.getFitness(0).getValue(), EPSILON); assertEquals(90, fitness.getFitness(1).getValue(), EPSILON); // Then, check which solutions (corresponding to problem 2) is dominated by the second external solution corresponding to problem 1. - dominatedSolutions = archive.isDominatedBy(new OptimisationSolution(testVector, problem1.getFitness(testVector, false))); + dominatedSolutions = archive.isDominatedBy(new OptimisationSolution(testVector, problem1.getFitness(testVector))); assertThat(dominatedSolutions.size(), is(2)); dominatedIterator = dominatedSolutions.iterator(); @@ -480,11 +480,11 @@ public class ArchiveTest { assertEquals(270, ((MOFitness) dominatedSolution2.getFitness()).getFitness(1).getValue(), EPSILON); // Now, insert this external solution and it should replace both of the abovementioned dominated solutions. - archive.addAll(Arrays.asList(new OptimisationSolution(testVector, problem1.getFitness(testVector, false)))); + archive.addAll(Arrays.asList(new OptimisationSolution(testVector, problem1.getFitness(testVector)))); assertThat(archive.size(), is(2)); assertThat(archive.contains(dominatedSolution1), is(false)); assertThat(archive.contains(dominatedSolution2), is(false)); - assertThat(archive.contains(new OptimisationSolution(testVector, problem1.getFitness(testVector, false))), is(true)); + assertThat(archive.contains(new OptimisationSolution(testVector, problem1.getFitness(testVector))), is(true)); // -- Arhive contains (1.46361111111, 55); new --> (0.491388888889, 90) <-- new; @@ -493,19 +493,19 @@ public class ArchiveTest { // For the third vector (3,4,5,6,7) calculate the fitness in terms of optimisation problem 1 and check it. testVector = vectorIterator.next(); - fitness = (MOFitness) problem1.getFitness(testVector, false); + fitness = problem1.getFitness(testVector); assertThat(fitness.getDimension(), is(2)); assertEquals(0.261797052154, fitness.getFitness(0).getValue(), EPSILON); assertEquals(135, fitness.getFitness(1).getValue(), EPSILON); // Then, check which solutions (corresponding to problem 2) is dominated by the second external solution corresponding to problem 1. - dominatedSolutions = archive.isDominatedBy(new OptimisationSolution(testVector, problem1.getFitness(testVector, false))); + dominatedSolutions = archive.isDominatedBy(new OptimisationSolution(testVector, problem1.getFitness(testVector))); assertThat(dominatedSolutions.size(), is(0)); // No solutions dominate external solution. // Now, insert this external solution and it should be accepted in archive and not replace any other solution. - archive.addAll(Arrays.asList(new OptimisationSolution(testVector, problem1.getFitness(testVector, false)))); + archive.addAll(Arrays.asList(new OptimisationSolution(testVector, problem1.getFitness(testVector)))); assertThat(archive.size(), is(3)); - assertThat(archive.contains(new OptimisationSolution(testVector, problem1.getFitness(testVector, false))), is(true)); + assertThat(archive.contains(new OptimisationSolution(testVector, problem1.getFitness(testVector))), is(true)); // -- Archive contains (1.46361111111, 55); (0.491388888889, 90); (0.261797052154, 135); } diff --git a/src/test/java/net/sourceforge/cilib/moo/archive/constrained/ConstrainedArchiveTest.java b/src/test/java/net/sourceforge/cilib/moo/archive/constrained/ConstrainedArchiveTest.java index 05b3737..8a8491f 100644 --- a/src/test/java/net/sourceforge/cilib/moo/archive/constrained/ConstrainedArchiveTest.java +++ b/src/test/java/net/sourceforge/cilib/moo/archive/constrained/ConstrainedArchiveTest.java @@ -190,7 +190,7 @@ public class ConstrainedArchiveTest { for (int j = i; j < i + 5; ++j) { vector.add(new Real(j)); } - archive.addAll(Arrays.asList(new OptimisationSolution(vector, problem.getFitness(vector, false)))); + archive.addAll(Arrays.asList(new OptimisationSolution(vector, problem.getFitness(vector)))); } assertThat(archive.size(), is(100)); archive.clear(); @@ -201,7 +201,7 @@ public class ConstrainedArchiveTest { for (int j = i; j < i + 5; ++j) { vector.add(new Real(j)); } - solutions.add(new OptimisationSolution(vector, problem.getFitness(vector, false))); + solutions.add(new OptimisationSolution(vector, problem.getFitness(vector))); } archive.addAll(solutions); assertThat(archive.size(), is(100)); diff --git a/src/test/java/net/sourceforge/cilib/moo/archive/solutionweighing/SolutionWeighingTest.java b/src/test/java/net/sourceforge/cilib/moo/archive/solutionweighing/SolutionWeighingTest.java index ae30953..9d2ef20 100644 --- a/src/test/java/net/sourceforge/cilib/moo/archive/solutionweighing/SolutionWeighingTest.java +++ b/src/test/java/net/sourceforge/cilib/moo/archive/solutionweighing/SolutionWeighingTest.java @@ -72,7 +72,7 @@ public class SolutionWeighingTest { } @Override - public Fitness getFitness(Type solution, boolean count) { + public Fitness getFitness(Type solution) { Vector position = (Vector) solution; return new MinimisationFitness(position.getReal(index)); } @@ -123,27 +123,27 @@ public class SolutionWeighingTest { Vector position = new Vector(); position.add(new Real(1)); position.add(new Real(1)); - solutions.add(new OptimisationSolution(position, moProblem.getFitness(position, false))); + solutions.add(new OptimisationSolution(position, moProblem.getFitness(position))); position = new Vector(); position.add(new Real(2)); position.add(new Real(4)); - solutions.add(new OptimisationSolution(position, moProblem.getFitness(position, false))); + solutions.add(new OptimisationSolution(position, moProblem.getFitness(position))); position = new Vector(); position.add(new Real(3)); position.add(new Real(2)); - solutions.add(new OptimisationSolution(position, moProblem.getFitness(position, false))); + solutions.add(new OptimisationSolution(position, moProblem.getFitness(position))); position = new Vector(); position.add(new Real(4)); position.add(new Real(6)); - solutions.add(new OptimisationSolution(position, moProblem.getFitness(position, false))); + solutions.add(new OptimisationSolution(position, moProblem.getFitness(position))); position = new Vector(); position.add(new Real(5)); position.add(new Real(1)); - solutions.add(new OptimisationSolution(position, moProblem.getFitness(position, false))); + solutions.add(new OptimisationSolution(position, moProblem.getFitness(position))); } @Test diff --git a/src/test/java/net/sourceforge/cilib/problem/MOFitnessTest.java b/src/test/java/net/sourceforge/cilib/problem/MOFitnessTest.java index 407bc25..ae5d5d5 100644 --- a/src/test/java/net/sourceforge/cilib/problem/MOFitnessTest.java +++ b/src/test/java/net/sourceforge/cilib/problem/MOFitnessTest.java @@ -56,8 +56,8 @@ public class MOFitnessTest { new MinimisationFitness(new Integer(1).doubleValue()), new MinimisationFitness(new Integer(1).doubleValue())}; - Fitness f1 = moproblem.getFitness(inferior, false); - Fitness f2 = moproblem.getFitness(oneFitness, false); + Fitness f1 = moproblem.getFitness(inferior); + Fitness f2 = moproblem.getFitness(oneFitness); assertTrue(f1.compareTo(f2) < 0); assertTrue(f2.compareTo(f1) > 0); @@ -80,14 +80,10 @@ public class MOFitnessTest { } @Override - public Fitness getFitness(Type solution, boolean count) { + public Fitness getFitness(Type solution) { return (Fitness) solution; } - public Fitness getFitness(Type[] solution, boolean count) { - return (Fitness) solution[i]; - } - @Override public int getFitnessEvaluations() { return 0; -- 1.6.4 |
From: Gary P. <gpa...@gm...> - 2009-07-31 07:56:44
|
Removed the option of calculating the fitness of the Entity without incrementing the associated fitness evaluation. Signed-off-by: Gary Pampara <gpa...@gm...> --- .../cilib/bioinf/rnaprediction/RNAParticle.java | 2 +- .../net/sourceforge/cilib/boa/bee/AbstractBee.java | 10 +--------- .../java/net/sourceforge/cilib/ec/Individual.java | 10 +--------- .../DifferentialEvolutionIterationStrategy.java | 2 +- .../java/net/sourceforge/cilib/entity/Entity.java | 7 ------- .../java/net/sourceforge/cilib/entity/Harmony.java | 12 +----------- .../crossover/BlendCrossoverStrategy.java | 4 ++-- .../crossover/OnePointCrossoverStrategy.java | 4 ++-- .../crossover/UniformCrossoverStrategy.java | 4 ++-- .../cilib/problem/OptimisationProblem.java | 1 + ...NeighbourhoodBestSentriesDetectionStrategy.java | 2 +- .../RandomSentriesDetectionStrategy.java | 2 +- .../RandomSentryDetectionStrategy.java | 2 +- .../RandomSentryPointsDetectionStrategy.java | 2 +- .../TopologyBestSentryDetectionStrategy.java | 2 +- .../cilib/pso/particle/AbstractParticle.java | 10 +--------- .../cilib/pso/particle/ParticleDecorator.java | 4 ++-- .../cilib/pso/particle/StandardParticle.java | 4 ++-- .../entity/topologies/VonNeumannTopologyTest.java | 2 +- 19 files changed, 23 insertions(+), 63 deletions(-) diff --git a/src/main/java/net/sourceforge/cilib/bioinf/rnaprediction/RNAParticle.java b/src/main/java/net/sourceforge/cilib/bioinf/rnaprediction/RNAParticle.java index 7acca1b..a294456 100644 --- a/src/main/java/net/sourceforge/cilib/bioinf/rnaprediction/RNAParticle.java +++ b/src/main/java/net/sourceforge/cilib/bioinf/rnaprediction/RNAParticle.java @@ -324,7 +324,7 @@ public class RNAParticle extends AbstractParticle { * {@inheritDoc} */ @Override - public void calculateFitness(boolean count) { + public void calculateFitness() { // TODO Auto-generated method stub } diff --git a/src/main/java/net/sourceforge/cilib/boa/bee/AbstractBee.java b/src/main/java/net/sourceforge/cilib/boa/bee/AbstractBee.java index ddef6ac..ceea52b 100644 --- a/src/main/java/net/sourceforge/cilib/boa/bee/AbstractBee.java +++ b/src/main/java/net/sourceforge/cilib/boa/bee/AbstractBee.java @@ -97,15 +97,7 @@ public abstract class AbstractBee extends AbstractEntity implements HoneyBee { */ @Override public void calculateFitness() { - this.calculateFitness(true); - } - - /** - * {@inheritDoc} - */ - @Override - public void calculateFitness(boolean count) { - this.getProperties().put(EntityType.FITNESS, getFitnessCalculator().getFitness(this, count)); + this.getProperties().put(EntityType.FITNESS, getFitnessCalculator().getFitness(this, true)); } /** diff --git a/src/main/java/net/sourceforge/cilib/ec/Individual.java b/src/main/java/net/sourceforge/cilib/ec/Individual.java index a236ba8..c1ea82f 100644 --- a/src/main/java/net/sourceforge/cilib/ec/Individual.java +++ b/src/main/java/net/sourceforge/cilib/ec/Individual.java @@ -145,15 +145,7 @@ public class Individual extends AbstractEntity { */ @Override public void calculateFitness() { - calculateFitness(true); - } - - /** - * {@inheritDoc} - */ - @Override - public void calculateFitness(boolean count) { - this.getProperties().put(EntityType.FITNESS, this.getFitnessCalculator().getFitness(this, count)); + this.getProperties().put(EntityType.FITNESS, this.getFitnessCalculator().getFitness(this, true)); } /** diff --git a/src/main/java/net/sourceforge/cilib/ec/iterationstrategies/DifferentialEvolutionIterationStrategy.java b/src/main/java/net/sourceforge/cilib/ec/iterationstrategies/DifferentialEvolutionIterationStrategy.java index 478b09f..881fa0d 100644 --- a/src/main/java/net/sourceforge/cilib/ec/iterationstrategies/DifferentialEvolutionIterationStrategy.java +++ b/src/main/java/net/sourceforge/cilib/ec/iterationstrategies/DifferentialEvolutionIterationStrategy.java @@ -101,7 +101,7 @@ public class DifferentialEvolutionIterationStrategy extends AbstractIterationStr // Replace the parent (current) if the offspring is better Entity offspringEntity = offspring.get(0); boundaryConstraint.enforce(offspringEntity); - offspringEntity.calculateFitness(false); + offspringEntity.calculateFitness(); if (offspringEntity.getFitness().compareTo(current.getFitness()) > 0) { // the trial vector is better than the parent current.setCandidateSolution(offspring.get(0).getCandidateSolution()); diff --git a/src/main/java/net/sourceforge/cilib/entity/Entity.java b/src/main/java/net/sourceforge/cilib/entity/Entity.java index c6d84bb..0c67599 100644 --- a/src/main/java/net/sourceforge/cilib/entity/Entity.java +++ b/src/main/java/net/sourceforge/cilib/entity/Entity.java @@ -75,13 +75,6 @@ public interface Entity extends Comparable<Entity>, Cloneable, Serializable { public void calculateFitness(); /** - * Calculate the fitness of the <code>Entity</code>. This method may or may not - * increment the number of fitness evaluations of the algorithm. - * @param count Add or do not add this fitness evaluation to the algorithm global count. - */ - public void calculateFitness(boolean count); - - /** * Returns the {@linkplain Entity} fitness. * @return The {@linkplain Fitness} of the {@linkplain Entity}. */ diff --git a/src/main/java/net/sourceforge/cilib/entity/Harmony.java b/src/main/java/net/sourceforge/cilib/entity/Harmony.java index 984a3d7..85fe665 100644 --- a/src/main/java/net/sourceforge/cilib/entity/Harmony.java +++ b/src/main/java/net/sourceforge/cilib/entity/Harmony.java @@ -21,12 +21,10 @@ */ package net.sourceforge.cilib.entity; -import net.sourceforge.cilib.type.types.Types; import net.sourceforge.cilib.math.random.generator.MersenneTwister; import net.sourceforge.cilib.problem.Fitness; import net.sourceforge.cilib.problem.InferiorFitness; import net.sourceforge.cilib.problem.OptimisationProblem; -import net.sourceforge.cilib.type.types.Type; import net.sourceforge.cilib.type.types.container.StructuredType; /** @@ -82,15 +80,7 @@ public class Harmony extends AbstractEntity { */ @Override public void calculateFitness() { - calculateFitness(true); - } - - /** - * {@inheritDoc} - */ - @Override - public void calculateFitness(boolean count) { - Fitness fitness = getFitnessCalculator().getFitness(this, count); + Fitness fitness = getFitnessCalculator().getFitness(this, true); this.getProperties().put(EntityType.FITNESS, fitness); } diff --git a/src/main/java/net/sourceforge/cilib/entity/operators/crossover/BlendCrossoverStrategy.java b/src/main/java/net/sourceforge/cilib/entity/operators/crossover/BlendCrossoverStrategy.java index 96e4dbe..43ea467 100644 --- a/src/main/java/net/sourceforge/cilib/entity/operators/crossover/BlendCrossoverStrategy.java +++ b/src/main/java/net/sourceforge/cilib/entity/operators/crossover/BlendCrossoverStrategy.java @@ -132,8 +132,8 @@ public class BlendCrossoverStrategy extends CrossoverStrategy { */ } - offspring1.calculateFitness(false); - offspring2.calculateFitness(false); + offspring1.calculateFitness(); + offspring2.calculateFitness(); offspring.add(offspring1); offspring.add(offspring2); diff --git a/src/main/java/net/sourceforge/cilib/entity/operators/crossover/OnePointCrossoverStrategy.java b/src/main/java/net/sourceforge/cilib/entity/operators/crossover/OnePointCrossoverStrategy.java index e7f900b..8c73685 100644 --- a/src/main/java/net/sourceforge/cilib/entity/operators/crossover/OnePointCrossoverStrategy.java +++ b/src/main/java/net/sourceforge/cilib/entity/operators/crossover/OnePointCrossoverStrategy.java @@ -80,8 +80,8 @@ public class OnePointCrossoverStrategy extends CrossoverStrategy { offspringVector2.insert(j, offspringVector1.get(j).getClone()); } - offspring1.calculateFitness(false); - offspring2.calculateFitness(false); + offspring1.calculateFitness(); + offspring2.calculateFitness(); offspring.add(offspring1); offspring.add(offspring2); diff --git a/src/main/java/net/sourceforge/cilib/entity/operators/crossover/UniformCrossoverStrategy.java b/src/main/java/net/sourceforge/cilib/entity/operators/crossover/UniformCrossoverStrategy.java index 8be479e..1230a38 100644 --- a/src/main/java/net/sourceforge/cilib/entity/operators/crossover/UniformCrossoverStrategy.java +++ b/src/main/java/net/sourceforge/cilib/entity/operators/crossover/UniformCrossoverStrategy.java @@ -91,8 +91,8 @@ public class UniformCrossoverStrategy extends CrossoverStrategy { } } - offspring1.calculateFitness(false); - offspring2.calculateFitness(false); + offspring1.calculateFitness(); + offspring2.calculateFitness(); offspring.add(offspring1); offspring.add(offspring2); diff --git a/src/main/java/net/sourceforge/cilib/problem/OptimisationProblem.java b/src/main/java/net/sourceforge/cilib/problem/OptimisationProblem.java index e300bd5..a5437c2 100644 --- a/src/main/java/net/sourceforge/cilib/problem/OptimisationProblem.java +++ b/src/main/java/net/sourceforge/cilib/problem/OptimisationProblem.java @@ -43,6 +43,7 @@ public interface OptimisationProblem extends Problem { /** * {@inheritDoc} */ + @Override public OptimisationProblem getClone(); /** diff --git a/src/main/java/net/sourceforge/cilib/pso/dynamic/detectionstrategies/NeighbourhoodBestSentriesDetectionStrategy.java b/src/main/java/net/sourceforge/cilib/pso/dynamic/detectionstrategies/NeighbourhoodBestSentriesDetectionStrategy.java index ba791bf..5365fe9 100644 --- a/src/main/java/net/sourceforge/cilib/pso/dynamic/detectionstrategies/NeighbourhoodBestSentriesDetectionStrategy.java +++ b/src/main/java/net/sourceforge/cilib/pso/dynamic/detectionstrategies/NeighbourhoodBestSentriesDetectionStrategy.java @@ -51,7 +51,7 @@ public class NeighbourhoodBestSentriesDetectionStrategy<E extends PopulationBase for (Entity sentry : sentries) { double previousFitness = sentry.getFitness().getValue(); - sentry.calculateFitness(false); + sentry.calculateFitness(); double currentFitness = sentry.getFitness().getValue(); if(Math.abs(previousFitness - currentFitness) >= epsilon) { diff --git a/src/main/java/net/sourceforge/cilib/pso/dynamic/detectionstrategies/RandomSentriesDetectionStrategy.java b/src/main/java/net/sourceforge/cilib/pso/dynamic/detectionstrategies/RandomSentriesDetectionStrategy.java index ec5a662..d2f2c3f 100644 --- a/src/main/java/net/sourceforge/cilib/pso/dynamic/detectionstrategies/RandomSentriesDetectionStrategy.java +++ b/src/main/java/net/sourceforge/cilib/pso/dynamic/detectionstrategies/RandomSentriesDetectionStrategy.java @@ -86,7 +86,7 @@ public class RandomSentriesDetectionStrategy<E extends PopulationBasedAlgorithm> // check for change double previousFitness = sentry.getFitness().getValue(); - sentry.calculateFitness(false); + sentry.calculateFitness(); double currentFitness = sentry.getFitness().getValue(); if (Math.abs(previousFitness - currentFitness) >= epsilon) { diff --git a/src/main/java/net/sourceforge/cilib/pso/dynamic/detectionstrategies/RandomSentryDetectionStrategy.java b/src/main/java/net/sourceforge/cilib/pso/dynamic/detectionstrategies/RandomSentryDetectionStrategy.java index 3ec957b..11f0fb3 100644 --- a/src/main/java/net/sourceforge/cilib/pso/dynamic/detectionstrategies/RandomSentryDetectionStrategy.java +++ b/src/main/java/net/sourceforge/cilib/pso/dynamic/detectionstrategies/RandomSentryDetectionStrategy.java @@ -78,7 +78,7 @@ public class RandomSentryDetectionStrategy<E extends PopulationBasedAlgorithm> e for (Entity nextSentry : sentryList) { double oldSentryFitness = nextSentry.getFitness().getValue(); - nextSentry.calculateFitness(false); + nextSentry.calculateFitness(); double newSentryFitness = algorithm.getOptimisationProblem().getFitness(nextSentry.getCandidateSolution(), false).getValue(); if(Math.abs(oldSentryFitness - newSentryFitness) >= theta) { diff --git a/src/main/java/net/sourceforge/cilib/pso/dynamic/detectionstrategies/RandomSentryPointsDetectionStrategy.java b/src/main/java/net/sourceforge/cilib/pso/dynamic/detectionstrategies/RandomSentryPointsDetectionStrategy.java index eb39d9e..f20cb29 100644 --- a/src/main/java/net/sourceforge/cilib/pso/dynamic/detectionstrategies/RandomSentryPointsDetectionStrategy.java +++ b/src/main/java/net/sourceforge/cilib/pso/dynamic/detectionstrategies/RandomSentryPointsDetectionStrategy.java @@ -86,7 +86,7 @@ public class RandomSentryPointsDetectionStrategy<E extends PopulationBasedAlgori if (algorithm.getIterations() % interval == 0) { for (Entity sentry : sentries) { double previousFitness = sentry.getFitness().getValue(); - sentry.calculateFitness(false); + sentry.calculateFitness(); double currentFitness = sentry.getFitness().getValue(); if(Math.abs(previousFitness - currentFitness) >= epsilon) { diff --git a/src/main/java/net/sourceforge/cilib/pso/dynamic/detectionstrategies/TopologyBestSentryDetectionStrategy.java b/src/main/java/net/sourceforge/cilib/pso/dynamic/detectionstrategies/TopologyBestSentryDetectionStrategy.java index 8e2f2c1..62e59b0 100644 --- a/src/main/java/net/sourceforge/cilib/pso/dynamic/detectionstrategies/TopologyBestSentryDetectionStrategy.java +++ b/src/main/java/net/sourceforge/cilib/pso/dynamic/detectionstrategies/TopologyBestSentryDetectionStrategy.java @@ -54,7 +54,7 @@ public class TopologyBestSentryDetectionStrategy<E extends PopulationBasedAlgori if (algorithm.getIterations() % interval == 0) { Entity sentry = algorithm.getTopology().getBestEntity(); double previousFitness = sentry.getFitness().getValue(); - sentry.calculateFitness(false); + sentry.calculateFitness(); double currentFitness = sentry.getFitness().getValue(); if (Math.abs(previousFitness - currentFitness) >= epsilon) { diff --git a/src/main/java/net/sourceforge/cilib/pso/particle/AbstractParticle.java b/src/main/java/net/sourceforge/cilib/pso/particle/AbstractParticle.java index 9d3bec1..d274363 100644 --- a/src/main/java/net/sourceforge/cilib/pso/particle/AbstractParticle.java +++ b/src/main/java/net/sourceforge/cilib/pso/particle/AbstractParticle.java @@ -122,15 +122,7 @@ public abstract class AbstractParticle extends AbstractEntity implements Particl * {@inheritDoc} */ @Override - public void calculateFitness() { - calculateFitness(true); - } - - /** - * {@inheritDoc} - */ - @Override - public abstract void calculateFitness(boolean count); + public abstract void calculateFitness(); /** * {@inheritDoc} diff --git a/src/main/java/net/sourceforge/cilib/pso/particle/ParticleDecorator.java b/src/main/java/net/sourceforge/cilib/pso/particle/ParticleDecorator.java index ed44981..c2e7f90 100644 --- a/src/main/java/net/sourceforge/cilib/pso/particle/ParticleDecorator.java +++ b/src/main/java/net/sourceforge/cilib/pso/particle/ParticleDecorator.java @@ -121,8 +121,8 @@ public abstract class ParticleDecorator extends AbstractParticle { } @Override - public void calculateFitness(boolean count) { - target.calculateFitness(count); + public void calculateFitness() { + target.calculateFitness(); } public void setNeighbourhoodBest(Particle particle) { diff --git a/src/main/java/net/sourceforge/cilib/pso/particle/StandardParticle.java b/src/main/java/net/sourceforge/cilib/pso/particle/StandardParticle.java index 2ed3c98..5176e8f 100644 --- a/src/main/java/net/sourceforge/cilib/pso/particle/StandardParticle.java +++ b/src/main/java/net/sourceforge/cilib/pso/particle/StandardParticle.java @@ -162,8 +162,8 @@ public class StandardParticle extends AbstractParticle { * {@inheritDoc} */ @Override - public void calculateFitness(boolean count) { - Fitness fitness = getFitnessCalculator().getFitness(this, count); + public void calculateFitness() { + Fitness fitness = getFitnessCalculator().getFitness(this, true); this.getProperties().put(EntityType.FITNESS, fitness); this.personalBestUpdateStrategy.updatePersonalBest(this); diff --git a/src/test/java/net/sourceforge/cilib/entity/topologies/VonNeumannTopologyTest.java b/src/test/java/net/sourceforge/cilib/entity/topologies/VonNeumannTopologyTest.java index 388d27c..8012fa8 100644 --- a/src/test/java/net/sourceforge/cilib/entity/topologies/VonNeumannTopologyTest.java +++ b/src/test/java/net/sourceforge/cilib/entity/topologies/VonNeumannTopologyTest.java @@ -246,7 +246,7 @@ public class VonNeumannTopologyTest { } @Override - public void calculateFitness(boolean count) { + public void calculateFitness() { throw new UnsupportedOperationException("Mocked object - not allowed"); } -- 1.6.4 |
From: Gary P. <gpa...@gm...> - 2009-07-31 07:56:40
|
The fact that fitness evalautions can be bypassed was not correct. These patches prevent such ambiguity and result in a cleaner API. Gary Pampara (2): Removed calculateFitness(boolean) from Entity. Always increment evaluations problem. .../algorithm/MultistartOptimisationAlgorithm.java | 2 +- .../cilib/bioinf/rnaprediction/RNAParticle.java | 2 +- .../net/sourceforge/cilib/boa/bee/AbstractBee.java | 10 +--- .../cilib/clustering/kmeans/KMeans.java | 6 +- .../cilib/cooperative/CooperativeEntity.java | 9 +-- .../SelectiveContributionUpdateStrategy.java | 2 +- .../java/net/sourceforge/cilib/ec/Individual.java | 10 +--- .../DifferentialEvolutionIterationStrategy.java | 2 +- .../java/net/sourceforge/cilib/entity/Entity.java | 7 -- .../java/net/sourceforge/cilib/entity/Harmony.java | 12 +--- .../crossover/BlendCrossoverStrategy.java | 4 +- .../crossover/OnePointCrossoverStrategy.java | 4 +- .../crossover/UniformCrossoverStrategy.java | 4 +- .../criterion/CriterionBasedMOProblemAdapter.java | 2 +- .../ArchivingIterationStrategy.java | 4 +- .../foundation/NeuralNetworkProblem.java | 7 +- .../CooperativeOptimisationProblemAdapter.java | 2 +- .../net/sourceforge/cilib/problem/MOFitness.java | 8 +- .../cilib/problem/MOOptimisationProblem.java | 12 ++-- .../cilib/problem/OptimisationProblem.java | 4 +- .../cilib/problem/OptimisationProblemAdapter.java | 6 +- .../cilib/pso/dynamic/DynamicParticle.java | 2 +- ...NeighbourhoodBestSentriesDetectionStrategy.java | 2 +- .../RandomSentriesDetectionStrategy.java | 2 +- .../RandomSentryDetectionStrategy.java | 4 +- .../RandomSentryPointsDetectionStrategy.java | 2 +- .../TopologyBestSentryDetectionStrategy.java | 2 +- .../ArchiveReevaluationResponseStrategy.java | 4 +- ...lutionParticleReevaluationResponseStrategy.java | 2 +- .../DominantGuideUpdateStrategy.java | 4 +- .../cilib/pso/particle/AbstractParticle.java | 10 +--- .../cilib/pso/particle/MultiObjectiveParticle.java | 2 +- .../cilib/pso/particle/ParticleDecorator.java | 4 +- .../cilib/pso/particle/StandardParticle.java | 4 +- .../DEPositionUpdateStrategy.java | 4 +- .../GCVelocityUpdateStrategy.java | 2 +- .../calculator/EntityBasedFitnessCalculator.java | 6 +- .../cilib/util/calculator/FitnessCalculator.java | 4 +- .../calculator/PropertyBasedFitnessCalculator.java | 4 +- .../StructuredTypeFitnessCalculator.java | 4 +- .../crossover/BlendCrossoverStrategyTest.java | 2 +- .../crossover/OnePointCrossoverStrategyTest.java | 2 +- .../crossover/UniformCrossoverStrategyTest.java | 2 +- .../entity/topologies/VonNeumannTopologyTest.java | 2 +- .../cilib/moo/archive/constrained/ArchiveTest.java | 74 ++++++++++---------- .../constrained/ConstrainedArchiveTest.java | 4 +- .../solutionweighing/SolutionWeighingTest.java | 12 ++-- .../sourceforge/cilib/problem/MOFitnessTest.java | 10 +-- 48 files changed, 123 insertions(+), 172 deletions(-) |
From: Gary P. <gpa...@gm...> - 2009-07-27 09:45:29
|
Patch has been applied onto next. This should resolve some of the Multi Objective problems. Let us know if there are other issues related to this patch. On Friday 24 July 2009 12:27:43 Gary Pampara wrote: > These changes prevent the leaking of ThreadLocal variables. Previously > the simulation object graphs were created ahead of time and then > executed in threads. This effectively resulted in the ThreadLocal > variable being placed on the main thread and _not_ the intended > simulation thread. Yes, this is BAD. > > Created a logical separation and ensured that the object graph > construction occurs within the simulation thread and not in the main > thread. > > Tested-by: Wiehann Matthysen <wcm...@gm...> > Signed-off-by: Gary Pampara <gpa...@gm...> > --- > .../java/net/sourceforge/cilib/simulator/Main.java | 9 +- > .../sourceforge/cilib/simulator/Simulation.java | 202 > +++++++------------- .../simulator/{Simulation.java => Simulator.java} | > 108 ++++------- .../net/sourceforge/cilib/xml/XMLFileTest.java | 4 > +- > 4 files changed, 114 insertions(+), 209 deletions(-) > copy src/main/java/net/sourceforge/cilib/simulator/{Simulation.java => > Simulator.java} (52%) > > diff --git a/src/main/java/net/sourceforge/cilib/simulator/Main.java > b/src/main/java/net/sourceforge/cilib/simulator/Main.java index > 452702a..88246cb 100644 > --- a/src/main/java/net/sourceforge/cilib/simulator/Main.java > +++ b/src/main/java/net/sourceforge/cilib/simulator/Main.java > @@ -58,14 +58,13 @@ public final class Main { > XMLProblemFactory problemFactory = new > XMLProblemFactory(config, (Element) > current.getElementsByTagName("problem").item(0)); XMLObjectFactory > measurementsFactory = new XMLObjectFactory(config, (Element) > current.getElementsByTagName("measurements").item(0)); MeasurementSuite > suite = (MeasurementSuite) measurementsFactory.newObject(); - > Simulation simulation = new Simulation(algorithmFactory, problemFactory, > suite); + Simulator simulator = new Simulator(algorithmFactory, > problemFactory, suite); if(progress != null) { > - simulation.addProgressListener(progress); > + simulator.addProgressListener(progress); > } > > - simulation.initialise(); > - simulation.run(); > - simulation = null; > + simulator.execute(); > + simulator = null; > System.gc(); > } > } > diff --git a/src/main/java/net/sourceforge/cilib/simulator/Simulation.java > b/src/main/java/net/sourceforge/cilib/simulator/Simulation.java index > 377dd5c..57dc736 100644 > --- a/src/main/java/net/sourceforge/cilib/simulator/Simulation.java > +++ b/src/main/java/net/sourceforge/cilib/simulator/Simulation.java > @@ -22,9 +22,6 @@ > package net.sourceforge.cilib.simulator; > > import java.lang.reflect.Method; > -import java.util.Hashtable; > -import java.util.Vector; > - > import net.sourceforge.cilib.algorithm.Algorithm; > import net.sourceforge.cilib.algorithm.AlgorithmEvent; > import net.sourceforge.cilib.algorithm.AlgorithmFactory; > @@ -34,164 +31,111 @@ import net.sourceforge.cilib.problem.Problem; > import net.sourceforge.cilib.problem.ProblemFactory; > > /** > - * <p> > - * This class represents a single simulation experiment. The experiment is > repeated based on the - * number of samples that the measurement suite > requires. In this implementation each experiment is - * run in its own > thread. Thus, each experiment is run in parallel for a given simulation. - > * </p> > - * <p> > - * The simulation executes a given algorithm on the given problem. > Factories are utilised so that - * the simulation can create as many > alogirthms and problems as it needs to run many experiments. - * </p> > - * <p> > - * The primary purpose of running simulations is to measure the > performance of the given algorithm - * on a given problem. For that reason, > a simulation accepts a measurement suite which it uses to - * record the > performace. > - * </p> > - * @author Edwin Peer > + * A Simulation is a complete simulation that runs as a separate thread. > */ > -public class Simulation extends Thread implements AlgorithmListener { > - private static final long serialVersionUID = 8987667794610802908L; > - private MeasurementSuite measurementSuite; > - private Algorithm[] algorithms; > - private Thread[] threads; > - private Vector<ProgressListener> progressListeners; > - private Hashtable<Algorithm, Double> progress; > - > - public Simulation getClone() { > - return null; > - } > +class Simulation extends Thread implements AlgorithmListener { > + private static final long serialVersionUID = -3733724215662398762L; > + > + private final Simulator simulator; > + private final AlgorithmFactory algorithmFactory; > + private final ProblemFactory problemFactory; > + > + private Algorithm algorithm; > > /** > - * Creates a new instance of Simulation given an algorithm factory, a > problem factory and a - * measurement suite. {@see > net.sourceforge.cilib.XMLObjectFactory} - * @param algorithmFactory The > algorithm factory. > - * @param problemFactory The problem factory. > - * @param measurementSuite The measurement suite. > + * Create a Simulation with the required dependencies. > + * @param simulator The controlling {@code Simulator}. > + * @param algorithmFactory The factory that creates {@code Algorithm} > instances. + * @param problemFactory The factory that creates {@code > Problem} instances. */ > - public Simulation(AlgorithmFactory algorithmFactory, ProblemFactory > problemFactory, MeasurementSuite measurementSuite) { - > - measurementSuite.initialise(); > - this.measurementSuite = measurementSuite; > - progressListeners = new Vector<ProgressListener>(); > - progress = new Hashtable<Algorithm, Double>(); > - > - algorithms = new Algorithm[measurementSuite.getSamples()]; > - threads = new Thread[measurementSuite.getSamples()]; > - for (int i = 0; i < measurementSuite.getSamples(); ++i) { > - algorithms[i] = algorithmFactory.newAlgorithm(); > - threads[i] = new Thread(algorithms[i]); > - algorithms[i].addAlgorithmListener(this); > - Problem problem = problemFactory.newProblem(); > - try { > - Class<? extends Object> current = problem.getClass(); > - // System.out.println(current.getName()); > - while (!current.getSuperclass().equals(Object.class)) { > - current = current.getSuperclass(); > - // System.out.println(current.getName()); > - } > - String type = current.getInterfaces()[0].getName(); > - // System.out.println("type: " + type); > - Class<?> [] parameters = new Class[1]; > - parameters[0] = Class.forName(type); > - // System.out.println("parameters: " + > parameters[0].getName()); - String setMethodName = "set" + > type.substring(type.lastIndexOf(".") + 1); - // > System.out.println("setMethodName: " + setMethodName); - > Method setProblemMethod = algorithms[i].getClass().getMethod(setMethodName, > parameters); - // System.out.println("setProblemMethod: " + > setProblemMethod.getName()); - > setProblemMethod.invoke(algorithms[i], new Object[] {problem}); - > } > - catch (Exception ex) { > - throw new > InitialisationException(algorithms[i].getClass().getName() + " does not > support problems of type " + problem.getClass().getName()); - } > - progress.put(algorithms[i], new Double(0)); > - } > - } > - > - public void initialise() { > - for (Algorithm algorithm : algorithms) > - algorithm.initialise(); > + public Simulation(Simulator simulator, AlgorithmFactory > algorithmFactory, ProblemFactory problemFactory) { + this.simulator > = simulator; > + this.algorithmFactory = algorithmFactory; > + this.problemFactory = problemFactory; > } > > /** > - * Executes all the experiments for this simulation. > + * Execute the simulation. > */ > + @Override > public void run() { > - for (int i = 0; i < measurementSuite.getSamples(); ++i) { > - threads[i].start(); > - } > - for (int i = 0; i < measurementSuite.getSamples(); ++i) { > - try { > - threads[i].join(); > - } > - catch (InterruptedException ex) { > - ex.printStackTrace(); > + algorithm = algorithmFactory.newAlgorithm(); > + algorithm.addAlgorithmListener(this); > + > + Problem problem = problemFactory.newProblem(); > + try { > + Class<? extends Object> current = problem.getClass(); > + > + while (!current.getSuperclass().equals(Object.class)) { > + current = current.getSuperclass(); > } > + > + String type = current.getInterfaces()[0].getName(); > + Class<?> [] parameters = new Class[1]; > + parameters[0] = Class.forName(type); > + String setMethodName = "set" + > type.substring(type.lastIndexOf(".") + 1); + Method > setProblemMethod = algorithm.getClass().getMethod(setMethodName, > parameters); + setProblemMethod.invoke(algorithm, new Object[] > {problem}); + } > + catch (Exception ex) { > + throw new > InitialisationException(algorithm.getClass().getName() + " does not support > problems of type " + problem.getClass().getName()); } > - measurementSuite.getOutputBuffer().close(); > - measurementSuite = null; > - algorithms = null; > - progress = null; > - progressListeners = null; > - threads = null; > + > + algorithm.initialise(); > + algorithm.run(); > } > > /** > - * Terminates all the experiments. > + * Terminate the current simulation. > */ > public void terminate() { > - for (int i = 0; i < measurementSuite.getSamples(); ++i) { > - algorithms[i].terminate(); > - } > + algorithm.terminate(); > } > > /** > - * Adds a listener for progress events. A progress is fired > periodically based on the resolution - * of the measurements. {@see > ProgressEvent} {@see ProgressListener} - * @param The event listener > + * {@inheritDoc} > */ > - public void addProgressListener(ProgressListener listener) { > - progressListeners.add(listener); > + @Override > + public void algorithmStarted(AlgorithmEvent e) { > } > > /** > - * Removes a listener for progress events. > - * @param The event listener > + * {@inheritDoc} > */ > - public void removeProgressListener(ProgressListener listener) { > - progressListeners.remove(listener); > + @Override > + public void algorithmFinished(AlgorithmEvent e) { > + this.simulator.simulationFinished(this); > } > > - private synchronized void notifyProgress() { > - double ave = 0; > - for (Double tmp : progress.values()) { > - ave += tmp.doubleValue(); > - } > - > - ave /= progress.size(); > - > - for (ProgressListener listener : progressListeners) { > - listener.handleProgressEvent(new ProgressEvent(ave)); > - } > + /** > + * {@inheritDoc} > + */ > + @Override > + public void algorithmTerminated(AlgorithmEvent e) { > } > > - public void algorithmStarted(AlgorithmEvent e) { > + /** > + * {@inheritDoc} > + */ > + @Override > + public void iterationCompleted(AlgorithmEvent e) { > + this.simulator.simulationIterationCompleted(this); > } > > - public void algorithmFinished(AlgorithmEvent e) { > - measurementSuite.measure(e.getSource()); > - progress.put(e.getSource(), new > Double(e.getSource().getPercentageComplete())); - notifyProgress(); > + /** > + * {@inheritDoc} > + */ > + @Override > + public AlgorithmListener getClone() { > + return this; > } > > - public void algorithmTerminated(AlgorithmEvent e) { > + /** > + * Obtain the {@code Algorithm} of the current {@code Simulation}. > + * @return The current {@code Algorithm}. > + */ > + public Algorithm getAlgorithm() { > + return algorithm; > } > > - public void iterationCompleted(AlgorithmEvent e) { > - if (e.getSource().getIterations() % > measurementSuite.getResolution() == 0) { - > measurementSuite.measure(e.getSource()); > - progress.put(e.getSource(), new > Double(e.getSource().getPercentageComplete())); - > notifyProgress(); > - } > - } > } > diff --git a/src/main/java/net/sourceforge/cilib/simulator/Simulation.java > b/src/main/java/net/sourceforge/cilib/simulator/Simulator.java similarity > index 52% > copy from src/main/java/net/sourceforge/cilib/simulator/Simulation.java > copy to src/main/java/net/sourceforge/cilib/simulator/Simulator.java > index 377dd5c..3fc3051 100644 > --- a/src/main/java/net/sourceforge/cilib/simulator/Simulation.java > +++ b/src/main/java/net/sourceforge/cilib/simulator/Simulator.java > @@ -21,27 +21,22 @@ > */ > package net.sourceforge.cilib.simulator; > > -import java.lang.reflect.Method; > import java.util.Hashtable; > import java.util.Vector; > > import net.sourceforge.cilib.algorithm.Algorithm; > -import net.sourceforge.cilib.algorithm.AlgorithmEvent; > import net.sourceforge.cilib.algorithm.AlgorithmFactory; > -import net.sourceforge.cilib.algorithm.AlgorithmListener; > -import net.sourceforge.cilib.algorithm.InitialisationException; > -import net.sourceforge.cilib.problem.Problem; > import net.sourceforge.cilib.problem.ProblemFactory; > > /** > * <p> > * This class represents a single simulation experiment. The experiment is > repeated based on the * number of samples that the measurement suite > requires. In this implementation each experiment is - * run in its own > thread. Thus, each experiment is run in parallel for a given simulation. + > * execute in its own thread. Thus, each experiment is execute in parallel > for a given simulation. * </p> > * <p> > * The simulation executes a given algorithm on the given problem. > Factories are utilised so that - * the simulation can create as many > alogirthms and problems as it needs to run many experiments. + * the > simulation can create as many alogirthms and problems as it needs to > execute many experiments. * </p> > * <p> > * The primary purpose of running simulations is to measure the > performance of the given algorithm @@ -50,79 +45,44 @@ import > net.sourceforge.cilib.problem.ProblemFactory; * </p> > * @author Edwin Peer > */ > -public class Simulation extends Thread implements AlgorithmListener { > +public class Simulator { > private static final long serialVersionUID = 8987667794610802908L; > + > private MeasurementSuite measurementSuite; > - private Algorithm[] algorithms; > - private Thread[] threads; > + private Simulation[] simulations; > private Vector<ProgressListener> progressListeners; > - private Hashtable<Algorithm, Double> progress; > - > - public Simulation getClone() { > - return null; > - } > + private Hashtable<Simulation, Double> progress; > > /** > - * Creates a new instance of Simulation given an algorithm factory, a > problem factory and a + * Creates a new instance of Simulator given an > algorithm factory, a problem factory and a * measurement suite. {@see > net.sourceforge.cilib.XMLObjectFactory} * @param algorithmFactory The > algorithm factory. > * @param problemFactory The problem factory. > * @param measurementSuite The measurement suite. > */ > - public Simulation(AlgorithmFactory algorithmFactory, ProblemFactory > problemFactory, MeasurementSuite measurementSuite) { - > + public Simulator(AlgorithmFactory algorithmFactory, ProblemFactory > problemFactory, MeasurementSuite measurementSuite) { > measurementSuite.initialise(); > this.measurementSuite = measurementSuite; > progressListeners = new Vector<ProgressListener>(); > - progress = new Hashtable<Algorithm, Double>(); > + progress = new Hashtable<Simulation, Double>(); > > - algorithms = new Algorithm[measurementSuite.getSamples()]; > - threads = new Thread[measurementSuite.getSamples()]; > + simulations = new Simulation[measurementSuite.getSamples()]; > for (int i = 0; i < measurementSuite.getSamples(); ++i) { > - algorithms[i] = algorithmFactory.newAlgorithm(); > - threads[i] = new Thread(algorithms[i]); > - algorithms[i].addAlgorithmListener(this); > - Problem problem = problemFactory.newProblem(); > - try { > - Class<? extends Object> current = problem.getClass(); > - // System.out.println(current.getName()); > - while (!current.getSuperclass().equals(Object.class)) { > - current = current.getSuperclass(); > - // System.out.println(current.getName()); > - } > - String type = current.getInterfaces()[0].getName(); > - // System.out.println("type: " + type); > - Class<?> [] parameters = new Class[1]; > - parameters[0] = Class.forName(type); > - // System.out.println("parameters: " + > parameters[0].getName()); - String setMethodName = "set" + > type.substring(type.lastIndexOf(".") + 1); - // > System.out.println("setMethodName: " + setMethodName); - > Method setProblemMethod = algorithms[i].getClass().getMethod(setMethodName, > parameters); - // System.out.println("setProblemMethod: " + > setProblemMethod.getName()); - > setProblemMethod.invoke(algorithms[i], new Object[] {problem}); - > } > - catch (Exception ex) { > - throw new > InitialisationException(algorithms[i].getClass().getName() + " does not > support problems of type " + problem.getClass().getName()); - } > - progress.put(algorithms[i], new Double(0)); > + simulations[i] = new Simulation(this, algorithmFactory, > problemFactory); + progress.put(simulations[i], 0.0); > } > } > > - public void initialise() { > - for (Algorithm algorithm : algorithms) > - algorithm.initialise(); > - } > - > /** > * Executes all the experiments for this simulation. > */ > - public void run() { > + public void execute() { > for (int i = 0; i < measurementSuite.getSamples(); ++i) { > - threads[i].start(); > + simulations[i].start(); > } > for (int i = 0; i < measurementSuite.getSamples(); ++i) { > try { > - threads[i].join(); > + simulations[i].join(); > } > catch (InterruptedException ex) { > ex.printStackTrace(); > @@ -130,10 +90,9 @@ public class Simulation extends Thread implements > AlgorithmListener { } > measurementSuite.getOutputBuffer().close(); > measurementSuite = null; > - algorithms = null; > + simulations = null; > progress = null; > progressListeners = null; > - threads = null; > } > > /** > @@ -141,14 +100,14 @@ public class Simulation extends Thread implements > AlgorithmListener { */ > public void terminate() { > for (int i = 0; i < measurementSuite.getSamples(); ++i) { > - algorithms[i].terminate(); > + simulations[i].terminate(); > } > } > > /** > * Adds a listener for progress events. A progress is fired > periodically based on the resolution * of the measurements. {@see > ProgressEvent} {@see ProgressListener} - * @param The event listener > + * @param listener The event listener > */ > public void addProgressListener(ProgressListener listener) { > progressListeners.add(listener); > @@ -156,7 +115,7 @@ public class Simulation extends Thread implements > AlgorithmListener { > > /** > * Removes a listener for progress events. > - * @param The event listener > + * @param listener The event listener > */ > public void removeProgressListener(ProgressListener listener) { > progressListeners.remove(listener); > @@ -175,22 +134,25 @@ public class Simulation extends Thread implements > AlgorithmListener { } > } > > - public void algorithmStarted(AlgorithmEvent e) { > - } > - > - public void algorithmFinished(AlgorithmEvent e) { > - measurementSuite.measure(e.getSource()); > - progress.put(e.getSource(), new > Double(e.getSource().getPercentageComplete())); + /** > + * Indicate that the provided {@code Simulation} has completed. > + * @param simulation The {@code simulation} which has completed. > + */ > + void simulationFinished(Simulation simulation) { > + measurementSuite.measure(simulation.getAlgorithm()); > + progress.put(simulation, new > Double(simulation.getAlgorithm().getPercentageComplete())); > notifyProgress(); > } > > - public void algorithmTerminated(AlgorithmEvent e) { > - } > - > - public void iterationCompleted(AlgorithmEvent e) { > - if (e.getSource().getIterations() % > measurementSuite.getResolution() == 0) { - > measurementSuite.measure(e.getSource()); > - progress.put(e.getSource(), new > Double(e.getSource().getPercentageComplete())); + /** > + * Indicate that the provided {@code Simulation} has completed an > iteration. + * @param simulation The {@code Simulation} that has > completed an iteration. + */ > + void simulationIterationCompleted(Simulation simulation) { > + Algorithm algorithm = simulation.getAlgorithm(); > + if (algorithm.getIterations() % measurementSuite.getResolution() > == 0) { + measurementSuite.measure(simulation.getAlgorithm()); > + progress.put(simulation, new > Double(algorithm.getPercentageComplete())); notifyProgress(); > } > } > diff --git a/src/test/java/net/sourceforge/cilib/xml/XMLFileTest.java > b/src/test/java/net/sourceforge/cilib/xml/XMLFileTest.java index > 9e1ab35..1cb0933 100644 > --- a/src/test/java/net/sourceforge/cilib/xml/XMLFileTest.java > +++ b/src/test/java/net/sourceforge/cilib/xml/XMLFileTest.java > @@ -30,7 +30,7 @@ import javax.xml.parsers.ParserConfigurationException; > import net.sourceforge.cilib.simulator.MeasurementSuite; > import net.sourceforge.cilib.simulator.ProgressListener; > import net.sourceforge.cilib.simulator.ProgressText; > -import net.sourceforge.cilib.simulator.Simulation; > +import net.sourceforge.cilib.simulator.Simulator; > import org.junit.Test; > import org.w3c.dom.Document; > import org.w3c.dom.Element; > @@ -79,7 +79,7 @@ public class XMLFileTest { > XMLProblemFactory problemFactory = new > XMLProblemFactory(doc, (Element) > current.getElementsByTagName("problem").item(0)); XMLObjectFactory > measurementsFactory = new XMLObjectFactory(doc, (Element) > current.getElementsByTagName("measurements").item(0)); MeasurementSuite > suite = (MeasurementSuite) measurementsFactory.newObject(); - > Simulation simulation = new Simulation(algorithmFactory, problemFactory, > suite); + Simulator simulation = new > Simulator(algorithmFactory, problemFactory, suite); if(progress != null) { > simulation.addProgressListener(progress); > } |
From: Gary P. <gpa...@gm...> - 2009-07-24 10:28:11
|
These changes prevent the leaking of ThreadLocal variables. Previously the simulation object graphs were created ahead of time and then executed in threads. This effectively resulted in the ThreadLocal variable being placed on the main thread and _not_ the intended simulation thread. Yes, this is BAD. Created a logical separation and ensured that the object graph construction occurs within the simulation thread and not in the main thread. Tested-by: Wiehann Matthysen <wcm...@gm...> Signed-off-by: Gary Pampara <gpa...@gm...> --- .../java/net/sourceforge/cilib/simulator/Main.java | 9 +- .../sourceforge/cilib/simulator/Simulation.java | 202 +++++++------------- .../simulator/{Simulation.java => Simulator.java} | 108 ++++------- .../net/sourceforge/cilib/xml/XMLFileTest.java | 4 +- 4 files changed, 114 insertions(+), 209 deletions(-) copy src/main/java/net/sourceforge/cilib/simulator/{Simulation.java => Simulator.java} (52%) diff --git a/src/main/java/net/sourceforge/cilib/simulator/Main.java b/src/main/java/net/sourceforge/cilib/simulator/Main.java index 452702a..88246cb 100644 --- a/src/main/java/net/sourceforge/cilib/simulator/Main.java +++ b/src/main/java/net/sourceforge/cilib/simulator/Main.java @@ -58,14 +58,13 @@ public final class Main { XMLProblemFactory problemFactory = new XMLProblemFactory(config, (Element) current.getElementsByTagName("problem").item(0)); XMLObjectFactory measurementsFactory = new XMLObjectFactory(config, (Element) current.getElementsByTagName("measurements").item(0)); MeasurementSuite suite = (MeasurementSuite) measurementsFactory.newObject(); - Simulation simulation = new Simulation(algorithmFactory, problemFactory, suite); + Simulator simulator = new Simulator(algorithmFactory, problemFactory, suite); if(progress != null) { - simulation.addProgressListener(progress); + simulator.addProgressListener(progress); } - simulation.initialise(); - simulation.run(); - simulation = null; + simulator.execute(); + simulator = null; System.gc(); } } diff --git a/src/main/java/net/sourceforge/cilib/simulator/Simulation.java b/src/main/java/net/sourceforge/cilib/simulator/Simulation.java index 377dd5c..57dc736 100644 --- a/src/main/java/net/sourceforge/cilib/simulator/Simulation.java +++ b/src/main/java/net/sourceforge/cilib/simulator/Simulation.java @@ -22,9 +22,6 @@ package net.sourceforge.cilib.simulator; import java.lang.reflect.Method; -import java.util.Hashtable; -import java.util.Vector; - import net.sourceforge.cilib.algorithm.Algorithm; import net.sourceforge.cilib.algorithm.AlgorithmEvent; import net.sourceforge.cilib.algorithm.AlgorithmFactory; @@ -34,164 +31,111 @@ import net.sourceforge.cilib.problem.Problem; import net.sourceforge.cilib.problem.ProblemFactory; /** - * <p> - * This class represents a single simulation experiment. The experiment is repeated based on the - * number of samples that the measurement suite requires. In this implementation each experiment is - * run in its own thread. Thus, each experiment is run in parallel for a given simulation. - * </p> - * <p> - * The simulation executes a given algorithm on the given problem. Factories are utilised so that - * the simulation can create as many alogirthms and problems as it needs to run many experiments. - * </p> - * <p> - * The primary purpose of running simulations is to measure the performance of the given algorithm - * on a given problem. For that reason, a simulation accepts a measurement suite which it uses to - * record the performace. - * </p> - * @author Edwin Peer + * A Simulation is a complete simulation that runs as a separate thread. */ -public class Simulation extends Thread implements AlgorithmListener { - private static final long serialVersionUID = 8987667794610802908L; - private MeasurementSuite measurementSuite; - private Algorithm[] algorithms; - private Thread[] threads; - private Vector<ProgressListener> progressListeners; - private Hashtable<Algorithm, Double> progress; - - public Simulation getClone() { - return null; - } +class Simulation extends Thread implements AlgorithmListener { + private static final long serialVersionUID = -3733724215662398762L; + + private final Simulator simulator; + private final AlgorithmFactory algorithmFactory; + private final ProblemFactory problemFactory; + + private Algorithm algorithm; /** - * Creates a new instance of Simulation given an algorithm factory, a problem factory and a - * measurement suite. {@see net.sourceforge.cilib.XMLObjectFactory} - * @param algorithmFactory The algorithm factory. - * @param problemFactory The problem factory. - * @param measurementSuite The measurement suite. + * Create a Simulation with the required dependencies. + * @param simulator The controlling {@code Simulator}. + * @param algorithmFactory The factory that creates {@code Algorithm} instances. + * @param problemFactory The factory that creates {@code Problem} instances. */ - public Simulation(AlgorithmFactory algorithmFactory, ProblemFactory problemFactory, MeasurementSuite measurementSuite) { - - measurementSuite.initialise(); - this.measurementSuite = measurementSuite; - progressListeners = new Vector<ProgressListener>(); - progress = new Hashtable<Algorithm, Double>(); - - algorithms = new Algorithm[measurementSuite.getSamples()]; - threads = new Thread[measurementSuite.getSamples()]; - for (int i = 0; i < measurementSuite.getSamples(); ++i) { - algorithms[i] = algorithmFactory.newAlgorithm(); - threads[i] = new Thread(algorithms[i]); - algorithms[i].addAlgorithmListener(this); - Problem problem = problemFactory.newProblem(); - try { - Class<? extends Object> current = problem.getClass(); - // System.out.println(current.getName()); - while (!current.getSuperclass().equals(Object.class)) { - current = current.getSuperclass(); - // System.out.println(current.getName()); - } - String type = current.getInterfaces()[0].getName(); - // System.out.println("type: " + type); - Class<?> [] parameters = new Class[1]; - parameters[0] = Class.forName(type); - // System.out.println("parameters: " + parameters[0].getName()); - String setMethodName = "set" + type.substring(type.lastIndexOf(".") + 1); - // System.out.println("setMethodName: " + setMethodName); - Method setProblemMethod = algorithms[i].getClass().getMethod(setMethodName, parameters); - // System.out.println("setProblemMethod: " + setProblemMethod.getName()); - setProblemMethod.invoke(algorithms[i], new Object[] {problem}); - } - catch (Exception ex) { - throw new InitialisationException(algorithms[i].getClass().getName() + " does not support problems of type " + problem.getClass().getName()); - } - progress.put(algorithms[i], new Double(0)); - } - } - - public void initialise() { - for (Algorithm algorithm : algorithms) - algorithm.initialise(); + public Simulation(Simulator simulator, AlgorithmFactory algorithmFactory, ProblemFactory problemFactory) { + this.simulator = simulator; + this.algorithmFactory = algorithmFactory; + this.problemFactory = problemFactory; } /** - * Executes all the experiments for this simulation. + * Execute the simulation. */ + @Override public void run() { - for (int i = 0; i < measurementSuite.getSamples(); ++i) { - threads[i].start(); - } - for (int i = 0; i < measurementSuite.getSamples(); ++i) { - try { - threads[i].join(); - } - catch (InterruptedException ex) { - ex.printStackTrace(); + algorithm = algorithmFactory.newAlgorithm(); + algorithm.addAlgorithmListener(this); + + Problem problem = problemFactory.newProblem(); + try { + Class<? extends Object> current = problem.getClass(); + + while (!current.getSuperclass().equals(Object.class)) { + current = current.getSuperclass(); } + + String type = current.getInterfaces()[0].getName(); + Class<?> [] parameters = new Class[1]; + parameters[0] = Class.forName(type); + String setMethodName = "set" + type.substring(type.lastIndexOf(".") + 1); + Method setProblemMethod = algorithm.getClass().getMethod(setMethodName, parameters); + setProblemMethod.invoke(algorithm, new Object[] {problem}); + } + catch (Exception ex) { + throw new InitialisationException(algorithm.getClass().getName() + " does not support problems of type " + problem.getClass().getName()); } - measurementSuite.getOutputBuffer().close(); - measurementSuite = null; - algorithms = null; - progress = null; - progressListeners = null; - threads = null; + + algorithm.initialise(); + algorithm.run(); } /** - * Terminates all the experiments. + * Terminate the current simulation. */ public void terminate() { - for (int i = 0; i < measurementSuite.getSamples(); ++i) { - algorithms[i].terminate(); - } + algorithm.terminate(); } /** - * Adds a listener for progress events. A progress is fired periodically based on the resolution - * of the measurements. {@see ProgressEvent} {@see ProgressListener} - * @param The event listener + * {@inheritDoc} */ - public void addProgressListener(ProgressListener listener) { - progressListeners.add(listener); + @Override + public void algorithmStarted(AlgorithmEvent e) { } /** - * Removes a listener for progress events. - * @param The event listener + * {@inheritDoc} */ - public void removeProgressListener(ProgressListener listener) { - progressListeners.remove(listener); + @Override + public void algorithmFinished(AlgorithmEvent e) { + this.simulator.simulationFinished(this); } - private synchronized void notifyProgress() { - double ave = 0; - for (Double tmp : progress.values()) { - ave += tmp.doubleValue(); - } - - ave /= progress.size(); - - for (ProgressListener listener : progressListeners) { - listener.handleProgressEvent(new ProgressEvent(ave)); - } + /** + * {@inheritDoc} + */ + @Override + public void algorithmTerminated(AlgorithmEvent e) { } - public void algorithmStarted(AlgorithmEvent e) { + /** + * {@inheritDoc} + */ + @Override + public void iterationCompleted(AlgorithmEvent e) { + this.simulator.simulationIterationCompleted(this); } - public void algorithmFinished(AlgorithmEvent e) { - measurementSuite.measure(e.getSource()); - progress.put(e.getSource(), new Double(e.getSource().getPercentageComplete())); - notifyProgress(); + /** + * {@inheritDoc} + */ + @Override + public AlgorithmListener getClone() { + return this; } - public void algorithmTerminated(AlgorithmEvent e) { + /** + * Obtain the {@code Algorithm} of the current {@code Simulation}. + * @return The current {@code Algorithm}. + */ + public Algorithm getAlgorithm() { + return algorithm; } - public void iterationCompleted(AlgorithmEvent e) { - if (e.getSource().getIterations() % measurementSuite.getResolution() == 0) { - measurementSuite.measure(e.getSource()); - progress.put(e.getSource(), new Double(e.getSource().getPercentageComplete())); - notifyProgress(); - } - } } diff --git a/src/main/java/net/sourceforge/cilib/simulator/Simulation.java b/src/main/java/net/sourceforge/cilib/simulator/Simulator.java similarity index 52% copy from src/main/java/net/sourceforge/cilib/simulator/Simulation.java copy to src/main/java/net/sourceforge/cilib/simulator/Simulator.java index 377dd5c..3fc3051 100644 --- a/src/main/java/net/sourceforge/cilib/simulator/Simulation.java +++ b/src/main/java/net/sourceforge/cilib/simulator/Simulator.java @@ -21,27 +21,22 @@ */ package net.sourceforge.cilib.simulator; -import java.lang.reflect.Method; import java.util.Hashtable; import java.util.Vector; import net.sourceforge.cilib.algorithm.Algorithm; -import net.sourceforge.cilib.algorithm.AlgorithmEvent; import net.sourceforge.cilib.algorithm.AlgorithmFactory; -import net.sourceforge.cilib.algorithm.AlgorithmListener; -import net.sourceforge.cilib.algorithm.InitialisationException; -import net.sourceforge.cilib.problem.Problem; import net.sourceforge.cilib.problem.ProblemFactory; /** * <p> * This class represents a single simulation experiment. The experiment is repeated based on the * number of samples that the measurement suite requires. In this implementation each experiment is - * run in its own thread. Thus, each experiment is run in parallel for a given simulation. + * execute in its own thread. Thus, each experiment is execute in parallel for a given simulation. * </p> * <p> * The simulation executes a given algorithm on the given problem. Factories are utilised so that - * the simulation can create as many alogirthms and problems as it needs to run many experiments. + * the simulation can create as many alogirthms and problems as it needs to execute many experiments. * </p> * <p> * The primary purpose of running simulations is to measure the performance of the given algorithm @@ -50,79 +45,44 @@ import net.sourceforge.cilib.problem.ProblemFactory; * </p> * @author Edwin Peer */ -public class Simulation extends Thread implements AlgorithmListener { +public class Simulator { private static final long serialVersionUID = 8987667794610802908L; + private MeasurementSuite measurementSuite; - private Algorithm[] algorithms; - private Thread[] threads; + private Simulation[] simulations; private Vector<ProgressListener> progressListeners; - private Hashtable<Algorithm, Double> progress; - - public Simulation getClone() { - return null; - } + private Hashtable<Simulation, Double> progress; /** - * Creates a new instance of Simulation given an algorithm factory, a problem factory and a + * Creates a new instance of Simulator given an algorithm factory, a problem factory and a * measurement suite. {@see net.sourceforge.cilib.XMLObjectFactory} * @param algorithmFactory The algorithm factory. * @param problemFactory The problem factory. * @param measurementSuite The measurement suite. */ - public Simulation(AlgorithmFactory algorithmFactory, ProblemFactory problemFactory, MeasurementSuite measurementSuite) { - + public Simulator(AlgorithmFactory algorithmFactory, ProblemFactory problemFactory, MeasurementSuite measurementSuite) { measurementSuite.initialise(); this.measurementSuite = measurementSuite; progressListeners = new Vector<ProgressListener>(); - progress = new Hashtable<Algorithm, Double>(); + progress = new Hashtable<Simulation, Double>(); - algorithms = new Algorithm[measurementSuite.getSamples()]; - threads = new Thread[measurementSuite.getSamples()]; + simulations = new Simulation[measurementSuite.getSamples()]; for (int i = 0; i < measurementSuite.getSamples(); ++i) { - algorithms[i] = algorithmFactory.newAlgorithm(); - threads[i] = new Thread(algorithms[i]); - algorithms[i].addAlgorithmListener(this); - Problem problem = problemFactory.newProblem(); - try { - Class<? extends Object> current = problem.getClass(); - // System.out.println(current.getName()); - while (!current.getSuperclass().equals(Object.class)) { - current = current.getSuperclass(); - // System.out.println(current.getName()); - } - String type = current.getInterfaces()[0].getName(); - // System.out.println("type: " + type); - Class<?> [] parameters = new Class[1]; - parameters[0] = Class.forName(type); - // System.out.println("parameters: " + parameters[0].getName()); - String setMethodName = "set" + type.substring(type.lastIndexOf(".") + 1); - // System.out.println("setMethodName: " + setMethodName); - Method setProblemMethod = algorithms[i].getClass().getMethod(setMethodName, parameters); - // System.out.println("setProblemMethod: " + setProblemMethod.getName()); - setProblemMethod.invoke(algorithms[i], new Object[] {problem}); - } - catch (Exception ex) { - throw new InitialisationException(algorithms[i].getClass().getName() + " does not support problems of type " + problem.getClass().getName()); - } - progress.put(algorithms[i], new Double(0)); + simulations[i] = new Simulation(this, algorithmFactory, problemFactory); + progress.put(simulations[i], 0.0); } } - public void initialise() { - for (Algorithm algorithm : algorithms) - algorithm.initialise(); - } - /** * Executes all the experiments for this simulation. */ - public void run() { + public void execute() { for (int i = 0; i < measurementSuite.getSamples(); ++i) { - threads[i].start(); + simulations[i].start(); } for (int i = 0; i < measurementSuite.getSamples(); ++i) { try { - threads[i].join(); + simulations[i].join(); } catch (InterruptedException ex) { ex.printStackTrace(); @@ -130,10 +90,9 @@ public class Simulation extends Thread implements AlgorithmListener { } measurementSuite.getOutputBuffer().close(); measurementSuite = null; - algorithms = null; + simulations = null; progress = null; progressListeners = null; - threads = null; } /** @@ -141,14 +100,14 @@ public class Simulation extends Thread implements AlgorithmListener { */ public void terminate() { for (int i = 0; i < measurementSuite.getSamples(); ++i) { - algorithms[i].terminate(); + simulations[i].terminate(); } } /** * Adds a listener for progress events. A progress is fired periodically based on the resolution * of the measurements. {@see ProgressEvent} {@see ProgressListener} - * @param The event listener + * @param listener The event listener */ public void addProgressListener(ProgressListener listener) { progressListeners.add(listener); @@ -156,7 +115,7 @@ public class Simulation extends Thread implements AlgorithmListener { /** * Removes a listener for progress events. - * @param The event listener + * @param listener The event listener */ public void removeProgressListener(ProgressListener listener) { progressListeners.remove(listener); @@ -175,22 +134,25 @@ public class Simulation extends Thread implements AlgorithmListener { } } - public void algorithmStarted(AlgorithmEvent e) { - } - - public void algorithmFinished(AlgorithmEvent e) { - measurementSuite.measure(e.getSource()); - progress.put(e.getSource(), new Double(e.getSource().getPercentageComplete())); + /** + * Indicate that the provided {@code Simulation} has completed. + * @param simulation The {@code simulation} which has completed. + */ + void simulationFinished(Simulation simulation) { + measurementSuite.measure(simulation.getAlgorithm()); + progress.put(simulation, new Double(simulation.getAlgorithm().getPercentageComplete())); notifyProgress(); } - public void algorithmTerminated(AlgorithmEvent e) { - } - - public void iterationCompleted(AlgorithmEvent e) { - if (e.getSource().getIterations() % measurementSuite.getResolution() == 0) { - measurementSuite.measure(e.getSource()); - progress.put(e.getSource(), new Double(e.getSource().getPercentageComplete())); + /** + * Indicate that the provided {@code Simulation} has completed an iteration. + * @param simulation The {@code Simulation} that has completed an iteration. + */ + void simulationIterationCompleted(Simulation simulation) { + Algorithm algorithm = simulation.getAlgorithm(); + if (algorithm.getIterations() % measurementSuite.getResolution() == 0) { + measurementSuite.measure(simulation.getAlgorithm()); + progress.put(simulation, new Double(algorithm.getPercentageComplete())); notifyProgress(); } } diff --git a/src/test/java/net/sourceforge/cilib/xml/XMLFileTest.java b/src/test/java/net/sourceforge/cilib/xml/XMLFileTest.java index 9e1ab35..1cb0933 100644 --- a/src/test/java/net/sourceforge/cilib/xml/XMLFileTest.java +++ b/src/test/java/net/sourceforge/cilib/xml/XMLFileTest.java @@ -30,7 +30,7 @@ import javax.xml.parsers.ParserConfigurationException; import net.sourceforge.cilib.simulator.MeasurementSuite; import net.sourceforge.cilib.simulator.ProgressListener; import net.sourceforge.cilib.simulator.ProgressText; -import net.sourceforge.cilib.simulator.Simulation; +import net.sourceforge.cilib.simulator.Simulator; import org.junit.Test; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -79,7 +79,7 @@ public class XMLFileTest { XMLProblemFactory problemFactory = new XMLProblemFactory(doc, (Element) current.getElementsByTagName("problem").item(0)); XMLObjectFactory measurementsFactory = new XMLObjectFactory(doc, (Element) current.getElementsByTagName("measurements").item(0)); MeasurementSuite suite = (MeasurementSuite) measurementsFactory.newObject(); - Simulation simulation = new Simulation(algorithmFactory, problemFactory, suite); + Simulator simulation = new Simulator(algorithmFactory, problemFactory, suite); if(progress != null) { simulation.addProgressListener(progress); } -- 1.6.3.3 |
From: Gary P. <gpa...@gm...> - 2009-07-24 10:28:06
|
As most of you are aware, we have had some issues in the past with ThreadLocal's and strange behaviour. We managed to find the reason why and have solved the issue. Big thanks to Wiehann for helping with the fix. Gary Pampara (1): Prevent thread local variable polution. .../java/net/sourceforge/cilib/simulator/Main.java | 9 +- .../sourceforge/cilib/simulator/Simulation.java | 202 +++++++------------- .../simulator/{Simulation.java => Simulator.java} | 108 ++++------- .../net/sourceforge/cilib/xml/XMLFileTest.java | 4 +- 4 files changed, 114 insertions(+), 209 deletions(-) copy src/main/java/net/sourceforge/cilib/simulator/{Simulation.java => Simulator.java} (52%) |
From: Andries E. <en...@cs...> - 2009-07-24 07:23:54
|
Agreed. Gary Pampara wrote: > I have to agree. > > I dislike "zombie" code. It creates fud. > > I know Fabien developed the Sequence alignment stuff, but the SetPSO is also in > the bioinf package. We would need to extract that before anything is removed. > > Regards, > Gary > > On Thursday 23 July 2009 12:27:33 Andrich van Wyk wrote: > >> Hallo >> >> Regarding the classes contained in the cilib.bioinf classes, could anyone >> who is actively using them please post to the list and let us know? >> >> Otherwise I propose their removal or deprecation (and removal in an >> upcoming release) with the objective of maintaining library quality; as, at >> the moment, the code is outdated, embarrassingly messy and more >> importantly, untested. Anyone else with an opinion on this matter? >> > > ------------------------------------------------------------------------------ > _______________________________________________ > cilib-devel mailing list > cil...@li... > https://lists.sourceforge.net/lists/listinfo/cilib-devel > -- ========================================================== Prof Andries P Engelbrecht South African Research Chair in Artificial Intelligence Fundamentals of Computational Swarm Intelligence, John Wiley & Sons, December 2005. Computational Intelligence, An Introduction John Wiley & Sons, Second edition to be published soon Computational Intelligence Research Group: http://cirg.cs.up.ac.za Department of Computer Science School of Information Technology University of Pretoria Pretoria 0002, South Africa Tel: +27 12 420 3578 Fax: +27 12 362 5188 http://www.cs.up.ac.za/~engel ================================================ This message and attachments are subject to a disclaimer. Please refer to www.it.up.ac.za/documentation/governance/disclaimer/ for full details. / Hierdie boodskap en aanhangsels is aan 'n vrywaringsklousule onderhewig. Volledige besonderhede is by www.it.up.ac.za/documentation/governance/disclaimer/ beskikbaar. |
From: Gary P. <gpa...@gm...> - 2009-07-24 07:14:37
|
Added the ability to initialize strategy parameters for the EC. This is independent of the type of EC. Signed-off-by: Gary Pampara <gpa...@gm...> --- src/main/java/net/sourceforge/cilib/ec/EC.java | 19 +++++++++++++++++++ 1 files changed, 19 insertions(+), 0 deletions(-) diff --git a/src/main/java/net/sourceforge/cilib/ec/EC.java b/src/main/java/net/sourceforge/cilib/ec/EC.java index 4da0692..63bf99a 100644 --- a/src/main/java/net/sourceforge/cilib/ec/EC.java +++ b/src/main/java/net/sourceforge/cilib/ec/EC.java @@ -29,7 +29,10 @@ import net.sourceforge.cilib.algorithm.population.SinglePopulationBasedAlgorithm import net.sourceforge.cilib.cooperative.ParticipatingAlgorithm; import net.sourceforge.cilib.ec.iterationstrategies.GeneticAlgorithmIterationStrategy; import net.sourceforge.cilib.entity.Entity; +import net.sourceforge.cilib.entity.EntityType; import net.sourceforge.cilib.entity.Topology; +import net.sourceforge.cilib.entity.initialization.InitializationStrategy; +import net.sourceforge.cilib.entity.initialization.NullInitializationStrategy; import net.sourceforge.cilib.entity.topologies.GBestTopology; import net.sourceforge.cilib.problem.Fitness; import net.sourceforge.cilib.problem.OptimisationProblem; @@ -48,6 +51,8 @@ public class EC extends SinglePopulationBasedAlgorithm implements ParticipatingA private IterationStrategy<EC> iterationStrategy; private Topology<? extends Entity> topology; + private InitializationStrategy<Entity> strategyParameterInitialization; + /** * Create a new instance of {@code EC}. */ @@ -57,6 +62,8 @@ public class EC extends SinglePopulationBasedAlgorithm implements ParticipatingA this.iterationStrategy = new GeneticAlgorithmIterationStrategy(); this.topology = new GBestTopology<Individual>(); + + this.strategyParameterInitialization = new NullInitializationStrategy<Entity>(); } /** @@ -84,6 +91,10 @@ public class EC extends SinglePopulationBasedAlgorithm implements ParticipatingA @Override public void performInitialisation() { this.initialisationStrategy.initialise(this.topology, this.problem); + + for (Entity entity : topology) { + this.strategyParameterInitialization.initialize(EntityType.Individual.PHENOTYPES, entity); + } } /** @@ -194,4 +205,12 @@ public class EC extends SinglePopulationBasedAlgorithm implements ParticipatingA this.topology.getBestEntity().calculateFitness(); } + public InitializationStrategy<Entity> getStrategyParameterInitialization() { + return strategyParameterInitialization; + } + + public void setStrategyParameterInitialization(InitializationStrategy<Entity> strategyParameterInitialization) { + this.strategyParameterInitialization = strategyParameterInitialization; + } + } -- 1.6.3.3 |
From: Gary P. <gpa...@gm...> - 2009-07-24 07:14:35
|
Added the ability to apply some strategy parameters to the Individuals within the EC. This is the initial WIP for this feature, I expect more changes to come in as the feature matures. Gary Pampara (1): Strategy parameter initialization for EC. src/main/java/net/sourceforge/cilib/ec/EC.java | 22 +++- |
From: Gary P. <gpa...@gm...> - 2009-07-23 12:26:45
|
Hi all, This is an update to highlight the recent changes that have been merged into master. Please take note of the following: * Initialization strategies * All Population based algorithms perform some sort of initialization. This may vary from a simple candidate solution random initialization to the initialization of a particle's velocity. Please note that the initialization strategies have been generalized into a single package. Please inspect the net.sourceforge.cilib.entity.initialization package to see the new generalized strategies. * Functions * Functions have been made generic. The format of the interface has been altered to be Function<From, To>. As an example, ContinuousFunction is actually a Function<Vector, Double> whereby a Vector is converted into a Double value based on some quantization process (like the fitness calculation). Regards, Gary |
From: Gary P. <gpa...@gm...> - 2009-07-23 11:43:28
|
I have to agree. I dislike "zombie" code. It creates fud. I know Fabien developed the Sequence alignment stuff, but the SetPSO is also in the bioinf package. We would need to extract that before anything is removed. Regards, Gary On Thursday 23 July 2009 12:27:33 Andrich van Wyk wrote: > Hallo > > Regarding the classes contained in the cilib.bioinf classes, could anyone > who is actively using them please post to the list and let us know? > > Otherwise I propose their removal or deprecation (and removal in an > upcoming release) with the objective of maintaining library quality; as, at > the moment, the code is outdated, embarrassingly messy and more > importantly, untested. Anyone else with an opinion on this matter? |
From: Andrich v. W. <avw...@gm...> - 2009-07-23 10:27:40
|
Hallo Regarding the classes contained in the cilib.bioinf classes, could anyone who is actively using them please post to the list and let us know? Otherwise I propose their removal or deprecation (and removal in an upcoming release) with the objective of maintaining library quality; as, at the moment, the code is outdated, embarrassingly messy and more importantly, untested. Anyone else with an opinion on this matter? -- Andrich van Wyk |
From: Gary P. <gpa...@gm...> - 2009-07-21 06:45:39
|
Looks fine. I've changed the return types for a few methods to use the actual implementation. Minor etc. Also, I'm going to change the creation method of the UniqueSelection to be package access - I don't want UniqueSelection to be instantiated directly, you should be going through the Selection class to get an instance. The only other issue might be the exclude() method, should we worry about that or should we assume that the user will sort it out? On Monday 20 July 2009 14:52:41 leo...@gm... wrote: > From: Leo Langenhoven <lla...@cs...> > > This patch should be applied along with the UPDATED:Implemented the > Rand-to-best DE target creation strategy patch. > > Added functionality so that random selection will be unqiue. This was > achieved as follows: > > - Added a RandomSyntax interface, this interface defines the random > methods. > - Added a UniqueSyntax interface, this interface defines a method > called unique, that returns a new instance of SelectionSyntax. > - Added a UniqueSelection class. This class inherets from > SelectionSyntax as well as RandomSyntax. It has a similar implementation > to Selection, but the rand(int) method has the added constraint that the > random elements selected are all unique. > - The Selection class now inherets from the above two interfaces as > well as SelectionSyntax. The unique method returns an instance of > UniqueSelection that contains the same elements as the Selection object. > > The DE creation strategies were updated to use the new functionality. > --- > .../operators/creation/RandCreationStrategy.java | 2 +- > .../creation/RandToBestCreationStrategy.java | 2 +- > .../cilib/util/selection/RandomSyntax.java | 32 +++ > .../cilib/util/selection/Selection.java | 13 +- > .../cilib/util/selection/SelectionSyntax.java | 5 - > .../cilib/util/selection/UniqueSelection.java | 236 > ++++++++++++++++++++ .../cilib/util/selection/UniqueSyntax.java | > 28 +++ > .../cilib/util/selection/UniqueSelectionTest.java | 94 ++++++++ > 8 files changed, 403 insertions(+), 9 deletions(-) > create mode 100644 > src/main/java/net/sourceforge/cilib/util/selection/RandomSyntax.java create > mode 100644 > src/main/java/net/sourceforge/cilib/util/selection/UniqueSelection.java > create mode 100644 > src/main/java/net/sourceforge/cilib/util/selection/UniqueSyntax.java create > mode 100644 > src/test/java/net/sourceforge/cilib/util/selection/UniqueSelectionTest.java > > diff --git > a/src/main/java/net/sourceforge/cilib/entity/operators/creation/RandCreatio >nStrategy.java > b/src/main/java/net/sourceforge/cilib/entity/operators/creation/RandCreatio >nStrategy.java index 59cd174..56733b8 100644 > --- > a/src/main/java/net/sourceforge/cilib/entity/operators/creation/RandCreatio >nStrategy.java +++ > b/src/main/java/net/sourceforge/cilib/entity/operators/creation/RandCreatio >nStrategy.java @@ -74,7 +74,7 @@ public class RandCreationStrategy > implements CreationStrategy { @Override > public Entity create(Entity targetEntity, Entity current, Topology<? > extends Entity> topology) { Random random = new MersenneTwister(); > - List<Entity> participants = > Selection.from(topology.asList()).exclude(Arrays.asList(targetEntity, > current)).random(random, > (int)numberOfDifferenceVectors.getParameter()).select(); + > List<Entity> participants = > Selection.from(topology.asList()).exclude(Arrays.asList(targetEntity, > current)).unique().random(random, > (int)numberOfDifferenceVectors.getParameter()).select(); Vector > differenceVector = determineDistanceVector(participants); > > Vector targetVector = (Vector) > targetEntity.getCandidateSolution(); diff --git > a/src/main/java/net/sourceforge/cilib/entity/operators/creation/RandToBestC >reationStrategy.java > b/src/main/java/net/sourceforge/cilib/entity/operators/creation/RandToBestC >reationStrategy.java index 7797796..1566d8d 100644 > --- > a/src/main/java/net/sourceforge/cilib/entity/operators/creation/RandToBestC >reationStrategy.java +++ > b/src/main/java/net/sourceforge/cilib/entity/operators/creation/RandToBestC >reationStrategy.java @@ -69,7 +69,7 @@ public class > RandToBestCreationStrategy extends RandCreationStrategy { Topology<? > extends Entity> topology) { > Entity bestEntity = topology.getBestEntity(); > Random random = new MersenneTwister(); > - List<Entity> participants = > Selection.from(topology.asList()).exclude(Arrays.asList(targetEntity, > bestEntity, current)).random(random, > (int)numberOfDifferenceVectors.getParameter()).select(); + List<Entity> > participants = > Selection.from(topology.asList()).exclude(Arrays.asList(targetEntity, > bestEntity, current)).unique().random(random, > (int)numberOfDifferenceVectors.getParameter()).select(); Vector > differenceVector = determineDistanceVector(participants); > > Vector targetVector = ((Vector) > targetEntity.getCandidateSolution()).multiply(1 - > greedynessParameter.getParameter()); diff --git > a/src/main/java/net/sourceforge/cilib/util/selection/RandomSyntax.java > b/src/main/java/net/sourceforge/cilib/util/selection/RandomSyntax.java new > file mode 100644 > index 0000000..cd39e67 > --- /dev/null > +++ b/src/main/java/net/sourceforge/cilib/util/selection/RandomSyntax.java > @@ -0,0 +1,32 @@ > +/** > + * Copyright (C) 2003 - 2009 > + * Computational Intelligence Research Group (CIRG@UP) > + * Department of Computer Science > + * University of Pretoria > + * South Africa > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License as published by > + * the Free Software Foundation; either version 2 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 General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program; if not, write to the Free Software > + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 > USA + */ > +package net.sourceforge.cilib.util.selection; > + > +import net.sourceforge.cilib.math.random.generator.Random; > + > +public interface RandomSyntax<E> { > + > + public SelectionSyntax<E> random(Random random); > + > + public SelectionSyntax<E> random(Random random, int number); > + > +} > diff --git > a/src/main/java/net/sourceforge/cilib/util/selection/Selection.java > b/src/main/java/net/sourceforge/cilib/util/selection/Selection.java index > 6b01214..d331bb0 100644 > --- a/src/main/java/net/sourceforge/cilib/util/selection/Selection.java > +++ b/src/main/java/net/sourceforge/cilib/util/selection/Selection.java > @@ -61,7 +61,7 @@ import > net.sourceforge.cilib.util.selection.weighing.Weighing; * @param <E> The > comparable type. > * @author gpampara > */ > -public final class Selection<E> implements SelectionSyntax<E> { > +public final class Selection<E> implements SelectionSyntax<E>, > RandomSyntax<E>, UniqueSyntax<E> { > > private List<Entry<E>> elements; > > @@ -88,6 +88,15 @@ public final class Selection<E> implements > SelectionSyntax<E> { public static <T> Selection<T> from(List<? extends T> > elements) { return new Selection<T>(elements); > } > + > + /** > + * Create an instance of {@code UniqueSelection} that contains the > same elements as this Selection + * @return An instance of {@code > UniqueSelection} with identical elements. + */ > + @Override > + public UniqueSelection<E> unique(){ > + return UniqueSelection.from(this.select()); > + } > > /** > * Obtain a random element from the provided list. This is a > convenience method @@ -307,7 +316,7 @@ public final class Selection<E> > implements SelectionSyntax<E> { /** > * Create a new {@code Entry}. This constructor is private > intentionall * @param element The element to decorate. > + */ - private Entry(E element) { > + Entry(E element) { > this.element = element; > this.weight = 0.0; > } > diff --git > a/src/main/java/net/sourceforge/cilib/util/selection/SelectionSyntax.java > b/src/main/java/net/sourceforge/cilib/util/selection/SelectionSyntax.java > index 2680d4b..4485c97 100644 > --- > a/src/main/java/net/sourceforge/cilib/util/selection/SelectionSyntax.java > +++ > b/src/main/java/net/sourceforge/cilib/util/selection/SelectionSyntax.java > @@ -22,7 +22,6 @@ > package net.sourceforge.cilib.util.selection; > > import java.util.List; > -import net.sourceforge.cilib.math.random.generator.Random; > import net.sourceforge.cilib.util.selection.ordering.Ordering; > import net.sourceforge.cilib.util.selection.weighing.Weighing; > > @@ -46,10 +45,6 @@ public interface SelectionSyntax<E> { > > public SelectionSyntax<E> exclude(List<? extends E> exclusion); > > - public SelectionSyntax<E> random(Random random); > - > - public SelectionSyntax<E> random(Random random, int number); > - > public List<E> select(); > > public List<Selection.Entry<E>> entries(); > diff --git > a/src/main/java/net/sourceforge/cilib/util/selection/UniqueSelection.java > b/src/main/java/net/sourceforge/cilib/util/selection/UniqueSelection.java > new file mode 100644 > index 0000000..fde9913 > --- /dev/null > +++ > b/src/main/java/net/sourceforge/cilib/util/selection/UniqueSelection.java > @@ -0,0 +1,236 @@ > +/** > + * Copyright (C) 2003 - 2009 > + * Computational Intelligence Research Group (CIRG@UP) > + * Department of Computer Science > + * University of Pretoria > + * South Africa > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License as published by > + * the Free Software Foundation; either version 2 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 General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program; if not, write to the Free Software > + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 > USA + */ > +/** > + * > + */ > +package net.sourceforge.cilib.util.selection; > + > +import java.util.ArrayList; > +import java.util.Collection; > +import java.util.List; > + > +import net.sourceforge.cilib.math.random.generator.Random; > +import net.sourceforge.cilib.util.selection.Selection.Entry; > +import net.sourceforge.cilib.util.selection.ordering.Ordering; > +import net.sourceforge.cilib.util.selection.weighing.Weighing; > + > +/** > + * <p> > + * A {@code UniqueSelection} is an abstraction that allows operations to > be applied to + * a collection instace that result in a selection of list > elements, based on a varied of + * potential combination of operators. > {@code UniqueSelection} is similar to {@code Selection}, except that the > {#code random(int)} method + * will return a list of unique random entries. > + * </p> > + * @param <E> The comparable type. > + * @author gpampara > + * @author leo > + */ > +public class UniqueSelection<E> implements SelectionSyntax<E>, > RandomSyntax<E> { + private List<Entry<E>> elements; > + > + /** > + * Assign the UniqueSelection to take palce on the provided > collection. The + * collection is copied to ensure that the original > collection reference is + * not altered. > + * @param elements The elements on which the selection should take > place. + */ > + private UniqueSelection(Collection<? extends E> elements) { > + this.elements = new ArrayList<Entry<E>>(elements.size()); > + > + for (E element : elements) { > + this.elements.add(new Entry<E>(element)); > + } > + } > + > + /** > + * Create a selection that will operate on the provided collection. > + * @param <T> The comparable type. > + * @param elements The collection of elements to operate on. > + * @return A UniqueSelection based on the provided collection. > + */ > + public static <T> UniqueSelection<T> from(List<? extends T> elements) > { + return new UniqueSelection<T>(elements); > + } > + > + /** > + * Apply the provided ordering on the current selection. The result of > the + * operation will result in a modified selection. > + * @param ordering The ordering to orderBy. > + * @return A selection upon which the ordering has been applied. > + * @throws UnsupportedOperationException if the ordering cannot be > applied. + */ > + @Override > + public SelectionSyntax<E> orderBy(Ordering<E> ordering) { > + boolean result = ordering.order(this.elements); > + > + if (result) { > + return this; > + } > + > + throw new UnsupportedOperationException("The ordering [" + > ordering.getClass().getSimpleName() + "] " + + "cannot be > applied to the selection. Please ensure that the intention of the ordering > is correct."); + } > + > + /** > + * Apply the provided weighing on the current selection. The result of > the + * operation will result in new weighed selection. > + * @param weighing The weighing to weighWith. > + * @return A selection upon which the weighing has been applied. > + */ > + @Override > + public SelectionSyntax<E> weigh(Weighing<E> weighing) { > + boolean result = weighing.weigh(this.elements); > + > + if (result) { > + return this; > + } > + > + throw new UnsupportedOperationException("The weighing [" + > weighing.getClass().getSimpleName() + "]" + + "cannot be > applied to the selection. Please ensure that the intention of the weighing > is correct."); + } > + > + /** > + * Obtain the first result from the current selection. These elements > are returned + * from the front of the current selection. > + * @return A selection containing the first element. > + */ > + @Override > + public SelectionSyntax<E> first() { > + this.elements = this.elements.subList(0, 1); > + return this; > + } > + > + /** > + * Obtain the frist {@code number} of elements from the current > selection. These + * elements are returned from the front of the > current selection. + * @param number The number of elements to return. > + * @return A selection containing the first {@code number} elements. > + */ > + @Override > + public SelectionSyntax<E> first(int number) { > + this.elements = this.elements.subList(0, number); > + return this; > + } > + > + /** > + * Obtain the last element contained within the current selection. > + * @return A selection containing the last element. > + */ > + @Override > + public SelectionSyntax<E> last() { > + this.elements = this.elements.subList(this.elements.size() - 1, > this.elements.size()); + return this; > + } > + > + /** > + * Obtain the last {@code number} of elements from the current > selection. + * @param number The number of elements to select. > + * @return A selection containing the last {@code number} of elements. > + */ > + @Override > + public SelectionSyntax<E> last(int number) { > + this.elements = this.elements.subList(this.elements.size() - > number, this.elements.size()); + return this; > + } > + > + /** > + * Obtain the result of the selection. > + * @return A list of elements that the selection has selected. > + */ > + @Override > + public List<E> select() { > + List<E> result = new ArrayList<E>(); > + > + for (Entry<E> entry : elements) { > + result.add(entry.getElement()); > + } > + > + return result; > + } > + > + /** > + * Obtain the first result of the selection. > + * @return The first element returned by the selection. > + */ > + @Override > + public E singleSelect() { > + return this.elements.get(0).getElement(); > + } > + > + /** > + * Obtain the list of internal {@code Entry} instances. > + * @return The list of internal {@code Entry} instances. > + */ > + @Override > + public List<Selection.Entry<E>> entries() { > + return this.elements; > + } > + > + /** > + * Remove any {@code Entry}'s from {@code elements} that are also > contained in {@code exclusion}. + * @return A selection containing the > remaining elements which do not occur in {@code exclusion}. + */ > + @Override > + public UniqueSelection<E> exclude(List<? extends E> exclusion) { > + for(int i = elements.size() - 1; i >= 0; --i){ > + Entry element = elements.get(i); > + if(exclusion.contains(element.getElement())) > + elements.remove(element); > + } > + return this; > + } > + > + /** > + * Obtain a random element from the current UniqueSelection. > + * @param random The random number to be used in the selection. > + * @return A selection containing a random element from the original > {@code elements} member. + */ > + @Override > + public SelectionSyntax<E> random(Random random) { > + Entry<E> randomEntry = Selection.randomFrom(elements, random); > + elements.clear(); > + elements.add(randomEntry); > + return this; > + } > + > + /** > + * Obtain a random number of elements from the current Selection. Each > of these elements has to be unqiue + * @param random The random number > to be used in the selection. + * @param number The number of elements > to select. > + * @return A selection containing the random elements from the > original {@code elements} member. + */ > + @Override > + public SelectionSyntax<E> random(Random random, int number) { > + if(number > elements.size()) > + throw new RuntimeException("Unable to select " + number + " unique > elements, current Selection only contains " + elements.size() + " > elements."); + List<Entry<E>> tmp = new ArrayList<Entry<E>>(number); > + > + for (int i = 0; i < number; i++) { > + int index = random.nextInt(elements.size()); > + tmp.add(elements.get(index)); > + elements.remove(index); > + } > + elements = tmp; > + return this; > + } > + > +} > diff --git > a/src/main/java/net/sourceforge/cilib/util/selection/UniqueSyntax.java > b/src/main/java/net/sourceforge/cilib/util/selection/UniqueSyntax.java new > file mode 100644 > index 0000000..d33b36e > --- /dev/null > +++ b/src/main/java/net/sourceforge/cilib/util/selection/UniqueSyntax.java > @@ -0,0 +1,28 @@ > +/** > + * Copyright (C) 2003 - 2009 > + * Computational Intelligence Research Group (CIRG@UP) > + * Department of Computer Science > + * University of Pretoria > + * South Africa > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License as published by > + * the Free Software Foundation; either version 2 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 General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program; if not, write to the Free Software > + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 > USA + */ > +package net.sourceforge.cilib.util.selection; > + > +public interface UniqueSyntax<E> { > + > + public SelectionSyntax<E> unique(); > + > +} > \ No newline at end of file > diff --git > a/src/test/java/net/sourceforge/cilib/util/selection/UniqueSelectionTest.ja >va > b/src/test/java/net/sourceforge/cilib/util/selection/UniqueSelectionTest.ja >va new file mode 100644 > index 0000000..06fed0c > --- /dev/null > +++ > b/src/test/java/net/sourceforge/cilib/util/selection/UniqueSelectionTest.ja >va @@ -0,0 +1,94 @@ > +/** > + * Copyright (C) 2003 - 2009 > + * Computational Intelligence Research Group (CIRG@UP) > + * Department of Computer Science > + * University of Pretoria > + * South Africa > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License as published by > + * the Free Software Foundation; either version 2 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 General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program; if not, write to the Free Software > + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 > USA + */ > +package net.sourceforge.cilib.util.selection; > + > +import java.util.Arrays; > +import java.util.List; > + > +import net.sourceforge.cilib.math.random.generator.MersenneTwister; > +import net.sourceforge.cilib.math.random.generator.SeedSelectionStrategy; > +import net.sourceforge.cilib.math.random.generator.Seeder; > +import net.sourceforge.cilib.math.random.generator.ZeroSeederStrategy; > + > +import org.junit.Assert; > +import org.junit.Test; > + > +public class UniqueSelectionTest { > + @Test > + public void lastSelection() { > + List<Integer> elements = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, > 9); + List<Integer> selection = > Selection.from(elements).last(3).select(); + > + Assert.assertEquals(3, selection.size()); > + Assert.assertTrue(selection.contains(7)); > + Assert.assertTrue(selection.contains(8)); > + Assert.assertTrue(selection.contains(9)); > + > + selection = Selection.from(elements).last().select(); > + Assert.assertEquals(1, selection.size()); > + Assert.assertEquals(9, selection.get(0).intValue()); > + } > + > + @Test > + public void firstSelection() { > + List<Integer> elements = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, > 9); + List<Integer> selection = > Selection.from(elements).first(3).select(); + > + Assert.assertEquals(3, selection.size()); > + Assert.assertEquals(1, selection.get(0).intValue()); > + Assert.assertEquals(2, selection.get(1).intValue()); > + Assert.assertEquals(3, selection.get(2).intValue()); > + > + selection = Selection.from(elements).first().select(); > + Assert.assertEquals(1, selection.get(0).intValue()); > + Assert.assertEquals(1, selection.size()); > + } > + > + @Test > + public void exclusionSelection(){ > + List<Integer> elements = Arrays.asList(1, 2, 3, 4, 5, 6, 7); > + List<Integer> exlusionElements = Arrays.asList(1, 2, 4, 6); > + List<Integer> selection = > Selection.from(elements).exclude(exlusionElements).first(3).select(); + > Assert.assertEquals(3, selection.size()); > + Assert.assertEquals(3, selection.get(0).intValue()); > + Assert.assertEquals(5, selection.get(1).intValue()); > + Assert.assertEquals(7, selection.get(2).intValue()); > + } > + > + @Test > + public void randomSelection(){ > + SeedSelectionStrategy seedStrategy = Seeder.getSeederStrategy(); > + Seeder.setSeederStrategy(new ZeroSeederStrategy()); > + > + try { > + List<Integer> elements = Arrays.asList(1, 2, 3, 4); > + List<Integer> selection = > UniqueSelection.from(elements).random(new MersenneTwister(), 4).select(); > + Assert.assertEquals(4, selection.size()); > + Assert.assertEquals(4, selection.get(0).intValue()); > + Assert.assertEquals(1, selection.get(1).intValue()); > + Assert.assertEquals(3, selection.get(2).intValue()); > + Assert.assertEquals(2, selection.get(3).intValue()); > + } finally { > + Seeder.setSeederStrategy(seedStrategy); > + } > + } > +} |
From: Gary P. <gpa...@gm...> - 2009-07-21 06:40:20
|
Glad to see that this is resolved :) I particularly liked the comment about the use of Algorithm.get(). Bad static state! BAD! Thanks, Gary On Monday 20 July 2009 15:22:18 Andrich van Wyk wrote: > Fixed bug that caused the unit tests of VisualPositionUpdateStategy and > ExplorerBee to fail, the issue was related to bees leaving the function > domain, which should be allowed. The tests were also expanded. > Removed dependecy of ExplorerBee on Algorithm.get(), enabling easier > testing. Changed exactly when bees calculate fitnesses, new implementation > is slightly more efficient. Changed a number of method names and made > slight changes to the abc.xml file. Fixed a number of code style and > reported PMD issues. > --- > src/main/java/net/sourceforge/cilib/boa/ABC.java | 141 > +++++++++++++++++--- .../net/sourceforge/cilib/boa/bee/AbstractBee.java | > 34 +++++- > .../net/sourceforge/cilib/boa/bee/ExplorerBee.java | 82 ++++++++++-- > .../net/sourceforge/cilib/boa/bee/HoneyBee.java | 2 + > .../net/sourceforge/cilib/boa/bee/OnlookerBee.java | 8 +- > .../net/sourceforge/cilib/boa/bee/WorkerBee.java | 28 +++- > .../BeePositionUpdateStrategy.java | 7 + > .../VisualPositionUpdateStategy.java | 8 +- > .../java/net/sourceforge/cilib/boa/ABCTest.java | 8 +- > .../cilib/boa/bees/ExplorerBeeTest.java | 51 +++---- > .../VisualPositionUpdateStategyTest.java | 25 ++-- > xml/abc.xml | 136 > ++++++++----------- 12 files changed, 359 insertions(+), 171 deletions(-) > > diff --git a/src/main/java/net/sourceforge/cilib/boa/ABC.java > b/src/main/java/net/sourceforge/cilib/boa/ABC.java index e35e0a6..614912a > 100644 > --- a/src/main/java/net/sourceforge/cilib/boa/ABC.java > +++ b/src/main/java/net/sourceforge/cilib/boa/ABC.java > @@ -63,19 +63,16 @@ import > net.sourceforge.cilib.problem.OptimisationSolution; * > */ > public class ABC extends SinglePopulationBasedAlgorithm { > - private static final long serialVersionUID = 7918711449442012960L; > > + private static final long serialVersionUID = 7918711449442012960L; > private Topology<HoneyBee> workerBees; //keeps > references to the worker bees private Topology<HoneyBee> onlookerBees; > //keeps references to the onlooker bees private Topology<HoneyBee> > hive; //keeps references to all the bees (workers and > onlookers) - > private ExplorerBee explorerBee; //explorer bee > private SelectionStrategy dancingSelectionStrategy; //bee dancing > selection strategy - > private ControlParameter workerBeePercentage; //control > parameter for number of worker bees private ControlParameter forageLimit; > //control parameter for the forage limit private > ControlParameter explorerBeeUpdateLimit; //control parameter to limit > the explorer bee position updates per iteration - > private HoneyBee bestBee; //reference to > best solution found so far > > /** > @@ -134,7 +131,7 @@ public class ABC extends SinglePopulationBasedAlgorithm > { this.initialisationStrategy.initialise(hive, this.optimisationProblem); > > int i; > - int numWorkerBees = (int) > (workerBeePercentage.getParameter()*hive.size()); + int > numWorkerBees = (int) (workerBeePercentage.getParameter() * hive.size()); > for (i = 0; i < numWorkerBees; i++) { > WorkerBee bee = (WorkerBee) hive.get(i); > bee.setForageLimit(this.forageLimit.getClone()); > @@ -158,11 +155,9 @@ public class ABC extends > SinglePopulationBasedAlgorithm { protected void algorithmIteration() { > for (HoneyBee bee : workerBees) { > bee.updatePosition(); > - bee.calculateFitness(); > if (bestBee == null) { > bestBee = bee.getClone(); > - } > - else if > (bee.getBestFitness().compareTo(bestBee.getBestFitness()) > 0) { + > } else if (bee.getBestFitness().compareTo(bestBee.getBestFitness()) > 0) > { bestBee = bee.getClone(); > } > } > @@ -171,11 +166,9 @@ public class ABC extends > SinglePopulationBasedAlgorithm { HoneyBee selectedBee = > dancingSelectionStrategy.select(workerBees); > bee.setPosition(selectedBee.getPosition().getClone()); > bee.updatePosition(); > - bee.calculateFitness(); > if (bestBee == null) { > bestBee = bee; > - } > - else if > (bee.getBestFitness().compareTo(bestBee.getBestFitness()) > 0) { + > } else if (bee.getBestFitness().compareTo(bestBee.getBestFitness()) > 0) > { bestBee = bee; > } > } > @@ -186,8 +179,9 @@ public class ABC extends SinglePopulationBasedAlgorithm > { */ > @Override > public OptimisationSolution getBestSolution() { > - if (this.bestBee == null) > + if (this.bestBee == null) { > throw new InitialisationException("Best solution cannot be > determined before algorithm is run"); + } > > return new OptimisationSolution(bestBee.getPosition(), > bestBee.getFitness()); } > @@ -208,14 +202,6 @@ public class ABC extends > SinglePopulationBasedAlgorithm { return this.hive; > } > > - public Topology<HoneyBee> getWorkerTopology() { > - return this.workerBees; > - } > - > - public Topology<HoneyBee> getOnlookerTopology() { > - return this.onlookerBees; > - } > - > /** > * {@inheritDoc} > */ > @@ -224,41 +210,156 @@ public class ABC extends > SinglePopulationBasedAlgorithm { throw new > UnsupportedOperationException("Method not implemented"); } > > + /** > + * Gets the bee dancing selection strategy. > + * @return the bee dancing selection strategy. > + */ > public SelectionStrategy getDancingSelectionStrategy() { > return dancingSelectionStrategy; > } > > + /** > + * Sets the bee dancinc selection strategy. > + * @param dancingSelectionStrategy the new bee dancing selection > strategy. + */ > public void setDancingSelectionStrategy( > SelectionStrategy dancingSelectionStrategy) { > this.dancingSelectionStrategy = dancingSelectionStrategy; > } > > + /** > + * Gets the explorer bee. > + * @return the explorer bee. > + */ > public ExplorerBee getExplorerBee() { > return this.explorerBee; > } > > + /** > + * Sets the explorer bee. > + * @param explorerBee the new explorer bee. > + */ > + public void setExplorerBee(ExplorerBee explorerBee) { > + this.explorerBee = explorerBee; > + } > + > + /** > + * Gets the {@code ControlParameter} specifying the number of worker > bees. + * @return the {@code ControlParameter} specifying the number of > worker bees. + */ > public ControlParameter getWorkerBeeNumber() { > return workerBeePercentage; > } > > + /** > + * Gets the {@code ControlParameter} specifying the percentage of > worker bees. + * @return the {@code ControlParameter} specifying the > percentage of worker bees. + */ > + public ControlParameter getWorkerBeePercentage() { > + return workerBeePercentage; > + } > + > + /** > + * Sets the {@code ControlParameter} specifying the percentage of > worker bees.. + * @param workerBeeNumber the new {@code > ControlParameter} specifying the percentage of worker bees. + */ > public void setWorkerBeePercentage(ControlParameter workerBeeNumber) { > this.workerBeePercentage = workerBeeNumber; > } > > + /** > + * Gets the {@code ControlParameter} specifying the foraging limit. > + * @return the {@code ControlParameter} specifying the foraging > limit. + */ > public ControlParameter getForageLimit() { > return forageLimit; > } > > + /** > + * Sets the {@code ControlParameter} specifying the foraging limit. > + * @param forageThreshold the new {@code ControlParameter} > specifying the foraging limit. + */ > public void setForageLimit(ControlParameter forageThreshold) { > this.forageLimit = forageThreshold; > } > > + /** > + * Gets the {@code ControlParameter} specifying the limit to how many > times the explorer bee can update positions. + * @return the {@code > ControlParameter} specifying the limit to how many times the explorer bee > can update positions. + */ > public ControlParameter getExplorerBeeUpdateLimit() { > return explorerBeeUpdateLimit; > } > > + /** > + * Sets the {@code ControlParameter} specifying the limit to how many > times the explorer bee can update positions. + * @param > explorerBeeUpdateLimit the {@code ControlParameter} specifying the limit > to how many times the explorer bee can update positions. + */ > public void setExplorerBeeUpdateLimit(ControlParameter > explorerBeeUpdateLimit) { this.explorerBeeUpdateLimit = > explorerBeeUpdateLimit; > } > > + /** > + * Gets the bee with the highest fitness during the algorithm > execution. + * @return the bee with the highest fitness. > + */ > + public HoneyBee getBestBee() { > + return bestBee; > + } > + > + /** > + * Sets the bee with the highest fitness during the algorithm > execution. + * @param bestBee the new bee with the highest fitness. > + */ > + public void setBestBee(HoneyBee bestBee) { > + this.bestBee = bestBee; > + } > + > + /** > + * Get the {@code Topology} containing all the bees in the hive. > + * @return the {@code Topology} containing all bees in the hive. > + */ > + public Topology<HoneyBee> getHive() { > + return hive; > + } > + > + /** > + * Set the {@code Topology} containing all the bees in the hive. > + * @param hive the new {@code Topology} containing all bees in the > hive. + */ > + public void setHive(Topology<HoneyBee> hive) { > + this.hive = hive; > + } > + > + /** > + * Get the {@code Topology} containing the onlooker bees. > + * @return the {@code Topology} containing the onlooker bees. > + */ > + public Topology<HoneyBee> getOnlookerBees() { > + return onlookerBees; > + } > + > + /** > + * Set the {@code Topology} containing the onlooker bees. > + * @param onlookerBees the new {@code Topology} containing the > onlooker bees. + */ > + public void setOnlookerBees(Topology<HoneyBee> onlookerBees) { > + this.onlookerBees = onlookerBees; > + } > + > + /** > + * Get the {@code Topology} containing the worker bees. > + * @return the {@code Topology} containing the worker bees. > + */ > + public Topology<HoneyBee> getWorkerBees() { > + return workerBees; > + } > + > + /** > + * Set the {@code Topology} containing the worker bees. > + * @param workerBees the new {@code Topology} containing the worker > bees. + */ > + public void setWorkerBees(Topology<HoneyBee> workerBees) { > + this.workerBees = workerBees; > + } > } > diff --git a/src/main/java/net/sourceforge/cilib/boa/bee/AbstractBee.java > b/src/main/java/net/sourceforge/cilib/boa/bee/AbstractBee.java index > 1830192..ddef6ac 100644 > --- a/src/main/java/net/sourceforge/cilib/boa/bee/AbstractBee.java > +++ b/src/main/java/net/sourceforge/cilib/boa/bee/AbstractBee.java > @@ -21,7 +21,6 @@ > */ > package net.sourceforge.cilib.boa.bee; > > -import net.sourceforge.cilib.type.types.Types; > import > net.sourceforge.cilib.boa.positionupdatestrategies.BeePositionUpdateStrateg >y; import > net.sourceforge.cilib.boa.positionupdatestrategies.VisualPositionUpdateStat >egy; import net.sourceforge.cilib.entity.AbstractEntity; > @@ -40,8 +39,8 @@ import net.sourceforge.cilib.type.types.container.Vector; > * > */ > public abstract class AbstractBee extends AbstractEntity implements > HoneyBee { - private static final long serialVersionUID = > 7005546673802814268L; > > + private static final long serialVersionUID = 7005546673802814268L; > protected BeePositionUpdateStrategy positionUpdateStrategy; > protected SelectionStrategy targetSelectionStrategy; > protected int dimension; > @@ -80,6 +79,14 @@ public abstract class AbstractBee extends AbstractEntity > implements HoneyBee { } > > /** > + * Sets the position update strategy of the bee. > + * @param positionUpdateStrategy the new position update strategy. > + */ > + public void setPositionUpdateStrategy(BeePositionUpdateStrategy > positionUpdateStrategy) { + this.positionUpdateStrategy = > positionUpdateStrategy; > + } > + > + /** > * {@inheritDoc} > */ > @Override > @@ -118,6 +125,14 @@ public abstract class AbstractBee extends > AbstractEntity implements HoneyBee { } > > /** > + * Sets the dimension of the solution used by the bee. > + * @param dimension the new dimension of the solution. > + */ > + public void setDimension(int dimension) { > + this.dimension = dimension; > + } > + > + /** > * {@inheritDoc} > */ > public Vector getPosition() { > @@ -151,4 +166,19 @@ public abstract class AbstractBee extends > AbstractEntity implements HoneyBee { throw new > UnsupportedOperationException("Reinitialise not implemented for > AbstractBee"); } > > + /** > + * Gets the target selection strategy, for selecting bees to follow in > position updates. + * @return the target selection strategy. > + */ > + public SelectionStrategy getTargetSelectionStrategy() { > + return targetSelectionStrategy; > + } > + > + /** > + * Sets the target selection strategy, for selecting bees to follow in > position updates. + * @param targetSelectionStrategy the new target > selection strategy. + */ > + public void setTargetSelectionStrategy(SelectionStrategy > targetSelectionStrategy) { + this.targetSelectionStrategy = > targetSelectionStrategy; > + } > } > diff --git a/src/main/java/net/sourceforge/cilib/boa/bee/ExplorerBee.java > b/src/main/java/net/sourceforge/cilib/boa/bee/ExplorerBee.java index > 3497aad..68f6ac4 100644 > --- a/src/main/java/net/sourceforge/cilib/boa/bee/ExplorerBee.java > +++ b/src/main/java/net/sourceforge/cilib/boa/bee/ExplorerBee.java > @@ -21,11 +21,10 @@ > */ > package net.sourceforge.cilib.boa.bee; > > -import net.sourceforge.cilib.algorithm.Algorithm; > import net.sourceforge.cilib.controlparameter.ConstantControlParameter; > import net.sourceforge.cilib.controlparameter.ControlParameter; > import net.sourceforge.cilib.math.random.generator.MersenneTwister; > -import net.sourceforge.cilib.math.random.generator.Seeder; > +import net.sourceforge.cilib.math.random.generator.Random; > import net.sourceforge.cilib.type.types.container.Vector; > import net.sourceforge.cilib.util.Cloneable; > > @@ -38,9 +37,9 @@ import net.sourceforge.cilib.util.Cloneable; > * > */ > public class ExplorerBee implements Cloneable { > - private static final long serialVersionUID = 1068799535328234923L; > > - private MersenneTwister random; //generates a random > position + private static final long serialVersionUID = > 1068799535328234923L; + private Random random; //generates a > random position private int previousUpdatedIteration; //used to check > whether the algorithm has entered a new iteration private int > numberOfUpdates; //how many have occured in current iteration > private ControlParameter explorerBeeUpdateLimit; > @@ -70,24 +69,24 @@ public class ExplorerBee implements Cloneable { > /** > * {@inheritDoc} > */ > + @Override > public ExplorerBee getClone() { > return new ExplorerBee(this); > } > > /** > * Verifies it is allowed for a worker bee to convert to an explorer > bee. - * @precondition an algorithm is on the algorithm stack. > + * @param currentIteration the current iteration of the algorithm on > the stack. * @return whether the search is allowed. > */ > - public boolean searchAllowed() { > - int currentIteration = Algorithm.get().getIterations(); > + public boolean searchAllowed(int currentIteration) { > if (previousUpdatedIteration == currentIteration) { > //TODO: Add variable number of updates allowed > - if (Double.compare(numberOfUpdates, > explorerBeeUpdateLimit.getParameter()) < 0) + if > (Double.compare(numberOfUpdates, explorerBeeUpdateLimit.getParameter()) < > 0) { return true; > + } > return false; > - } > - else { > + } else { > numberOfUpdates = 0; > } > return true; > @@ -95,27 +94,82 @@ public class ExplorerBee implements Cloneable { > > /** > * Returns a new random position. > - * @precondition an algorithm is on the algorithm stack. > * @precondition the search is allowed. > + * @param currentIteration the current iteration of the algorithm on > the stack. * @param position random position with same dimension and bounds > as given position. * @return The new position. > */ > - public Vector getNewPosition(Vector position) { > - previousUpdatedIteration = Algorithm.get().getIterations(); > + public Vector getNewPosition(int currentIteration, Vector position) { > + previousUpdatedIteration = currentIteration; > numberOfUpdates++; > > Vector newPosition = position.getClone(); > - newPosition.randomize(new MersenneTwister()); > + newPosition.randomize(random); > > return newPosition; > } > > + /** > + * Gets the explorer bee update limit. > + * @return the explorer bee update limit. > + */ > public ControlParameter getExplorerBeeUpdateLimit() { > return explorerBeeUpdateLimit; > } > > + /** > + * Sets the explorer bee update limit. > + * @param explorerBeeUpdateLimit the new explorer bee update limit. > + */ > public void setExplorerBeeUpdateLimit(ControlParameter > explorerBeeUpdateLimit) { this.explorerBeeUpdateLimit = > explorerBeeUpdateLimit; > } > > + /** > + * Gets the number of updates done for the current iteration. > + * @return the number of iterations done for the current iteration. > + */ > + public int getNumberOfUpdates() { > + return numberOfUpdates; > + } > + > + /** > + * Sets the number of updates done for the current iteration. > + * @param numberOfUpdates the new number of iterations done for the > current iteration. + */ > + public void setNumberOfUpdates(int numberOfUpdates) { > + this.numberOfUpdates = numberOfUpdates; > + } > + > + /** > + * Gets the last iteration an update was done. > + * @return the last iteration an update was done. > + */ > + public int getPreviousUpdatedIteration() { > + return previousUpdatedIteration; > + } > + > + /** > + * Sets the last iteration an update was done. > + * @param previousUpdatedIteration the last iteration an update was > done. + */ > + public void setPreviousUpdatedIteration(int previousUpdatedIteration) > { + this.previousUpdatedIteration = previousUpdatedIteration; + } > + > + /** > + * Gets the random number generator to use for generating new > positions. + * @return > + */ > + public Random getRandom() { > + return random; > + } > + > + /** > + * Sets the random number generator to use for generating new > positions. + * @param random the new random number generator to use for > generating new positions. + */ > + public void setRandom(Random random) { > + this.random = random; > + } > } > diff --git a/src/main/java/net/sourceforge/cilib/boa/bee/HoneyBee.java > b/src/main/java/net/sourceforge/cilib/boa/bee/HoneyBee.java index > 1d35188..413c3bf 100644 > --- a/src/main/java/net/sourceforge/cilib/boa/bee/HoneyBee.java > +++ b/src/main/java/net/sourceforge/cilib/boa/bee/HoneyBee.java > @@ -35,11 +35,13 @@ public interface HoneyBee extends Entity { > /** > * {@inheritDoc} > */ > + @Override > public HoneyBee getClone(); > > /** > * {@inheritDoc} > */ > + @Override > public Fitness getFitness(); > > /** > diff --git a/src/main/java/net/sourceforge/cilib/boa/bee/OnlookerBee.java > b/src/main/java/net/sourceforge/cilib/boa/bee/OnlookerBee.java index > a9ff676..15e3d02 100644 > --- a/src/main/java/net/sourceforge/cilib/boa/bee/OnlookerBee.java > +++ b/src/main/java/net/sourceforge/cilib/boa/bee/OnlookerBee.java > @@ -39,6 +39,10 @@ public class OnlookerBee extends AbstractBee implements > HoneyBee { public OnlookerBee() { > } > > + /** > + * Copy constructor. > + * @param bee the original bee to copy. > + */ > public OnlookerBee(AbstractBee bee) { > super(bee); > } > @@ -65,10 +69,10 @@ public class OnlookerBee extends AbstractBee implements > HoneyBee { @Override > public void updatePosition() { > ABC algorithm = (ABC) Algorithm.get(); > - HoneyBee target = > targetSelectionStrategy.select(algorithm.getWorkerTopology()); + > HoneyBee target = > targetSelectionStrategy.select(algorithm.getWorkerBees()); > > while (target == this) { > - target = > targetSelectionStrategy.select(algorithm.getWorkerTopology()); + > target = targetSelectionStrategy.select(algorithm.getWorkerBees()); } > > this.positionUpdateStrategy.updatePosition(this, target); > diff --git a/src/main/java/net/sourceforge/cilib/boa/bee/WorkerBee.java > b/src/main/java/net/sourceforge/cilib/boa/bee/WorkerBee.java index > bc34ae3..33339d8 100644 > --- a/src/main/java/net/sourceforge/cilib/boa/bee/WorkerBee.java > +++ b/src/main/java/net/sourceforge/cilib/boa/bee/WorkerBee.java > @@ -31,8 +31,8 @@ import > net.sourceforge.cilib.controlparameter.ControlParameter; * @author Andrich > */ > public class WorkerBee extends AbstractBee implements HoneyBee { > - private static final long serialVersionUID = 3657591650621784765L; > > + private static final long serialVersionUID = 3657591650621784765L; > private ControlParameter forageLimit; > private int failureCount; > > @@ -68,20 +68,20 @@ public class WorkerBee extends AbstractBee implements > HoneyBee { @Override > public void updatePosition() { > ABC algorithm = (ABC) Algorithm.get(); > - HoneyBee target = > targetSelectionStrategy.select(algorithm.getWorkerTopology()); + > HoneyBee target = > targetSelectionStrategy.select(algorithm.getWorkerBees()); > > while (target == this) { > - target = > targetSelectionStrategy.select(algorithm.getWorkerTopology()); + > target = targetSelectionStrategy.select(algorithm.getWorkerBees()); } > > boolean success = this.positionUpdateStrategy.updatePosition(this, > target); if (!success) { > failureCount++; > - if (failureCount >= forageLimit.getParameter()) { > + if (failureCount >= forageLimit.getParameter()) { > failureCount = 0; > ExplorerBee explorerBee = algorithm.getExplorerBee(); > - if (explorerBee.searchAllowed()) { > - > this.setPosition(explorerBee.getNewPosition(this.getPosition())); + > if (explorerBee.searchAllowed(algorithm.getIterations())) { + > > this.setPosition(explorerBee.getNewPosition(algorithm.getIterations(), > this.getPosition())); } > } > } > @@ -102,4 +102,20 @@ public class WorkerBee extends AbstractBee implements > HoneyBee { public void setForageLimit(ControlParameter forageLimit) { > this.forageLimit = forageLimit; > } > + > + /** > + * Gets the failure count. > + * @return the number of times the bee has failed to find a better > position. + */ > + public int getFailureCount() { > + return failureCount; > + } > + > + /** > + * Sets the failure count. > + * @param failureCount the new number of times the bee has failed to > find a better position. + */ > + public void setFailureCount(int failureCount) { > + this.failureCount = failureCount; > + } > } > diff --git > a/src/main/java/net/sourceforge/cilib/boa/positionupdatestrategies/BeePosit >ionUpdateStrategy.java > b/src/main/java/net/sourceforge/cilib/boa/positionupdatestrategies/BeePosit >ionUpdateStrategy.java index 465bc5c..082cf8c 100644 > --- > a/src/main/java/net/sourceforge/cilib/boa/positionupdatestrategies/BeePosit >ionUpdateStrategy.java +++ > b/src/main/java/net/sourceforge/cilib/boa/positionupdatestrategies/BeePosit >ionUpdateStrategy.java @@ -35,8 +35,15 @@ public interface > BeePositionUpdateStrategy extends Cloneable { /** > * {@inheritDoc} > */ > + @Override > public BeePositionUpdateStrategy getClone(); > > + /** > + * Updates the position of the given bee. > + * @param bee the bee the position update is for. > + * @param other another bee that the position update might use to > update the position. + * @return whether the position update was > successful. > + */ > public boolean updatePosition(HoneyBee bee, HoneyBee other); > > } > diff --git > a/src/main/java/net/sourceforge/cilib/boa/positionupdatestrategies/VisualPo >sitionUpdateStategy.java > b/src/main/java/net/sourceforge/cilib/boa/positionupdatestrategies/VisualPo >sitionUpdateStategy.java index c1bd803..6461a03 100644 > --- > a/src/main/java/net/sourceforge/cilib/boa/positionupdatestrategies/VisualPo >sitionUpdateStategy.java +++ > b/src/main/java/net/sourceforge/cilib/boa/positionupdatestrategies/VisualPo >sitionUpdateStategy.java @@ -21,8 +21,8 @@ > */ > package net.sourceforge.cilib.boa.positionupdatestrategies; > > -import net.sourceforge.cilib.algorithm.Algorithm; > import net.sourceforge.cilib.boa.bee.HoneyBee; > +import net.sourceforge.cilib.entity.EntityType; > import net.sourceforge.cilib.math.random.generator.MersenneTwister; > import net.sourceforge.cilib.problem.Fitness; > import net.sourceforge.cilib.type.types.Real; > @@ -63,10 +63,12 @@ public class VisualPositionUpdateStategy implements > BeePositionUpdateStrategy { newPosition.set(j, newValue); > > //Determine if new position is better than old and update > - Fitness oldFitness = > Algorithm.get().getOptimisationProblem().getFitness(oldPosition, false); - > Fitness newFitness = > Algorithm.get().getOptimisationProblem().getFitness(newPosition, false); + > Fitness oldFitness = bee.getFitness().getClone(); > + bee.calculateFitness(); > + Fitness newFitness = bee.getFitness(); > if (newFitness.compareTo(oldFitness) < 0) { > bee.setPosition(oldPosition); > + bee.getProperties().put(EntityType.FITNESS, oldFitness); > return false; > } > > diff --git a/src/test/java/net/sourceforge/cilib/boa/ABCTest.java > b/src/test/java/net/sourceforge/cilib/boa/ABCTest.java index > 31c8014..c3fc238 100644 > --- a/src/test/java/net/sourceforge/cilib/boa/ABCTest.java > +++ b/src/test/java/net/sourceforge/cilib/boa/ABCTest.java > @@ -51,19 +51,19 @@ public class ABCTest { > > abc.initialise(); > assertEquals(abc.getTopology().size(), 100); > - assertEquals(abc.getWorkerTopology().size(), 70); > - assertEquals(abc.getOnlookerTopology().size(), 30); > + assertEquals(abc.getWorkerBees().size(), 70); > + assertEquals(abc.getOnlookerBees().size(), 30); > HashMap<Type, Type> map = new HashMap<Type, Type>(); > > for (HoneyBee bee : abc.getTopology()) > { > map.put(bee.getCandidateSolution(), > bee.getCandidateSolution()); } > - for (HoneyBee bee : abc.getWorkerTopology()) > + for (HoneyBee bee : abc.getWorkerBees()) > { > map.put(bee.getCandidateSolution(), > bee.getCandidateSolution()); } > - for (HoneyBee bee : abc.getOnlookerTopology()) > + for (HoneyBee bee : abc.getOnlookerBees()) > { > map.put(bee.getCandidateSolution(), > bee.getCandidateSolution()); } > diff --git > a/src/test/java/net/sourceforge/cilib/boa/bees/ExplorerBeeTest.java > b/src/test/java/net/sourceforge/cilib/boa/bees/ExplorerBeeTest.java index > 87750cf..b3d916f 100644 > --- a/src/test/java/net/sourceforge/cilib/boa/bees/ExplorerBeeTest.java > +++ b/src/test/java/net/sourceforge/cilib/boa/bees/ExplorerBeeTest.java > @@ -21,13 +21,11 @@ > */ > package net.sourceforge.cilib.boa.bees; > > -import static org.junit.Assert.assertEquals; > -import static org.junit.Assert.assertTrue; > > -import java.util.ArrayList; > > import > net.sourceforge.cilib.algorithm.initialisation.ClonedPopulationInitialisati >onStrategy; import net.sourceforge.cilib.boa.ABC; > +import net.sourceforge.cilib.boa.bee.ExplorerBee; > import net.sourceforge.cilib.boa.bee.WorkerBee; > import net.sourceforge.cilib.controlparameter.ConstantControlParameter; > import net.sourceforge.cilib.functions.ContinuousFunction; > @@ -35,9 +33,9 @@ import > net.sourceforge.cilib.functions.continuous.unconstrained.Rastrigin; import > net.sourceforge.cilib.problem.FunctionMinimisationProblem; import > net.sourceforge.cilib.stoppingcondition.MaximumIterations; import > net.sourceforge.cilib.stoppingcondition.StoppingCondition; -import > net.sourceforge.cilib.type.types.Real; > import net.sourceforge.cilib.type.types.container.Vector; > > +import org.junit.Assert; > import org.junit.Before; > import org.junit.Test; > > @@ -66,34 +64,27 @@ public class ExplorerBeeTest { > } > > @Test > - public void testGetNewPosition() { > + public void testSearchAllowed() { > //get up a position with bounds > - Vector currentPosition; > - > - //update position with explorer bee since forage threshold is -1 > - ArrayList<Vector> oldPositions = new ArrayList<Vector>(); > - for (int k = 0; k < abc.getWorkerTopology().size(); k++) { > - > oldPositions.add((Vector)abc.getWorkerTopology().get(k).getPosition().getCl >one()); - } > - abc.performIteration(); > + Vector oldPosition = > abc.getWorkerBees().get(0).getPosition().getClone();; + //update > position with explorer bee > + ExplorerBee explorerBee = abc.getExplorerBee(); > + Assert.assertTrue(explorerBee.searchAllowed(1)); > + explorerBee.getNewPosition(1,oldPosition); > + //only one update is allowed for the same iteration, this must > therefore be false... + > Assert.assertTrue(!explorerBee.searchAllowed(1)); > + //and this true. > + Assert.assertTrue(explorerBee.searchAllowed(2)); > + } > > - boolean explorerUpdateOccured = false; > - //assertions > - for (int k = 0; k < abc.getWorkerTopology().size(); k++) { > - boolean allDimensionsChanged = true; > - currentPosition = > (Vector)abc.getWorkerTopology().get(k).getCandidateSolution(); - > assertEquals(5,currentPosition.size()); > - for (int i = 0; i < currentPosition.size(); i++) { > - assertTrue(((Real)currentPosition.get(i)).getReal() != > Double.NaN); - > assertTrue(!Double.isInfinite(((Real)currentPosition.get(i)).getReal())); - > allDimensionsChanged = allDimensionsChanged & > (Double.compare(((Real)currentPosition.get(i)).getReal(), - > ((Real)oldPositions.get(k).get(i)).getReal())!=0); - > assertTrue(((Real)currentPosition.get(i)).getReal() <= 5.0); - > assertTrue(((Real)currentPosition.get(i)).getReal() >= -5.0); - > } > - explorerUpdateOccured = explorerUpdateOccured | > allDimensionsChanged; - } > - assertTrue(explorerUpdateOccured); > + @Test > + public void testGetNewPosition() { > + //get up a position with bounds > + Vector oldPosition = > abc.getWorkerBees().get(0).getPosition().getClone();; + //update > position with explorer bee > + ExplorerBee explorerBee = abc.getExplorerBee(); > + Vector newPosition = explorerBee.getNewPosition(1,oldPosition); > + Assert.assertTrue(!oldPosition.equals(newPosition)); > } > > } > diff --git > a/src/test/java/net/sourceforge/cilib/boa/positionupdatestrategies/VisualPo >sitionUpdateStategyTest.java > b/src/test/java/net/sourceforge/cilib/boa/positionupdatestrategies/VisualPo >sitionUpdateStategyTest.java index a5468f2..5b0b535 100644 > --- > a/src/test/java/net/sourceforge/cilib/boa/positionupdatestrategies/VisualPo >sitionUpdateStategyTest.java +++ > b/src/test/java/net/sourceforge/cilib/boa/positionupdatestrategies/VisualPo >sitionUpdateStategyTest.java @@ -21,7 +21,6 @@ > */ > package net.sourceforge.cilib.boa.positionupdatestrategies; > > - > import static org.junit.Assert.assertEquals; > import static org.junit.Assert.assertTrue; > import > net.sourceforge.cilib.algorithm.initialisation.ClonedPopulationInitialisati >onStrategy; @@ -31,6 +30,7 @@ import > net.sourceforge.cilib.boa.bee.WorkerBee; > import net.sourceforge.cilib.controlparameter.ConstantControlParameter; > import net.sourceforge.cilib.functions.ContinuousFunction; > import net.sourceforge.cilib.functions.continuous.unconstrained.Rastrigin; > +import net.sourceforge.cilib.problem.Fitness; > import net.sourceforge.cilib.problem.FunctionMinimisationProblem; > import net.sourceforge.cilib.stoppingcondition.MaximumIterations; > import net.sourceforge.cilib.stoppingcondition.StoppingCondition; > @@ -41,6 +41,7 @@ import org.junit.Before; > import org.junit.Test; > > public class VisualPositionUpdateStategyTest { > + > private ABC abc; > > @Before > @@ -59,7 +60,7 @@ public class VisualPositionUpdateStategyTest { > initStrategy.setEntityType(bee); > abc.setInitialisationStrategy(initStrategy); > abc.setWorkerBeePercentage(new ConstantControlParameter(0.5)); > - abc.setForageLimit(new ConstantControlParameter(-1)); > + abc.setForageLimit(new > ConstantControlParameter(Integer.MAX_VALUE)); > abc.addStoppingCondition(condition); > abc.setOptimisationProblem(problem); > abc.initialise(); > @@ -67,16 +68,20 @@ public class VisualPositionUpdateStategyTest { > > @Test > public void testUpdatePosition() { > - HoneyBee bee = abc.getWorkerTopology().get(0); > + HoneyBee bee = abc.getWorkerBees().get(0); > abc.performIteration(); > - Vector currentPosition = (Vector)bee.getPosition(); > - assertEquals(10,currentPosition.size()); > + Fitness oldFitness = bee.getFitness().getClone(); > + abc.performIteration(); > + Vector currentPosition = (Vector) bee.getPosition(); > + System.out.println(currentPosition); > + assertEquals(10, currentPosition.size()); > for (int i = 0; i < currentPosition.size(); i++) { > - assertTrue(((Real)currentPosition.get(i)).getReal() != > Double.NaN); - > assertTrue(!Double.isInfinite(((Real)currentPosition.get(i)).getReal())); - > assertTrue(((Real)currentPosition.get(i)).getReal() <= 5.0); - > assertTrue(((Real)currentPosition.get(i)).getReal() >= -5.0); + > assertTrue(((Real) currentPosition.get(i)).getReal() != > Double.NaN); + assertTrue(!Double.isInfinite(((Real) > currentPosition.get(i)).getReal())); } > + Fitness newFitness = bee.getFitness(); > + System.out.println(oldFitness.getValue()); > + System.out.println(newFitness.getValue()); > + assertTrue(newFitness.compareTo(oldFitness) >= 0); > } > - > } > diff --git a/xml/abc.xml b/xml/abc.xml > index f06c5c0..f62675f 100644 > --- a/xml/abc.xml > +++ b/xml/abc.xml > @@ -5,84 +5,60 @@ > <!ATTLIST measurements id ID #IMPLIED> > ]> > <simulator> > - <algorithms> > - <algorithm id="abc" class="boa.ABC"> > - <initialisationStrategy > class="algorithm.initialisation.ClonedPopulationInitialisationStrategy" > entityNumber="40"> - <entityType class="boa.bee.WorkerBee"/> > - </initialisationStrategy> > - <addStoppingCondition class="stoppingcondition.MaximumIterations" > maximumIterations="1000"> - </addStoppingCondition> > - <dancingSelectionStrategy > class="entity.operators.selection.RouletteWheelSelectionStrategy"/> - > <workerBeePercentage class="controlparameter.ConstantControlParameter" > parameter="0.5"/> - <forageLimit > class="controlparameter.ConstantControlParameter" parameter="500"/> - > <explorerBeeUpdateLimit class="controlparameter.ConstantControlParameter" > parameter="1"/> - </algorithm> > - <algorithm id="pso" class="pso.PSO"> > - <addStoppingCondition class="stoppingcondition.MaximumIterations" > maximumIterations="1000"> - </addStoppingCondition> > - </algorithm> > - </algorithms> > - <problems> > - <problem id="spherical" class="problem.FunctionMinimisationProblem"> > - <function class="functions.continuous.unconstrained.Spherical"/> > - </problem> > - <problem id="rosenbrock" class="problem.FunctionMinimisationProblem"> > - <function class="functions.continuous.unconstrained.Rosenbrock"/> > - </problem> > - <problem id="rastrigin" class="problem.FunctionMinimisationProblem"> > - <function class="functions.continuous.unconstrained.Rastrigin"/> > - </problem> > - <problem id="griewank" class="problem.FunctionMinimisationProblem"> > - <function class="functions.continuous.unconstrained.Griewank"/> > - </problem> > - <problem id="quadric" class="problem.FunctionMinimisationProblem"> > - <function class="functions.continuous.Quadric"/> > - </problem> > - <problem id="michalewicz" class="problem.FunctionMinimisationProblem"> > - <function class="functions.continuous.unconstrained.Michalewicz"/> > - </problem> > - <problem id="hyperellipsoid" > class="problem.FunctionMinimisationProblem"> - <function > class="functions.continuous.HyperEllipsoid"/> > - </problem> > - <problem id="easom" class="problem.FunctionMinimisationProblem"> > - <function class="functions.continuous.unconstrained.Easom"/> > - </problem> > - <problem id="colville" class="problem.FunctionMinimisationProblem"> > - <function class="functions.continuous.Colville"/> > - </problem> > - <problem id="bohachevsky1" > class="problem.FunctionMinimisationProblem"> - <function > class="functions.continuous.unconstrained.Bohachevsky1"/> - </problem> > - <problem id="ackley" class="problem.FunctionMinimisationProblem"> > - <function class="functions.continuous.unconstrained.Ackley"/> > - </problem> > - <problem id="schwefel" class="problem.FunctionMinimisationProblem"> > - <function class="functions.continuous.Schwefel"/> > - </problem> > - </problems> > - <measurements id="fitness" class="simulator.MeasurementSuite" > resolution="10" samples="30"> - <addMeasurement > class="measurement.single.Fitness"/> > - </measurements> > - <simulations> > - <simulation> > - <algorithm idref="abc"/> > - <problem idref="spherical"/> > - <measurements idref="fitness" file="data/test/abc_rastrigin.txt"/> > - </simulation> > - <simulation> > - <algorithm idref="abc"/> > - <problem idref="griewank"/> > - <measurements idref="fitness" file="data/test/abc_griewank.txt"/> > - </simulation> > - <!--<simulation> > - <algorithm idref="abc"/> > - <problem idref="rastrigin"/> > - <measurements idref="fitness" > file="data/test/abc_rastrigin.txt"/> - </simulation> > - <simulation> > - <algorithm idref="abc"/> > - <problem idref="rosenbrock"/> > - <measurements idref="fitness" > file="data/test/abc_rosenbrock.txt"/> - </simulation>--> > - </simulations> > + <algorithms> > + <algorithm id="abc" class="boa.ABC"> > + <initialisationStrategy > class="algorithm.initialisation.ClonedPopulationInitialisationStrategy" > entityNumber="40"> + <entityType class="boa.bee.WorkerBee"/> > + </initialisationStrategy> > + <addStoppingCondition > class="stoppingcondition.MaximumIterations" maximumIterations="1000"> + > </addStoppingCondition> > + <dancingSelectionStrategy > class="entity.operators.selection.RouletteWheelSelectionStrategy"/> + > <workerBeePercentage class="controlparameter.ConstantControlParameter" > parameter="0.5"/> + <forageLimit > class="controlparameter.ConstantControlParameter" parameter="500"/> + > <explorerBeeUpdateLimit > class="controlparameter.ConstantControlParameter" parameter="1"/> + > </algorithm> > + <algorithm id="pso" class="pso.PSO"> > + <addStoppingCondition > class="stoppingcondition.MaximumIterations" maximumIterations="1000"> + > </addStoppingCondition> > + </algorithm> > + </algorithms> > + <problems> > + <problem id="spherical" > class="problem.FunctionMinimisationProblem"> + <function > class="functions.continuous.unconstrained.Spherical"/> + </problem> > + <problem id="rosenbrock" > class="problem.FunctionMinimisationProblem"> + <function > class="functions.continuous.unconstrained.Rosenbrock"/> + </problem> > + <problem id="rastrigin" > class="problem.FunctionMinimisationProblem"> + <function > class="functions.continuous.unconstrained.Rastrigin"/> + </problem> > + <problem id="griewank" > class="problem.FunctionMinimisationProblem"> + <function > class="functions.continuous.unconstrained.Griewank"/> + </problem> > + </problems> > + <measurements id="fitness" class="simulator.MeasurementSuite" > resolution="10" samples="10"> + <addMeasurement > class="measurement.single.Fitness"/> > + </measurements> > + <simulations> > + <simulation> > + <algorithm idref="abc"/> > + <problem idref="spherical"/> > + <measurements idref="fitness" file="data/abc_spherical.txt"/> > + </simulation> > + <simulation> > + <algorithm idref="abc"/> > + <problem idref="griewank"/> > + <measurements idref="fitness" file="data/abc_griewank.txt"/> > + </simulation> > + <simulation> > + <algorithm idref="abc"/> > + <problem idref="rastrigin"/> > + <measurements idref="fitness" file="data/abc_rastrigin.txt"/> > + </simulation> > + <simulation> > + <algorithm idref="abc"/> > + <problem idref="rosenbrock"/> > + <measurements idref="fitness" file="data/abc_rosenbrock.txt"/> > + </simulation> > + </simulations> > </simulator> |
From: Andrich v. W. <avw...@gm...> - 2009-07-20 13:22:49
|
Fixed bug that caused the unit tests of VisualPositionUpdateStategy and ExplorerBee to fail, the issue was related to bees leaving the function domain, which should be allowed. The tests were also expanded. Removed dependecy of ExplorerBee on Algorithm.get(), enabling easier testing. Changed exactly when bees calculate fitnesses, new implementation is slightly more efficient. Changed a number of method names and made slight changes to the abc.xml file. Fixed a number of code style and reported PMD issues. --- src/main/java/net/sourceforge/cilib/boa/ABC.java | 141 +++++++++++++++++--- .../net/sourceforge/cilib/boa/bee/AbstractBee.java | 34 +++++- .../net/sourceforge/cilib/boa/bee/ExplorerBee.java | 82 ++++++++++-- .../net/sourceforge/cilib/boa/bee/HoneyBee.java | 2 + .../net/sourceforge/cilib/boa/bee/OnlookerBee.java | 8 +- .../net/sourceforge/cilib/boa/bee/WorkerBee.java | 28 +++- .../BeePositionUpdateStrategy.java | 7 + .../VisualPositionUpdateStategy.java | 8 +- .../java/net/sourceforge/cilib/boa/ABCTest.java | 8 +- .../cilib/boa/bees/ExplorerBeeTest.java | 51 +++---- .../VisualPositionUpdateStategyTest.java | 25 ++-- xml/abc.xml | 136 ++++++++----------- 12 files changed, 359 insertions(+), 171 deletions(-) diff --git a/src/main/java/net/sourceforge/cilib/boa/ABC.java b/src/main/java/net/sourceforge/cilib/boa/ABC.java index e35e0a6..614912a 100644 --- a/src/main/java/net/sourceforge/cilib/boa/ABC.java +++ b/src/main/java/net/sourceforge/cilib/boa/ABC.java @@ -63,19 +63,16 @@ import net.sourceforge.cilib.problem.OptimisationSolution; * */ public class ABC extends SinglePopulationBasedAlgorithm { - private static final long serialVersionUID = 7918711449442012960L; + private static final long serialVersionUID = 7918711449442012960L; private Topology<HoneyBee> workerBees; //keeps references to the worker bees private Topology<HoneyBee> onlookerBees; //keeps references to the onlooker bees private Topology<HoneyBee> hive; //keeps references to all the bees (workers and onlookers) - private ExplorerBee explorerBee; //explorer bee private SelectionStrategy dancingSelectionStrategy; //bee dancing selection strategy - private ControlParameter workerBeePercentage; //control parameter for number of worker bees private ControlParameter forageLimit; //control parameter for the forage limit private ControlParameter explorerBeeUpdateLimit; //control parameter to limit the explorer bee position updates per iteration - private HoneyBee bestBee; //reference to best solution found so far /** @@ -134,7 +131,7 @@ public class ABC extends SinglePopulationBasedAlgorithm { this.initialisationStrategy.initialise(hive, this.optimisationProblem); int i; - int numWorkerBees = (int) (workerBeePercentage.getParameter()*hive.size()); + int numWorkerBees = (int) (workerBeePercentage.getParameter() * hive.size()); for (i = 0; i < numWorkerBees; i++) { WorkerBee bee = (WorkerBee) hive.get(i); bee.setForageLimit(this.forageLimit.getClone()); @@ -158,11 +155,9 @@ public class ABC extends SinglePopulationBasedAlgorithm { protected void algorithmIteration() { for (HoneyBee bee : workerBees) { bee.updatePosition(); - bee.calculateFitness(); if (bestBee == null) { bestBee = bee.getClone(); - } - else if (bee.getBestFitness().compareTo(bestBee.getBestFitness()) > 0) { + } else if (bee.getBestFitness().compareTo(bestBee.getBestFitness()) > 0) { bestBee = bee.getClone(); } } @@ -171,11 +166,9 @@ public class ABC extends SinglePopulationBasedAlgorithm { HoneyBee selectedBee = dancingSelectionStrategy.select(workerBees); bee.setPosition(selectedBee.getPosition().getClone()); bee.updatePosition(); - bee.calculateFitness(); if (bestBee == null) { bestBee = bee; - } - else if (bee.getBestFitness().compareTo(bestBee.getBestFitness()) > 0) { + } else if (bee.getBestFitness().compareTo(bestBee.getBestFitness()) > 0) { bestBee = bee; } } @@ -186,8 +179,9 @@ public class ABC extends SinglePopulationBasedAlgorithm { */ @Override public OptimisationSolution getBestSolution() { - if (this.bestBee == null) + if (this.bestBee == null) { throw new InitialisationException("Best solution cannot be determined before algorithm is run"); + } return new OptimisationSolution(bestBee.getPosition(), bestBee.getFitness()); } @@ -208,14 +202,6 @@ public class ABC extends SinglePopulationBasedAlgorithm { return this.hive; } - public Topology<HoneyBee> getWorkerTopology() { - return this.workerBees; - } - - public Topology<HoneyBee> getOnlookerTopology() { - return this.onlookerBees; - } - /** * {@inheritDoc} */ @@ -224,41 +210,156 @@ public class ABC extends SinglePopulationBasedAlgorithm { throw new UnsupportedOperationException("Method not implemented"); } + /** + * Gets the bee dancing selection strategy. + * @return the bee dancing selection strategy. + */ public SelectionStrategy getDancingSelectionStrategy() { return dancingSelectionStrategy; } + /** + * Sets the bee dancinc selection strategy. + * @param dancingSelectionStrategy the new bee dancing selection strategy. + */ public void setDancingSelectionStrategy( SelectionStrategy dancingSelectionStrategy) { this.dancingSelectionStrategy = dancingSelectionStrategy; } + /** + * Gets the explorer bee. + * @return the explorer bee. + */ public ExplorerBee getExplorerBee() { return this.explorerBee; } + /** + * Sets the explorer bee. + * @param explorerBee the new explorer bee. + */ + public void setExplorerBee(ExplorerBee explorerBee) { + this.explorerBee = explorerBee; + } + + /** + * Gets the {@code ControlParameter} specifying the number of worker bees. + * @return the {@code ControlParameter} specifying the number of worker bees. + */ public ControlParameter getWorkerBeeNumber() { return workerBeePercentage; } + /** + * Gets the {@code ControlParameter} specifying the percentage of worker bees. + * @return the {@code ControlParameter} specifying the percentage of worker bees. + */ + public ControlParameter getWorkerBeePercentage() { + return workerBeePercentage; + } + + /** + * Sets the {@code ControlParameter} specifying the percentage of worker bees.. + * @param workerBeeNumber the new {@code ControlParameter} specifying the percentage of worker bees. + */ public void setWorkerBeePercentage(ControlParameter workerBeeNumber) { this.workerBeePercentage = workerBeeNumber; } + /** + * Gets the {@code ControlParameter} specifying the foraging limit. + * @return the {@code ControlParameter} specifying the foraging limit. + */ public ControlParameter getForageLimit() { return forageLimit; } + /** + * Sets the {@code ControlParameter} specifying the foraging limit. + * @param forageThreshold the new {@code ControlParameter} specifying the foraging limit. + */ public void setForageLimit(ControlParameter forageThreshold) { this.forageLimit = forageThreshold; } + /** + * Gets the {@code ControlParameter} specifying the limit to how many times the explorer bee can update positions. + * @return the {@code ControlParameter} specifying the limit to how many times the explorer bee can update positions. + */ public ControlParameter getExplorerBeeUpdateLimit() { return explorerBeeUpdateLimit; } + /** + * Sets the {@code ControlParameter} specifying the limit to how many times the explorer bee can update positions. + * @param explorerBeeUpdateLimit the {@code ControlParameter} specifying the limit to how many times the explorer bee can update positions. + */ public void setExplorerBeeUpdateLimit(ControlParameter explorerBeeUpdateLimit) { this.explorerBeeUpdateLimit = explorerBeeUpdateLimit; } + /** + * Gets the bee with the highest fitness during the algorithm execution. + * @return the bee with the highest fitness. + */ + public HoneyBee getBestBee() { + return bestBee; + } + + /** + * Sets the bee with the highest fitness during the algorithm execution. + * @param bestBee the new bee with the highest fitness. + */ + public void setBestBee(HoneyBee bestBee) { + this.bestBee = bestBee; + } + + /** + * Get the {@code Topology} containing all the bees in the hive. + * @return the {@code Topology} containing all bees in the hive. + */ + public Topology<HoneyBee> getHive() { + return hive; + } + + /** + * Set the {@code Topology} containing all the bees in the hive. + * @param hive the new {@code Topology} containing all bees in the hive. + */ + public void setHive(Topology<HoneyBee> hive) { + this.hive = hive; + } + + /** + * Get the {@code Topology} containing the onlooker bees. + * @return the {@code Topology} containing the onlooker bees. + */ + public Topology<HoneyBee> getOnlookerBees() { + return onlookerBees; + } + + /** + * Set the {@code Topology} containing the onlooker bees. + * @param onlookerBees the new {@code Topology} containing the onlooker bees. + */ + public void setOnlookerBees(Topology<HoneyBee> onlookerBees) { + this.onlookerBees = onlookerBees; + } + + /** + * Get the {@code Topology} containing the worker bees. + * @return the {@code Topology} containing the worker bees. + */ + public Topology<HoneyBee> getWorkerBees() { + return workerBees; + } + + /** + * Set the {@code Topology} containing the worker bees. + * @param workerBees the new {@code Topology} containing the worker bees. + */ + public void setWorkerBees(Topology<HoneyBee> workerBees) { + this.workerBees = workerBees; + } } diff --git a/src/main/java/net/sourceforge/cilib/boa/bee/AbstractBee.java b/src/main/java/net/sourceforge/cilib/boa/bee/AbstractBee.java index 1830192..ddef6ac 100644 --- a/src/main/java/net/sourceforge/cilib/boa/bee/AbstractBee.java +++ b/src/main/java/net/sourceforge/cilib/boa/bee/AbstractBee.java @@ -21,7 +21,6 @@ */ package net.sourceforge.cilib.boa.bee; -import net.sourceforge.cilib.type.types.Types; import net.sourceforge.cilib.boa.positionupdatestrategies.BeePositionUpdateStrategy; import net.sourceforge.cilib.boa.positionupdatestrategies.VisualPositionUpdateStategy; import net.sourceforge.cilib.entity.AbstractEntity; @@ -40,8 +39,8 @@ import net.sourceforge.cilib.type.types.container.Vector; * */ public abstract class AbstractBee extends AbstractEntity implements HoneyBee { - private static final long serialVersionUID = 7005546673802814268L; + private static final long serialVersionUID = 7005546673802814268L; protected BeePositionUpdateStrategy positionUpdateStrategy; protected SelectionStrategy targetSelectionStrategy; protected int dimension; @@ -80,6 +79,14 @@ public abstract class AbstractBee extends AbstractEntity implements HoneyBee { } /** + * Sets the position update strategy of the bee. + * @param positionUpdateStrategy the new position update strategy. + */ + public void setPositionUpdateStrategy(BeePositionUpdateStrategy positionUpdateStrategy) { + this.positionUpdateStrategy = positionUpdateStrategy; + } + + /** * {@inheritDoc} */ @Override @@ -118,6 +125,14 @@ public abstract class AbstractBee extends AbstractEntity implements HoneyBee { } /** + * Sets the dimension of the solution used by the bee. + * @param dimension the new dimension of the solution. + */ + public void setDimension(int dimension) { + this.dimension = dimension; + } + + /** * {@inheritDoc} */ public Vector getPosition() { @@ -151,4 +166,19 @@ public abstract class AbstractBee extends AbstractEntity implements HoneyBee { throw new UnsupportedOperationException("Reinitialise not implemented for AbstractBee"); } + /** + * Gets the target selection strategy, for selecting bees to follow in position updates. + * @return the target selection strategy. + */ + public SelectionStrategy getTargetSelectionStrategy() { + return targetSelectionStrategy; + } + + /** + * Sets the target selection strategy, for selecting bees to follow in position updates. + * @param targetSelectionStrategy the new target selection strategy. + */ + public void setTargetSelectionStrategy(SelectionStrategy targetSelectionStrategy) { + this.targetSelectionStrategy = targetSelectionStrategy; + } } diff --git a/src/main/java/net/sourceforge/cilib/boa/bee/ExplorerBee.java b/src/main/java/net/sourceforge/cilib/boa/bee/ExplorerBee.java index 3497aad..68f6ac4 100644 --- a/src/main/java/net/sourceforge/cilib/boa/bee/ExplorerBee.java +++ b/src/main/java/net/sourceforge/cilib/boa/bee/ExplorerBee.java @@ -21,11 +21,10 @@ */ package net.sourceforge.cilib.boa.bee; -import net.sourceforge.cilib.algorithm.Algorithm; import net.sourceforge.cilib.controlparameter.ConstantControlParameter; import net.sourceforge.cilib.controlparameter.ControlParameter; import net.sourceforge.cilib.math.random.generator.MersenneTwister; -import net.sourceforge.cilib.math.random.generator.Seeder; +import net.sourceforge.cilib.math.random.generator.Random; import net.sourceforge.cilib.type.types.container.Vector; import net.sourceforge.cilib.util.Cloneable; @@ -38,9 +37,9 @@ import net.sourceforge.cilib.util.Cloneable; * */ public class ExplorerBee implements Cloneable { - private static final long serialVersionUID = 1068799535328234923L; - private MersenneTwister random; //generates a random position + private static final long serialVersionUID = 1068799535328234923L; + private Random random; //generates a random position private int previousUpdatedIteration; //used to check whether the algorithm has entered a new iteration private int numberOfUpdates; //how many have occured in current iteration private ControlParameter explorerBeeUpdateLimit; @@ -70,24 +69,24 @@ public class ExplorerBee implements Cloneable { /** * {@inheritDoc} */ + @Override public ExplorerBee getClone() { return new ExplorerBee(this); } /** * Verifies it is allowed for a worker bee to convert to an explorer bee. - * @precondition an algorithm is on the algorithm stack. + * @param currentIteration the current iteration of the algorithm on the stack. * @return whether the search is allowed. */ - public boolean searchAllowed() { - int currentIteration = Algorithm.get().getIterations(); + public boolean searchAllowed(int currentIteration) { if (previousUpdatedIteration == currentIteration) { //TODO: Add variable number of updates allowed - if (Double.compare(numberOfUpdates, explorerBeeUpdateLimit.getParameter()) < 0) + if (Double.compare(numberOfUpdates, explorerBeeUpdateLimit.getParameter()) < 0) { return true; + } return false; - } - else { + } else { numberOfUpdates = 0; } return true; @@ -95,27 +94,82 @@ public class ExplorerBee implements Cloneable { /** * Returns a new random position. - * @precondition an algorithm is on the algorithm stack. * @precondition the search is allowed. + * @param currentIteration the current iteration of the algorithm on the stack. * @param position random position with same dimension and bounds as given position. * @return The new position. */ - public Vector getNewPosition(Vector position) { - previousUpdatedIteration = Algorithm.get().getIterations(); + public Vector getNewPosition(int currentIteration, Vector position) { + previousUpdatedIteration = currentIteration; numberOfUpdates++; Vector newPosition = position.getClone(); - newPosition.randomize(new MersenneTwister()); + newPosition.randomize(random); return newPosition; } + /** + * Gets the explorer bee update limit. + * @return the explorer bee update limit. + */ public ControlParameter getExplorerBeeUpdateLimit() { return explorerBeeUpdateLimit; } + /** + * Sets the explorer bee update limit. + * @param explorerBeeUpdateLimit the new explorer bee update limit. + */ public void setExplorerBeeUpdateLimit(ControlParameter explorerBeeUpdateLimit) { this.explorerBeeUpdateLimit = explorerBeeUpdateLimit; } + /** + * Gets the number of updates done for the current iteration. + * @return the number of iterations done for the current iteration. + */ + public int getNumberOfUpdates() { + return numberOfUpdates; + } + + /** + * Sets the number of updates done for the current iteration. + * @param numberOfUpdates the new number of iterations done for the current iteration. + */ + public void setNumberOfUpdates(int numberOfUpdates) { + this.numberOfUpdates = numberOfUpdates; + } + + /** + * Gets the last iteration an update was done. + * @return the last iteration an update was done. + */ + public int getPreviousUpdatedIteration() { + return previousUpdatedIteration; + } + + /** + * Sets the last iteration an update was done. + * @param previousUpdatedIteration the last iteration an update was done. + */ + public void setPreviousUpdatedIteration(int previousUpdatedIteration) { + this.previousUpdatedIteration = previousUpdatedIteration; + } + + /** + * Gets the random number generator to use for generating new positions. + * @return + */ + public Random getRandom() { + return random; + } + + /** + * Sets the random number generator to use for generating new positions. + * @param random the new random number generator to use for generating new positions. + */ + public void setRandom(Random random) { + this.random = random; + } } diff --git a/src/main/java/net/sourceforge/cilib/boa/bee/HoneyBee.java b/src/main/java/net/sourceforge/cilib/boa/bee/HoneyBee.java index 1d35188..413c3bf 100644 --- a/src/main/java/net/sourceforge/cilib/boa/bee/HoneyBee.java +++ b/src/main/java/net/sourceforge/cilib/boa/bee/HoneyBee.java @@ -35,11 +35,13 @@ public interface HoneyBee extends Entity { /** * {@inheritDoc} */ + @Override public HoneyBee getClone(); /** * {@inheritDoc} */ + @Override public Fitness getFitness(); /** diff --git a/src/main/java/net/sourceforge/cilib/boa/bee/OnlookerBee.java b/src/main/java/net/sourceforge/cilib/boa/bee/OnlookerBee.java index a9ff676..15e3d02 100644 --- a/src/main/java/net/sourceforge/cilib/boa/bee/OnlookerBee.java +++ b/src/main/java/net/sourceforge/cilib/boa/bee/OnlookerBee.java @@ -39,6 +39,10 @@ public class OnlookerBee extends AbstractBee implements HoneyBee { public OnlookerBee() { } + /** + * Copy constructor. + * @param bee the original bee to copy. + */ public OnlookerBee(AbstractBee bee) { super(bee); } @@ -65,10 +69,10 @@ public class OnlookerBee extends AbstractBee implements HoneyBee { @Override public void updatePosition() { ABC algorithm = (ABC) Algorithm.get(); - HoneyBee target = targetSelectionStrategy.select(algorithm.getWorkerTopology()); + HoneyBee target = targetSelectionStrategy.select(algorithm.getWorkerBees()); while (target == this) { - target = targetSelectionStrategy.select(algorithm.getWorkerTopology()); + target = targetSelectionStrategy.select(algorithm.getWorkerBees()); } this.positionUpdateStrategy.updatePosition(this, target); diff --git a/src/main/java/net/sourceforge/cilib/boa/bee/WorkerBee.java b/src/main/java/net/sourceforge/cilib/boa/bee/WorkerBee.java index bc34ae3..33339d8 100644 --- a/src/main/java/net/sourceforge/cilib/boa/bee/WorkerBee.java +++ b/src/main/java/net/sourceforge/cilib/boa/bee/WorkerBee.java @@ -31,8 +31,8 @@ import net.sourceforge.cilib.controlparameter.ControlParameter; * @author Andrich */ public class WorkerBee extends AbstractBee implements HoneyBee { - private static final long serialVersionUID = 3657591650621784765L; + private static final long serialVersionUID = 3657591650621784765L; private ControlParameter forageLimit; private int failureCount; @@ -68,20 +68,20 @@ public class WorkerBee extends AbstractBee implements HoneyBee { @Override public void updatePosition() { ABC algorithm = (ABC) Algorithm.get(); - HoneyBee target = targetSelectionStrategy.select(algorithm.getWorkerTopology()); + HoneyBee target = targetSelectionStrategy.select(algorithm.getWorkerBees()); while (target == this) { - target = targetSelectionStrategy.select(algorithm.getWorkerTopology()); + target = targetSelectionStrategy.select(algorithm.getWorkerBees()); } boolean success = this.positionUpdateStrategy.updatePosition(this, target); if (!success) { failureCount++; - if (failureCount >= forageLimit.getParameter()) { + if (failureCount >= forageLimit.getParameter()) { failureCount = 0; ExplorerBee explorerBee = algorithm.getExplorerBee(); - if (explorerBee.searchAllowed()) { - this.setPosition(explorerBee.getNewPosition(this.getPosition())); + if (explorerBee.searchAllowed(algorithm.getIterations())) { + this.setPosition(explorerBee.getNewPosition(algorithm.getIterations(), this.getPosition())); } } } @@ -102,4 +102,20 @@ public class WorkerBee extends AbstractBee implements HoneyBee { public void setForageLimit(ControlParameter forageLimit) { this.forageLimit = forageLimit; } + + /** + * Gets the failure count. + * @return the number of times the bee has failed to find a better position. + */ + public int getFailureCount() { + return failureCount; + } + + /** + * Sets the failure count. + * @param failureCount the new number of times the bee has failed to find a better position. + */ + public void setFailureCount(int failureCount) { + this.failureCount = failureCount; + } } diff --git a/src/main/java/net/sourceforge/cilib/boa/positionupdatestrategies/BeePositionUpdateStrategy.java b/src/main/java/net/sourceforge/cilib/boa/positionupdatestrategies/BeePositionUpdateStrategy.java index 465bc5c..082cf8c 100644 --- a/src/main/java/net/sourceforge/cilib/boa/positionupdatestrategies/BeePositionUpdateStrategy.java +++ b/src/main/java/net/sourceforge/cilib/boa/positionupdatestrategies/BeePositionUpdateStrategy.java @@ -35,8 +35,15 @@ public interface BeePositionUpdateStrategy extends Cloneable { /** * {@inheritDoc} */ + @Override public BeePositionUpdateStrategy getClone(); + /** + * Updates the position of the given bee. + * @param bee the bee the position update is for. + * @param other another bee that the position update might use to update the position. + * @return whether the position update was successful. + */ public boolean updatePosition(HoneyBee bee, HoneyBee other); } diff --git a/src/main/java/net/sourceforge/cilib/boa/positionupdatestrategies/VisualPositionUpdateStategy.java b/src/main/java/net/sourceforge/cilib/boa/positionupdatestrategies/VisualPositionUpdateStategy.java index c1bd803..6461a03 100644 --- a/src/main/java/net/sourceforge/cilib/boa/positionupdatestrategies/VisualPositionUpdateStategy.java +++ b/src/main/java/net/sourceforge/cilib/boa/positionupdatestrategies/VisualPositionUpdateStategy.java @@ -21,8 +21,8 @@ */ package net.sourceforge.cilib.boa.positionupdatestrategies; -import net.sourceforge.cilib.algorithm.Algorithm; import net.sourceforge.cilib.boa.bee.HoneyBee; +import net.sourceforge.cilib.entity.EntityType; import net.sourceforge.cilib.math.random.generator.MersenneTwister; import net.sourceforge.cilib.problem.Fitness; import net.sourceforge.cilib.type.types.Real; @@ -63,10 +63,12 @@ public class VisualPositionUpdateStategy implements BeePositionUpdateStrategy { newPosition.set(j, newValue); //Determine if new position is better than old and update - Fitness oldFitness = Algorithm.get().getOptimisationProblem().getFitness(oldPosition, false); - Fitness newFitness = Algorithm.get().getOptimisationProblem().getFitness(newPosition, false); + Fitness oldFitness = bee.getFitness().getClone(); + bee.calculateFitness(); + Fitness newFitness = bee.getFitness(); if (newFitness.compareTo(oldFitness) < 0) { bee.setPosition(oldPosition); + bee.getProperties().put(EntityType.FITNESS, oldFitness); return false; } diff --git a/src/test/java/net/sourceforge/cilib/boa/ABCTest.java b/src/test/java/net/sourceforge/cilib/boa/ABCTest.java index 31c8014..c3fc238 100644 --- a/src/test/java/net/sourceforge/cilib/boa/ABCTest.java +++ b/src/test/java/net/sourceforge/cilib/boa/ABCTest.java @@ -51,19 +51,19 @@ public class ABCTest { abc.initialise(); assertEquals(abc.getTopology().size(), 100); - assertEquals(abc.getWorkerTopology().size(), 70); - assertEquals(abc.getOnlookerTopology().size(), 30); + assertEquals(abc.getWorkerBees().size(), 70); + assertEquals(abc.getOnlookerBees().size(), 30); HashMap<Type, Type> map = new HashMap<Type, Type>(); for (HoneyBee bee : abc.getTopology()) { map.put(bee.getCandidateSolution(), bee.getCandidateSolution()); } - for (HoneyBee bee : abc.getWorkerTopology()) + for (HoneyBee bee : abc.getWorkerBees()) { map.put(bee.getCandidateSolution(), bee.getCandidateSolution()); } - for (HoneyBee bee : abc.getOnlookerTopology()) + for (HoneyBee bee : abc.getOnlookerBees()) { map.put(bee.getCandidateSolution(), bee.getCandidateSolution()); } diff --git a/src/test/java/net/sourceforge/cilib/boa/bees/ExplorerBeeTest.java b/src/test/java/net/sourceforge/cilib/boa/bees/ExplorerBeeTest.java index 87750cf..b3d916f 100644 --- a/src/test/java/net/sourceforge/cilib/boa/bees/ExplorerBeeTest.java +++ b/src/test/java/net/sourceforge/cilib/boa/bees/ExplorerBeeTest.java @@ -21,13 +21,11 @@ */ package net.sourceforge.cilib.boa.bees; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import java.util.ArrayList; import net.sourceforge.cilib.algorithm.initialisation.ClonedPopulationInitialisationStrategy; import net.sourceforge.cilib.boa.ABC; +import net.sourceforge.cilib.boa.bee.ExplorerBee; import net.sourceforge.cilib.boa.bee.WorkerBee; import net.sourceforge.cilib.controlparameter.ConstantControlParameter; import net.sourceforge.cilib.functions.ContinuousFunction; @@ -35,9 +33,9 @@ import net.sourceforge.cilib.functions.continuous.unconstrained.Rastrigin; import net.sourceforge.cilib.problem.FunctionMinimisationProblem; import net.sourceforge.cilib.stoppingcondition.MaximumIterations; import net.sourceforge.cilib.stoppingcondition.StoppingCondition; -import net.sourceforge.cilib.type.types.Real; import net.sourceforge.cilib.type.types.container.Vector; +import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -66,34 +64,27 @@ public class ExplorerBeeTest { } @Test - public void testGetNewPosition() { + public void testSearchAllowed() { //get up a position with bounds - Vector currentPosition; - - //update position with explorer bee since forage threshold is -1 - ArrayList<Vector> oldPositions = new ArrayList<Vector>(); - for (int k = 0; k < abc.getWorkerTopology().size(); k++) { - oldPositions.add((Vector)abc.getWorkerTopology().get(k).getPosition().getClone()); - } - abc.performIteration(); + Vector oldPosition = abc.getWorkerBees().get(0).getPosition().getClone();; + //update position with explorer bee + ExplorerBee explorerBee = abc.getExplorerBee(); + Assert.assertTrue(explorerBee.searchAllowed(1)); + explorerBee.getNewPosition(1,oldPosition); + //only one update is allowed for the same iteration, this must therefore be false... + Assert.assertTrue(!explorerBee.searchAllowed(1)); + //and this true. + Assert.assertTrue(explorerBee.searchAllowed(2)); + } - boolean explorerUpdateOccured = false; - //assertions - for (int k = 0; k < abc.getWorkerTopology().size(); k++) { - boolean allDimensionsChanged = true; - currentPosition = (Vector)abc.getWorkerTopology().get(k).getCandidateSolution(); - assertEquals(5,currentPosition.size()); - for (int i = 0; i < currentPosition.size(); i++) { - assertTrue(((Real)currentPosition.get(i)).getReal() != Double.NaN); - assertTrue(!Double.isInfinite(((Real)currentPosition.get(i)).getReal())); - allDimensionsChanged = allDimensionsChanged & (Double.compare(((Real)currentPosition.get(i)).getReal(), - ((Real)oldPositions.get(k).get(i)).getReal())!=0); - assertTrue(((Real)currentPosition.get(i)).getReal() <= 5.0); - assertTrue(((Real)currentPosition.get(i)).getReal() >= -5.0); - } - explorerUpdateOccured = explorerUpdateOccured | allDimensionsChanged; - } - assertTrue(explorerUpdateOccured); + @Test + public void testGetNewPosition() { + //get up a position with bounds + Vector oldPosition = abc.getWorkerBees().get(0).getPosition().getClone();; + //update position with explorer bee + ExplorerBee explorerBee = abc.getExplorerBee(); + Vector newPosition = explorerBee.getNewPosition(1,oldPosition); + Assert.assertTrue(!oldPosition.equals(newPosition)); } } diff --git a/src/test/java/net/sourceforge/cilib/boa/positionupdatestrategies/VisualPositionUpdateStategyTest.java b/src/test/java/net/sourceforge/cilib/boa/positionupdatestrategies/VisualPositionUpdateStategyTest.java index a5468f2..5b0b535 100644 --- a/src/test/java/net/sourceforge/cilib/boa/positionupdatestrategies/VisualPositionUpdateStategyTest.java +++ b/src/test/java/net/sourceforge/cilib/boa/positionupdatestrategies/VisualPositionUpdateStategyTest.java @@ -21,7 +21,6 @@ */ package net.sourceforge.cilib.boa.positionupdatestrategies; - import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import net.sourceforge.cilib.algorithm.initialisation.ClonedPopulationInitialisationStrategy; @@ -31,6 +30,7 @@ import net.sourceforge.cilib.boa.bee.WorkerBee; import net.sourceforge.cilib.controlparameter.ConstantControlParameter; import net.sourceforge.cilib.functions.ContinuousFunction; import net.sourceforge.cilib.functions.continuous.unconstrained.Rastrigin; +import net.sourceforge.cilib.problem.Fitness; import net.sourceforge.cilib.problem.FunctionMinimisationProblem; import net.sourceforge.cilib.stoppingcondition.MaximumIterations; import net.sourceforge.cilib.stoppingcondition.StoppingCondition; @@ -41,6 +41,7 @@ import org.junit.Before; import org.junit.Test; public class VisualPositionUpdateStategyTest { + private ABC abc; @Before @@ -59,7 +60,7 @@ public class VisualPositionUpdateStategyTest { initStrategy.setEntityType(bee); abc.setInitialisationStrategy(initStrategy); abc.setWorkerBeePercentage(new ConstantControlParameter(0.5)); - abc.setForageLimit(new ConstantControlParameter(-1)); + abc.setForageLimit(new ConstantControlParameter(Integer.MAX_VALUE)); abc.addStoppingCondition(condition); abc.setOptimisationProblem(problem); abc.initialise(); @@ -67,16 +68,20 @@ public class VisualPositionUpdateStategyTest { @Test public void testUpdatePosition() { - HoneyBee bee = abc.getWorkerTopology().get(0); + HoneyBee bee = abc.getWorkerBees().get(0); abc.performIteration(); - Vector currentPosition = (Vector)bee.getPosition(); - assertEquals(10,currentPosition.size()); + Fitness oldFitness = bee.getFitness().getClone(); + abc.performIteration(); + Vector currentPosition = (Vector) bee.getPosition(); + System.out.println(currentPosition); + assertEquals(10, currentPosition.size()); for (int i = 0; i < currentPosition.size(); i++) { - assertTrue(((Real)currentPosition.get(i)).getReal() != Double.NaN); - assertTrue(!Double.isInfinite(((Real)currentPosition.get(i)).getReal())); - assertTrue(((Real)currentPosition.get(i)).getReal() <= 5.0); - assertTrue(((Real)currentPosition.get(i)).getReal() >= -5.0); + assertTrue(((Real) currentPosition.get(i)).getReal() != Double.NaN); + assertTrue(!Double.isInfinite(((Real) currentPosition.get(i)).getReal())); } + Fitness newFitness = bee.getFitness(); + System.out.println(oldFitness.getValue()); + System.out.println(newFitness.getValue()); + assertTrue(newFitness.compareTo(oldFitness) >= 0); } - } diff --git a/xml/abc.xml b/xml/abc.xml index f06c5c0..f62675f 100644 --- a/xml/abc.xml +++ b/xml/abc.xml @@ -5,84 +5,60 @@ <!ATTLIST measurements id ID #IMPLIED> ]> <simulator> - <algorithms> - <algorithm id="abc" class="boa.ABC"> - <initialisationStrategy class="algorithm.initialisation.ClonedPopulationInitialisationStrategy" entityNumber="40"> - <entityType class="boa.bee.WorkerBee"/> - </initialisationStrategy> - <addStoppingCondition class="stoppingcondition.MaximumIterations" maximumIterations="1000"> - </addStoppingCondition> - <dancingSelectionStrategy class="entity.operators.selection.RouletteWheelSelectionStrategy"/> - <workerBeePercentage class="controlparameter.ConstantControlParameter" parameter="0.5"/> - <forageLimit class="controlparameter.ConstantControlParameter" parameter="500"/> - <explorerBeeUpdateLimit class="controlparameter.ConstantControlParameter" parameter="1"/> - </algorithm> - <algorithm id="pso" class="pso.PSO"> - <addStoppingCondition class="stoppingcondition.MaximumIterations" maximumIterations="1000"> - </addStoppingCondition> - </algorithm> - </algorithms> - <problems> - <problem id="spherical" class="problem.FunctionMinimisationProblem"> - <function class="functions.continuous.unconstrained.Spherical"/> - </problem> - <problem id="rosenbrock" class="problem.FunctionMinimisationProblem"> - <function class="functions.continuous.unconstrained.Rosenbrock"/> - </problem> - <problem id="rastrigin" class="problem.FunctionMinimisationProblem"> - <function class="functions.continuous.unconstrained.Rastrigin"/> - </problem> - <problem id="griewank" class="problem.FunctionMinimisationProblem"> - <function class="functions.continuous.unconstrained.Griewank"/> - </problem> - <problem id="quadric" class="problem.FunctionMinimisationProblem"> - <function class="functions.continuous.Quadric"/> - </problem> - <problem id="michalewicz" class="problem.FunctionMinimisationProblem"> - <function class="functions.continuous.unconstrained.Michalewicz"/> - </problem> - <problem id="hyperellipsoid" class="problem.FunctionMinimisationProblem"> - <function class="functions.continuous.HyperEllipsoid"/> - </problem> - <problem id="easom" class="problem.FunctionMinimisationProblem"> - <function class="functions.continuous.unconstrained.Easom"/> - </problem> - <problem id="colville" class="problem.FunctionMinimisationProblem"> - <function class="functions.continuous.Colville"/> - </problem> - <problem id="bohachevsky1" class="problem.FunctionMinimisationProblem"> - <function class="functions.continuous.unconstrained.Bohachevsky1"/> - </problem> - <problem id="ackley" class="problem.FunctionMinimisationProblem"> - <function class="functions.continuous.unconstrained.Ackley"/> - </problem> - <problem id="schwefel" class="problem.FunctionMinimisationProblem"> - <function class="functions.continuous.Schwefel"/> - </problem> - </problems> - <measurements id="fitness" class="simulator.MeasurementSuite" resolution="10" samples="30"> - <addMeasurement class="measurement.single.Fitness"/> - </measurements> - <simulations> - <simulation> - <algorithm idref="abc"/> - <problem idref="spherical"/> - <measurements idref="fitness" file="data/test/abc_rastrigin.txt"/> - </simulation> - <simulation> - <algorithm idref="abc"/> - <problem idref="griewank"/> - <measurements idref="fitness" file="data/test/abc_griewank.txt"/> - </simulation> - <!--<simulation> - <algorithm idref="abc"/> - <problem idref="rastrigin"/> - <measurements idref="fitness" file="data/test/abc_rastrigin.txt"/> - </simulation> - <simulation> - <algorithm idref="abc"/> - <problem idref="rosenbrock"/> - <measurements idref="fitness" file="data/test/abc_rosenbrock.txt"/> - </simulation>--> - </simulations> + <algorithms> + <algorithm id="abc" class="boa.ABC"> + <initialisationStrategy class="algorithm.initialisation.ClonedPopulationInitialisationStrategy" entityNumber="40"> + <entityType class="boa.bee.WorkerBee"/> + </initialisationStrategy> + <addStoppingCondition class="stoppingcondition.MaximumIterations" maximumIterations="1000"> + </addStoppingCondition> + <dancingSelectionStrategy class="entity.operators.selection.RouletteWheelSelectionStrategy"/> + <workerBeePercentage class="controlparameter.ConstantControlParameter" parameter="0.5"/> + <forageLimit class="controlparameter.ConstantControlParameter" parameter="500"/> + <explorerBeeUpdateLimit class="controlparameter.ConstantControlParameter" parameter="1"/> + </algorithm> + <algorithm id="pso" class="pso.PSO"> + <addStoppingCondition class="stoppingcondition.MaximumIterations" maximumIterations="1000"> + </addStoppingCondition> + </algorithm> + </algorithms> + <problems> + <problem id="spherical" class="problem.FunctionMinimisationProblem"> + <function class="functions.continuous.unconstrained.Spherical"/> + </problem> + <problem id="rosenbrock" class="problem.FunctionMinimisationProblem"> + <function class="functions.continuous.unconstrained.Rosenbrock"/> + </problem> + <problem id="rastrigin" class="problem.FunctionMinimisationProblem"> + <function class="functions.continuous.unconstrained.Rastrigin"/> + </problem> + <problem id="griewank" class="problem.FunctionMinimisationProblem"> + <function class="functions.continuous.unconstrained.Griewank"/> + </problem> + </problems> + <measurements id="fitness" class="simulator.MeasurementSuite" resolution="10" samples="10"> + <addMeasurement class="measurement.single.Fitness"/> + </measurements> + <simulations> + <simulation> + <algorithm idref="abc"/> + <problem idref="spherical"/> + <measurements idref="fitness" file="data/abc_spherical.txt"/> + </simulation> + <simulation> + <algorithm idref="abc"/> + <problem idref="griewank"/> + <measurements idref="fitness" file="data/abc_griewank.txt"/> + </simulation> + <simulation> + <algorithm idref="abc"/> + <problem idref="rastrigin"/> + <measurements idref="fitness" file="data/abc_rastrigin.txt"/> + </simulation> + <simulation> + <algorithm idref="abc"/> + <problem idref="rosenbrock"/> + <measurements idref="fitness" file="data/abc_rosenbrock.txt"/> + </simulation> + </simulations> </simulator> -- 1.6.0.4 |
From: <leo...@gm...> - 2009-07-20 12:53:04
|
From: Leo Langenhoven <lla...@cs...> This patch should be applied along with the UPDATED:Implemented the Rand-to-best DE target creation strategy patch. Added functionality so that random selection will be unqiue. This was achieved as follows: - Added a RandomSyntax interface, this interface defines the random methods. - Added a UniqueSyntax interface, this interface defines a method called unique, that returns a new instance of SelectionSyntax. - Added a UniqueSelection class. This class inherets from SelectionSyntax as well as RandomSyntax. It has a similar implementation to Selection, but the rand(int) method has the added constraint that the random elements selected are all unique. - The Selection class now inherets from the above two interfaces as well as SelectionSyntax. The unique method returns an instance of UniqueSelection that contains the same elements as the Selection object. The DE creation strategies were updated to use the new functionality. --- .../operators/creation/RandCreationStrategy.java | 2 +- .../creation/RandToBestCreationStrategy.java | 2 +- .../cilib/util/selection/RandomSyntax.java | 32 +++ .../cilib/util/selection/Selection.java | 13 +- .../cilib/util/selection/SelectionSyntax.java | 5 - .../cilib/util/selection/UniqueSelection.java | 236 ++++++++++++++++++++ .../cilib/util/selection/UniqueSyntax.java | 28 +++ .../cilib/util/selection/UniqueSelectionTest.java | 94 ++++++++ 8 files changed, 403 insertions(+), 9 deletions(-) create mode 100644 src/main/java/net/sourceforge/cilib/util/selection/RandomSyntax.java create mode 100644 src/main/java/net/sourceforge/cilib/util/selection/UniqueSelection.java create mode 100644 src/main/java/net/sourceforge/cilib/util/selection/UniqueSyntax.java create mode 100644 src/test/java/net/sourceforge/cilib/util/selection/UniqueSelectionTest.java diff --git a/src/main/java/net/sourceforge/cilib/entity/operators/creation/RandCreationStrategy.java b/src/main/java/net/sourceforge/cilib/entity/operators/creation/RandCreationStrategy.java index 59cd174..56733b8 100644 --- a/src/main/java/net/sourceforge/cilib/entity/operators/creation/RandCreationStrategy.java +++ b/src/main/java/net/sourceforge/cilib/entity/operators/creation/RandCreationStrategy.java @@ -74,7 +74,7 @@ public class RandCreationStrategy implements CreationStrategy { @Override public Entity create(Entity targetEntity, Entity current, Topology<? extends Entity> topology) { Random random = new MersenneTwister(); - List<Entity> participants = Selection.from(topology.asList()).exclude(Arrays.asList(targetEntity, current)).random(random, (int)numberOfDifferenceVectors.getParameter()).select(); + List<Entity> participants = Selection.from(topology.asList()).exclude(Arrays.asList(targetEntity, current)).unique().random(random, (int)numberOfDifferenceVectors.getParameter()).select(); Vector differenceVector = determineDistanceVector(participants); Vector targetVector = (Vector) targetEntity.getCandidateSolution(); diff --git a/src/main/java/net/sourceforge/cilib/entity/operators/creation/RandToBestCreationStrategy.java b/src/main/java/net/sourceforge/cilib/entity/operators/creation/RandToBestCreationStrategy.java index 7797796..1566d8d 100644 --- a/src/main/java/net/sourceforge/cilib/entity/operators/creation/RandToBestCreationStrategy.java +++ b/src/main/java/net/sourceforge/cilib/entity/operators/creation/RandToBestCreationStrategy.java @@ -69,7 +69,7 @@ public class RandToBestCreationStrategy extends RandCreationStrategy { Topology<? extends Entity> topology) { Entity bestEntity = topology.getBestEntity(); Random random = new MersenneTwister(); - List<Entity> participants = Selection.from(topology.asList()).exclude(Arrays.asList(targetEntity, bestEntity, current)).random(random, (int)numberOfDifferenceVectors.getParameter()).select(); + List<Entity> participants = Selection.from(topology.asList()).exclude(Arrays.asList(targetEntity, bestEntity, current)).unique().random(random, (int)numberOfDifferenceVectors.getParameter()).select(); Vector differenceVector = determineDistanceVector(participants); Vector targetVector = ((Vector) targetEntity.getCandidateSolution()).multiply(1 - greedynessParameter.getParameter()); diff --git a/src/main/java/net/sourceforge/cilib/util/selection/RandomSyntax.java b/src/main/java/net/sourceforge/cilib/util/selection/RandomSyntax.java new file mode 100644 index 0000000..cd39e67 --- /dev/null +++ b/src/main/java/net/sourceforge/cilib/util/selection/RandomSyntax.java @@ -0,0 +1,32 @@ +/** + * Copyright (C) 2003 - 2009 + * Computational Intelligence Research Group (CIRG@UP) + * Department of Computer Science + * University of Pretoria + * South Africa + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +package net.sourceforge.cilib.util.selection; + +import net.sourceforge.cilib.math.random.generator.Random; + +public interface RandomSyntax<E> { + + public SelectionSyntax<E> random(Random random); + + public SelectionSyntax<E> random(Random random, int number); + +} diff --git a/src/main/java/net/sourceforge/cilib/util/selection/Selection.java b/src/main/java/net/sourceforge/cilib/util/selection/Selection.java index 6b01214..d331bb0 100644 --- a/src/main/java/net/sourceforge/cilib/util/selection/Selection.java +++ b/src/main/java/net/sourceforge/cilib/util/selection/Selection.java @@ -61,7 +61,7 @@ import net.sourceforge.cilib.util.selection.weighing.Weighing; * @param <E> The comparable type. * @author gpampara */ -public final class Selection<E> implements SelectionSyntax<E> { +public final class Selection<E> implements SelectionSyntax<E>, RandomSyntax<E>, UniqueSyntax<E> { private List<Entry<E>> elements; @@ -88,6 +88,15 @@ public final class Selection<E> implements SelectionSyntax<E> { public static <T> Selection<T> from(List<? extends T> elements) { return new Selection<T>(elements); } + + /** + * Create an instance of {@code UniqueSelection} that contains the same elements as this Selection + * @return An instance of {@code UniqueSelection} with identical elements. + */ + @Override + public UniqueSelection<E> unique(){ + return UniqueSelection.from(this.select()); + } /** * Obtain a random element from the provided list. This is a convenience method @@ -307,7 +316,7 @@ public final class Selection<E> implements SelectionSyntax<E> { /** * Create a new {@code Entry}. This constructor is private intentionall * @param element The element to decorate. + */ - private Entry(E element) { + Entry(E element) { this.element = element; this.weight = 0.0; } diff --git a/src/main/java/net/sourceforge/cilib/util/selection/SelectionSyntax.java b/src/main/java/net/sourceforge/cilib/util/selection/SelectionSyntax.java index 2680d4b..4485c97 100644 --- a/src/main/java/net/sourceforge/cilib/util/selection/SelectionSyntax.java +++ b/src/main/java/net/sourceforge/cilib/util/selection/SelectionSyntax.java @@ -22,7 +22,6 @@ package net.sourceforge.cilib.util.selection; import java.util.List; -import net.sourceforge.cilib.math.random.generator.Random; import net.sourceforge.cilib.util.selection.ordering.Ordering; import net.sourceforge.cilib.util.selection.weighing.Weighing; @@ -46,10 +45,6 @@ public interface SelectionSyntax<E> { public SelectionSyntax<E> exclude(List<? extends E> exclusion); - public SelectionSyntax<E> random(Random random); - - public SelectionSyntax<E> random(Random random, int number); - public List<E> select(); public List<Selection.Entry<E>> entries(); diff --git a/src/main/java/net/sourceforge/cilib/util/selection/UniqueSelection.java b/src/main/java/net/sourceforge/cilib/util/selection/UniqueSelection.java new file mode 100644 index 0000000..fde9913 --- /dev/null +++ b/src/main/java/net/sourceforge/cilib/util/selection/UniqueSelection.java @@ -0,0 +1,236 @@ +/** + * Copyright (C) 2003 - 2009 + * Computational Intelligence Research Group (CIRG@UP) + * Department of Computer Science + * University of Pretoria + * South Africa + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +/** + * + */ +package net.sourceforge.cilib.util.selection; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import net.sourceforge.cilib.math.random.generator.Random; +import net.sourceforge.cilib.util.selection.Selection.Entry; +import net.sourceforge.cilib.util.selection.ordering.Ordering; +import net.sourceforge.cilib.util.selection.weighing.Weighing; + +/** + * <p> + * A {@code UniqueSelection} is an abstraction that allows operations to be applied to + * a collection instace that result in a selection of list elements, based on a varied of + * potential combination of operators. {@code UniqueSelection} is similar to {@code Selection}, except that the {#code random(int)} method + * will return a list of unique random entries. + * </p> + * @param <E> The comparable type. + * @author gpampara + * @author leo + */ +public class UniqueSelection<E> implements SelectionSyntax<E>, RandomSyntax<E> { + private List<Entry<E>> elements; + + /** + * Assign the UniqueSelection to take palce on the provided collection. The + * collection is copied to ensure that the original collection reference is + * not altered. + * @param elements The elements on which the selection should take place. + */ + private UniqueSelection(Collection<? extends E> elements) { + this.elements = new ArrayList<Entry<E>>(elements.size()); + + for (E element : elements) { + this.elements.add(new Entry<E>(element)); + } + } + + /** + * Create a selection that will operate on the provided collection. + * @param <T> The comparable type. + * @param elements The collection of elements to operate on. + * @return A UniqueSelection based on the provided collection. + */ + public static <T> UniqueSelection<T> from(List<? extends T> elements) { + return new UniqueSelection<T>(elements); + } + + /** + * Apply the provided ordering on the current selection. The result of the + * operation will result in a modified selection. + * @param ordering The ordering to orderBy. + * @return A selection upon which the ordering has been applied. + * @throws UnsupportedOperationException if the ordering cannot be applied. + */ + @Override + public SelectionSyntax<E> orderBy(Ordering<E> ordering) { + boolean result = ordering.order(this.elements); + + if (result) { + return this; + } + + throw new UnsupportedOperationException("The ordering [" + ordering.getClass().getSimpleName() + "] " + + "cannot be applied to the selection. Please ensure that the intention of the ordering is correct."); + } + + /** + * Apply the provided weighing on the current selection. The result of the + * operation will result in new weighed selection. + * @param weighing The weighing to weighWith. + * @return A selection upon which the weighing has been applied. + */ + @Override + public SelectionSyntax<E> weigh(Weighing<E> weighing) { + boolean result = weighing.weigh(this.elements); + + if (result) { + return this; + } + + throw new UnsupportedOperationException("The weighing [" + weighing.getClass().getSimpleName() + "]" + + "cannot be applied to the selection. Please ensure that the intention of the weighing is correct."); + } + + /** + * Obtain the first result from the current selection. These elements are returned + * from the front of the current selection. + * @return A selection containing the first element. + */ + @Override + public SelectionSyntax<E> first() { + this.elements = this.elements.subList(0, 1); + return this; + } + + /** + * Obtain the frist {@code number} of elements from the current selection. These + * elements are returned from the front of the current selection. + * @param number The number of elements to return. + * @return A selection containing the first {@code number} elements. + */ + @Override + public SelectionSyntax<E> first(int number) { + this.elements = this.elements.subList(0, number); + return this; + } + + /** + * Obtain the last element contained within the current selection. + * @return A selection containing the last element. + */ + @Override + public SelectionSyntax<E> last() { + this.elements = this.elements.subList(this.elements.size() - 1, this.elements.size()); + return this; + } + + /** + * Obtain the last {@code number} of elements from the current selection. + * @param number The number of elements to select. + * @return A selection containing the last {@code number} of elements. + */ + @Override + public SelectionSyntax<E> last(int number) { + this.elements = this.elements.subList(this.elements.size() - number, this.elements.size()); + return this; + } + + /** + * Obtain the result of the selection. + * @return A list of elements that the selection has selected. + */ + @Override + public List<E> select() { + List<E> result = new ArrayList<E>(); + + for (Entry<E> entry : elements) { + result.add(entry.getElement()); + } + + return result; + } + + /** + * Obtain the first result of the selection. + * @return The first element returned by the selection. + */ + @Override + public E singleSelect() { + return this.elements.get(0).getElement(); + } + + /** + * Obtain the list of internal {@code Entry} instances. + * @return The list of internal {@code Entry} instances. + */ + @Override + public List<Selection.Entry<E>> entries() { + return this.elements; + } + + /** + * Remove any {@code Entry}'s from {@code elements} that are also contained in {@code exclusion}. + * @return A selection containing the remaining elements which do not occur in {@code exclusion}. + */ + @Override + public UniqueSelection<E> exclude(List<? extends E> exclusion) { + for(int i = elements.size() - 1; i >= 0; --i){ + Entry element = elements.get(i); + if(exclusion.contains(element.getElement())) + elements.remove(element); + } + return this; + } + + /** + * Obtain a random element from the current UniqueSelection. + * @param random The random number to be used in the selection. + * @return A selection containing a random element from the original {@code elements} member. + */ + @Override + public SelectionSyntax<E> random(Random random) { + Entry<E> randomEntry = Selection.randomFrom(elements, random); + elements.clear(); + elements.add(randomEntry); + return this; + } + + /** + * Obtain a random number of elements from the current Selection. Each of these elements has to be unqiue + * @param random The random number to be used in the selection. + * @param number The number of elements to select. + * @return A selection containing the random elements from the original {@code elements} member. + */ + @Override + public SelectionSyntax<E> random(Random random, int number) { + if(number > elements.size()) + throw new RuntimeException("Unable to select " + number + " unique elements, current Selection only contains " + elements.size() + " elements."); + List<Entry<E>> tmp = new ArrayList<Entry<E>>(number); + + for (int i = 0; i < number; i++) { + int index = random.nextInt(elements.size()); + tmp.add(elements.get(index)); + elements.remove(index); + } + elements = tmp; + return this; + } + +} diff --git a/src/main/java/net/sourceforge/cilib/util/selection/UniqueSyntax.java b/src/main/java/net/sourceforge/cilib/util/selection/UniqueSyntax.java new file mode 100644 index 0000000..d33b36e --- /dev/null +++ b/src/main/java/net/sourceforge/cilib/util/selection/UniqueSyntax.java @@ -0,0 +1,28 @@ +/** + * Copyright (C) 2003 - 2009 + * Computational Intelligence Research Group (CIRG@UP) + * Department of Computer Science + * University of Pretoria + * South Africa + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +package net.sourceforge.cilib.util.selection; + +public interface UniqueSyntax<E> { + + public SelectionSyntax<E> unique(); + +} \ No newline at end of file diff --git a/src/test/java/net/sourceforge/cilib/util/selection/UniqueSelectionTest.java b/src/test/java/net/sourceforge/cilib/util/selection/UniqueSelectionTest.java new file mode 100644 index 0000000..06fed0c --- /dev/null +++ b/src/test/java/net/sourceforge/cilib/util/selection/UniqueSelectionTest.java @@ -0,0 +1,94 @@ +/** + * Copyright (C) 2003 - 2009 + * Computational Intelligence Research Group (CIRG@UP) + * Department of Computer Science + * University of Pretoria + * South Africa + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +package net.sourceforge.cilib.util.selection; + +import java.util.Arrays; +import java.util.List; + +import net.sourceforge.cilib.math.random.generator.MersenneTwister; +import net.sourceforge.cilib.math.random.generator.SeedSelectionStrategy; +import net.sourceforge.cilib.math.random.generator.Seeder; +import net.sourceforge.cilib.math.random.generator.ZeroSeederStrategy; + +import org.junit.Assert; +import org.junit.Test; + +public class UniqueSelectionTest { + @Test + public void lastSelection() { + List<Integer> elements = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9); + List<Integer> selection = Selection.from(elements).last(3).select(); + + Assert.assertEquals(3, selection.size()); + Assert.assertTrue(selection.contains(7)); + Assert.assertTrue(selection.contains(8)); + Assert.assertTrue(selection.contains(9)); + + selection = Selection.from(elements).last().select(); + Assert.assertEquals(1, selection.size()); + Assert.assertEquals(9, selection.get(0).intValue()); + } + + @Test + public void firstSelection() { + List<Integer> elements = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9); + List<Integer> selection = Selection.from(elements).first(3).select(); + + Assert.assertEquals(3, selection.size()); + Assert.assertEquals(1, selection.get(0).intValue()); + Assert.assertEquals(2, selection.get(1).intValue()); + Assert.assertEquals(3, selection.get(2).intValue()); + + selection = Selection.from(elements).first().select(); + Assert.assertEquals(1, selection.get(0).intValue()); + Assert.assertEquals(1, selection.size()); + } + + @Test + public void exclusionSelection(){ + List<Integer> elements = Arrays.asList(1, 2, 3, 4, 5, 6, 7); + List<Integer> exlusionElements = Arrays.asList(1, 2, 4, 6); + List<Integer> selection = Selection.from(elements).exclude(exlusionElements).first(3).select(); + Assert.assertEquals(3, selection.size()); + Assert.assertEquals(3, selection.get(0).intValue()); + Assert.assertEquals(5, selection.get(1).intValue()); + Assert.assertEquals(7, selection.get(2).intValue()); + } + + @Test + public void randomSelection(){ + SeedSelectionStrategy seedStrategy = Seeder.getSeederStrategy(); + Seeder.setSeederStrategy(new ZeroSeederStrategy()); + + try { + List<Integer> elements = Arrays.asList(1, 2, 3, 4); + List<Integer> selection = UniqueSelection.from(elements).random(new MersenneTwister(), 4).select(); + Assert.assertEquals(4, selection.size()); + Assert.assertEquals(4, selection.get(0).intValue()); + Assert.assertEquals(1, selection.get(1).intValue()); + Assert.assertEquals(3, selection.get(2).intValue()); + Assert.assertEquals(2, selection.get(3).intValue()); + } finally { + Seeder.setSeederStrategy(seedStrategy); + } + } +} -- 1.5.4.3 |
From: Gary P. <gpa...@gm...> - 2009-07-20 10:18:55
|
Hi, I agree with a lot in this patch, but the changes to the selection class just need to be massaged a little. One thing to take into consideration is that the random selection that needs to take place within the RandCreationStrategy requires that the selected entities should be unique, as in: i1 != i2 != i3 Maybe something like: Selection.from(list).unique().random(4) ? Also, I think that the manner in which the difference vectors are calculated should be changed a little. Having a private member in the class is very restrictive. Regards, Gary On Friday 17 July 2009 15:39:52 leo...@gm... wrote: > From: Leo Langenhoven <lla...@cs...> > > Please note: This patch replaces the previous Rand-to-best patch. > > Made some members of RandCreationStrategy protected, since Rand-to-Best > inherets from it. > Added a setScaleParameter method to RandCreationStrategy so that the > parameter can be set in the xml file. > Added new functionality to the Selection class: > 1. Added a exclusion method that accepts a list of entities. This method > will remove all elements from the Selection that exist in the exclusion > list. > 2. Added a random method and an overload that accepts a size parameter. > This method will randomly select elements from the current Selection. > > Refactored the RandomCreation class so that it will use the selection > interface in order to select entities when calculating the distance > vector. > > Test cases for the new functionality is also included. > --- > .../operators/creation/RandCreationStrategy.java | 52 ++++------ > .../creation/RandToBestCreationStrategy.java | 105 > ++++++++++++++++++++ .../cilib/util/selection/Selection.java | > 39 +++++++ .../cilib/util/selection/SelectionSyntax.java | 7 ++ > .../operators/creation/RandToBestCreationTest.java | 88 ++++++++++++++++ > .../cilib/util/selection/SelectionTest.java | 11 ++ > 6 files changed, 269 insertions(+), 33 deletions(-) > create mode 100644 > src/main/java/net/sourceforge/cilib/entity/operators/creation/RandToBestCre >ationStrategy.java create mode 100644 > src/test/java/net/sourceforge/cilib/entity/operators/creation/RandToBestCre >ationTest.java > > diff --git > a/src/main/java/net/sourceforge/cilib/entity/operators/creation/RandCreatio >nStrategy.java > b/src/main/java/net/sourceforge/cilib/entity/operators/creation/RandCreatio >nStrategy.java index 722a7de..59cd174 100644 > --- > a/src/main/java/net/sourceforge/cilib/entity/operators/creation/RandCreatio >nStrategy.java +++ > b/src/main/java/net/sourceforge/cilib/entity/operators/creation/RandCreatio >nStrategy.java @@ -21,7 +21,7 @@ > */ > package net.sourceforge.cilib.entity.operators.creation; > > -import java.util.ArrayList; > +import java.util.Arrays; > import java.util.Iterator; > import java.util.List; > > @@ -29,24 +29,25 @@ import > net.sourceforge.cilib.controlparameter.ConstantControlParameter; import > net.sourceforge.cilib.controlparameter.ControlParameter; > import net.sourceforge.cilib.entity.Entity; > import net.sourceforge.cilib.entity.Topology; > -import > net.sourceforge.cilib.entity.operators.selection.RandomSelectionStrategy; > -import net.sourceforge.cilib.entity.operators.selection.SelectionStrategy; > import net.sourceforge.cilib.entity.topologies.TopologyHolder; > +import net.sourceforge.cilib.math.random.generator.MersenneTwister; > +import net.sourceforge.cilib.math.random.generator.Random; > import net.sourceforge.cilib.type.types.Real; > import net.sourceforge.cilib.type.types.container.Vector; > +import net.sourceforge.cilib.util.selection.Selection; > > public class RandCreationStrategy implements CreationStrategy { > private static final long serialVersionUID = 930740770470361009L; > > - private ControlParameter scaleParameter; > - private ControlParameter numberOfDifferenceVectors; > + protected ControlParameter scaleParameter; > + protected ControlParameter numberOfDifferenceVectors; > > /** > * Create a new instance of {@code CurrentToRandCreationStrategy}. > */ > public RandCreationStrategy() { > this.scaleParameter = new ConstantControlParameter(0.5); > - this.numberOfDifferenceVectors = new ConstantControlParameter(1); > + this.numberOfDifferenceVectors = new ConstantControlParameter(2); > } > > /** > @@ -72,7 +73,8 @@ public class RandCreationStrategy implements > CreationStrategy { */ > @Override > public Entity create(Entity targetEntity, Entity current, Topology<? > extends Entity> topology) { - List<Entity> participants = > selectEntities(current, topology); + Random random = new > MersenneTwister(); > + List<Entity> participants = > Selection.from(topology.asList()).exclude(Arrays.asList(targetEntity, > current)).random(random, > (int)numberOfDifferenceVectors.getParameter()).select(); Vector > differenceVector = determineDistanceVector(participants); > > Vector targetVector = (Vector) > targetEntity.getCandidateSolution(); @@ -92,7 +94,7 @@ public class > RandCreationStrategy implements CreationStrategy { * reduce the > diversity of the population as not all entities will be considered. * > @return A {@linkplain Vector} representing the resultant of all calculated > difference vectors. */ > - private Vector determineDistanceVector(List<Entity> participants) { > + protected Vector determineDistanceVector(List<Entity> participants) { > Vector distanceVector = new > Vector(participants.get(0).getCandidateSolution().size(), new Real(0.0)); > Iterator<Entity> iterator = participants.iterator(); > > @@ -108,31 +110,6 @@ public class RandCreationStrategy implements > CreationStrategy { } > > /** > - * This private method implements the "y" part of the DE/x/y/z > structure. - * @param current The current {@linkplain Entity} in the > {@linkplain Topology} - * @param topology The current population. > - * @return {@linkplain List} containing the entities to be used in the > calculation of - * the difference vectors. > - */ > - private List<Entity> selectEntities(Entity current, Topology<? extends > Entity> topology) { - SelectionStrategy randomSelectionStrategy = > new RandomSelectionStrategy(); - List<Entity> participants = new > ArrayList<Entity>(); > - > - int total = 2 * > Double.valueOf(this.numberOfDifferenceVectors.getParameter()).intValue(); - > - while (participants.size() < total) { > - Entity entity = randomSelectionStrategy.select(topology); > - > - if (participants.contains(entity)) continue; > - if (current == entity) continue; > - > - participants.add(entity); > - } > - > - return participants; > - } > - > - /** > * {@inheritDoc} > */ > @Override > @@ -140,5 +117,14 @@ public class RandCreationStrategy implements > CreationStrategy { throw new UnsupportedOperationException("Not supported > yet. This may need some more refactoring. May require looping operator?"); > } > > + public void setScaleParameter(ControlParameter scaleParameter) { > + this.scaleParameter = scaleParameter; > + } > + > + public void setNumberOfDifferenceVectors( > + ControlParameter numberOfDifferenceVectors) { > + this.numberOfDifferenceVectors = numberOfDifferenceVectors; > + } > + > > } > diff --git > a/src/main/java/net/sourceforge/cilib/entity/operators/creation/RandToBestC >reationStrategy.java > b/src/main/java/net/sourceforge/cilib/entity/operators/creation/RandToBestC >reationStrategy.java new file mode 100644 > index 0000000..7797796 > --- /dev/null > +++ > b/src/main/java/net/sourceforge/cilib/entity/operators/creation/RandToBestC >reationStrategy.java @@ -0,0 +1,105 @@ > +/** > + * Copyright (C) 2003 - 2009 > + * Computational Intelligence Research Group (CIRG@UP) > + * Department of Computer Science > + * University of Pretoria > + * South Africa > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License as published by > + * the Free Software Foundation; either version 2 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 General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program; if not, write to the Free Software > + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 > USA + */ > +/** > + * > + */ > +package net.sourceforge.cilib.entity.operators.creation; > + > +import java.util.Arrays; > +import java.util.List; > + > +import net.sourceforge.cilib.controlparameter.ConstantControlParameter; > +import net.sourceforge.cilib.controlparameter.ControlParameter; > +import net.sourceforge.cilib.entity.Entity; > +import net.sourceforge.cilib.entity.Topology; > +import net.sourceforge.cilib.entity.topologies.TopologyHolder; > +import net.sourceforge.cilib.math.random.generator.MersenneTwister; > +import net.sourceforge.cilib.math.random.generator.Random; > +import net.sourceforge.cilib.type.types.container.Vector; > +import net.sourceforge.cilib.util.selection.Selection; > + > +/** > + * @author leo > + * This is an implimentation of the Rand-to-best DE target creation > strategy. This implimentation is simply an extension of the {@linkplain > RandCreationStrategy} that also includes the best {@linkplain Entity}'s > solution vector. The influence of the best vector and the + * random vector > is determined by the greedynessParameter, which is sampled as E [0,1]. A > value of 0 will ignore the contribution of the best {@linkplain Entity}, > and a + * value of 1 will ignore the controbution of the random {@linkplain > Entity}. + */ > +public class RandToBestCreationStrategy extends RandCreationStrategy { > + private static final long serialVersionUID = 413628791093573875L; > + private ControlParameter greedynessParameter; > + /** > + * Create a new instance of {@code RandToBestCreationStrategy}. > + */ > + public RandToBestCreationStrategy() { > + super(); > + greedynessParameter = new ConstantControlParameter(0.5); > + } > + /** > + * Copy constructor. Create a copy of the provided instance. > + * @param copy The instance to copy. > + */ > + public RandToBestCreationStrategy(RandToBestCreationStrategy other) { > + super(other); > + greedynessParameter = other.greedynessParameter.getClone(); > + } > + > + /** > + * {@inheritDoc} > + */ > + public Entity create(Entity targetEntity, Entity current, > + Topology<? extends Entity> topology) { > + Entity bestEntity = topology.getBestEntity(); > + Random random = new MersenneTwister(); > + List<Entity> participants = > Selection.from(topology.asList()).exclude(Arrays.asList(targetEntity, > bestEntity, current)).random(random, > (int)numberOfDifferenceVectors.getParameter()).select(); + Vector > differenceVector = determineDistanceVector(participants); + > + Vector targetVector = ((Vector) > targetEntity.getCandidateSolution()).multiply(1 - > greedynessParameter.getParameter()); + Vector bestVector = > ((Vector) > bestEntity.getCandidateSolution()).multiply(greedynessParameter.getParamete >r()); + > + Vector trialVector = > bestVector.plus(targetVector.plus(differenceVector.multiply(scaleParameter. >getParameter()))); + > + Entity trialEntity = current.getClone(); > + trialEntity.setCandidateSolution(trialVector); > + > + return trialEntity; > + } > + > + /** > + * {@inheritDoc} > + */ > + public RandToBestCreationStrategy getClone() { > + return new RandToBestCreationStrategy(this); > + } > + > + /** > + * {@inheritDoc} > + */ > + @Override > + public void performOperation(TopologyHolder holder) { > + throw new UnsupportedOperationException("Not supported yet. This > may need some more refactoring. May require looping operator?"); + } > + > + public void setGreedynessParameter(ControlParameter greedynessParameter) > { + this.greedynessParameter = greedynessParameter; > + } > + > +} > diff --git > a/src/main/java/net/sourceforge/cilib/util/selection/Selection.java > b/src/main/java/net/sourceforge/cilib/util/selection/Selection.java index > 29c069b..6b01214 100644 > --- a/src/main/java/net/sourceforge/cilib/util/selection/Selection.java > +++ b/src/main/java/net/sourceforge/cilib/util/selection/Selection.java > @@ -249,7 +249,46 @@ public final class Selection<E> implements > SelectionSyntax<E> { @Override > public List<Selection.Entry<E>> entries() { > return this.elements; > + } > + > + /** > + * Remove any {@code Entry}'s from {@code elements} that are also > contained in {@code exclusion}. + * @return A selection containing the > remaining elements which do not occur in {@code exclusion}. + */ > + @Override > + public Selection<E> exclude(List<? extends E> exclusion) { > + for(int i = elements.size() - 1; i >= 0; --i){ > + Entry element = elements.get(i); > + if(exclusion.contains(element.getElement())) > + elements.remove(element); > + } > + return this; > + } > + > + /** > + * Obtain a random element from the current Selection. > + * @param random The random number to be used in the selection. > + * @return A selection containing a random element from the original > {@code elements} member. + */ > + @Override > + public SelectionSyntax<E> random(Random random) { > + Entry<E> randomEntry = Selection.randomFrom(elements, random); > + elements.clear(); > + elements.add(randomEntry); > + return this; > } > + > + /** > + * Obtain a random number of elements from the current Selection. > + * @param random The random number to be used in the selection. > + * @param number The number of elements to select. > + * @return A selection containing the random elements from the > original {@code elements} member. + */ > + @Override > + public SelectionSyntax<E> random(Random random, int number) { > + elements = Selection.randomFrom(elements, random, number); > + return this; > + } > > /** > * This class provides the notion of an entry within a list > diff --git > a/src/main/java/net/sourceforge/cilib/util/selection/SelectionSyntax.java > b/src/main/java/net/sourceforge/cilib/util/selection/SelectionSyntax.java > index 9cd9ea2..2680d4b 100644 > --- > a/src/main/java/net/sourceforge/cilib/util/selection/SelectionSyntax.java > +++ > b/src/main/java/net/sourceforge/cilib/util/selection/SelectionSyntax.java > @@ -22,6 +22,7 @@ > package net.sourceforge.cilib.util.selection; > > import java.util.List; > +import net.sourceforge.cilib.math.random.generator.Random; > import net.sourceforge.cilib.util.selection.ordering.Ordering; > import net.sourceforge.cilib.util.selection.weighing.Weighing; > > @@ -42,6 +43,12 @@ public interface SelectionSyntax<E> { > public SelectionSyntax<E> last(); > > public SelectionSyntax<E> last(int number); > + > + public SelectionSyntax<E> exclude(List<? extends E> exclusion); > + > + public SelectionSyntax<E> random(Random random); > + > + public SelectionSyntax<E> random(Random random, int number); > > public List<E> select(); > > diff --git > a/src/test/java/net/sourceforge/cilib/entity/operators/creation/RandToBestC >reationTest.java > b/src/test/java/net/sourceforge/cilib/entity/operators/creation/RandToBestC >reationTest.java new file mode 100644 > index 0000000..f749f88 > --- /dev/null > +++ > b/src/test/java/net/sourceforge/cilib/entity/operators/creation/RandToBestC >reationTest.java @@ -0,0 +1,88 @@ > +/** > + * Copyright (C) 2003 - 2009 > + * Computational Intelligence Research Group (CIRG@UP) > + * Department of Computer Science > + * University of Pretoria > + * South Africa > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License as published by > + * the Free Software Foundation; either version 2 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 General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program; if not, write to the Free Software > + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 > USA + */ > +/** > + * > + */ > +package net.sourceforge.cilib.entity.operators.creation; > + > +import static org.hamcrest.CoreMatchers.is; > +import net.sourceforge.cilib.ec.Individual; > +import net.sourceforge.cilib.entity.Entity; > +import net.sourceforge.cilib.entity.EntityType; > +import net.sourceforge.cilib.entity.Topology; > +import net.sourceforge.cilib.entity.topologies.GBestTopology; > +import net.sourceforge.cilib.math.random.generator.SeedSelectionStrategy; > +import net.sourceforge.cilib.math.random.generator.Seeder; > +import net.sourceforge.cilib.math.random.generator.ZeroSeederStrategy; > +import net.sourceforge.cilib.problem.MinimisationFitness; > +import net.sourceforge.cilib.type.types.Real; > +import net.sourceforge.cilib.type.types.container.Vector; > + > +import org.junit.Assert; > +import org.junit.Test; > + > +/** > + * @author leo > + * > + */ > +public class RandToBestCreationTest { > + > + @Test > + public void randToBestCreationTest(){ > + SeedSelectionStrategy seedStrategy = Seeder.getSeederStrategy(); > + Seeder.setSeederStrategy(new ZeroSeederStrategy()); > + > + try { > + > + RandToBestCreationStrategy creation = new RandToBestCreationStrategy(); > + Topology<Individual> testTopology = new GBestTopology<Individual>(); > + > + Entity current = new Individual(); > + Entity entityBest = new Individual(); > + Entity entityRandom = new Individual(); > + Entity entity1 = new Individual(); > + Entity entity2 = new Individual(); > + > + testTopology.add((Individual)current); > + testTopology.add((Individual)entityBest); > + testTopology.add((Individual)entityRandom); > + testTopology.add((Individual)entity1); > + testTopology.add((Individual)entity2); > + > + entityBest.getProperties().put(EntityType.FITNESS, new > MinimisationFitness(0.0)); + > entityBest.getProperties().put(EntityType.CANDIDATE_SOLUTION, new Vector(1, > new Real(0.1))); + > entityRandom.getProperties().put(EntityType.FITNESS, new > MinimisationFitness(1.0)); + > entityRandom.getProperties().put(EntityType.CANDIDATE_SOLUTION, new > Vector(1, new Real(0.2))); + > entity1.getProperties().put(EntityType.FITNESS, new > MinimisationFitness(2.0)); + > entity1.getProperties().put(EntityType.CANDIDATE_SOLUTION, new Vector(1, > new Real(0.3))); + entity2.getProperties().put(EntityType.FITNESS, > new MinimisationFitness(3.0)); + > entity2.getProperties().put(EntityType.CANDIDATE_SOLUTION, new Vector(1, > new Real(0.4))); + > + Entity resultEntity = creation.create(entityRandom, current, > testTopology); + > + Assert.assertThat((Double)((Vector)resultEntity.getCandidateSolution()) >.get(0).getReal(), is(0.2)); + } finally { > + Seeder.setSeederStrategy(seedStrategy); > + } > + } > + > +} > diff --git > a/src/test/java/net/sourceforge/cilib/util/selection/SelectionTest.java > b/src/test/java/net/sourceforge/cilib/util/selection/SelectionTest.java > index 60fce8c..476ed37 100644 > --- a/src/test/java/net/sourceforge/cilib/util/selection/SelectionTest.java > +++ b/src/test/java/net/sourceforge/cilib/util/selection/SelectionTest.java > @@ -61,4 +61,15 @@ public class SelectionTest { > Assert.assertEquals(1, selection.get(0).intValue()); > Assert.assertEquals(1, selection.size()); > } > + > + @Test > + public void exclusionSelection(){ > + List<Integer> elements = Arrays.asList(1, 2, 3, 4, 5, 6, 7); > + List<Integer> exlusionElements = Arrays.asList(1, 2, 4, 6); > + List<Integer> selection = > Selection.from(elements).exclude(exlusionElements).first(3).select(); + > Assert.assertEquals(3, selection.size()); > + Assert.assertEquals(3, selection.get(0).intValue()); > + Assert.assertEquals(5, selection.get(1).intValue()); > + Assert.assertEquals(7, selection.get(2).intValue()); > + } > } |
From: Gary P. <gpa...@gm...> - 2009-07-20 06:35:36
|
Removed the initialization of the strategy parameters from the Individual. This will be replaced by a generic strategy parameter initialization scheme. Signed-off-by: Gary Pampara <gpa...@gm...> --- .../java/net/sourceforge/cilib/ec/Individual.java | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/sourceforge/cilib/ec/Individual.java b/src/main/java/net/sourceforge/cilib/ec/Individual.java index 3abfde5..a236ba8 100644 --- a/src/main/java/net/sourceforge/cilib/ec/Individual.java +++ b/src/main/java/net/sourceforge/cilib/ec/Individual.java @@ -113,11 +113,11 @@ public class Individual extends AbstractEntity { this.setCandidateSolution(problem.getDomain().getBuiltRepresenation().getClone()); this.getCandidateSolution().randomize(random); - if (problem.getBehaviouralDomain().getBuiltRepresenation() != null) { - this.getProperties().put(EntityType.Individual.PHENOTYPES, problem.getBehaviouralDomain().getBuiltRepresenation().getClone()); - StructuredType phenotypes = (StructuredType) this.getProperties().get(EntityType.Individual.PHENOTYPES); - phenotypes.randomize(random); - } +// if (problem.getBehaviouralDomain().getBuiltRepresenation() != null) { +// this.getProperties().put(EntityType.Individual.PHENOTYPES, problem.getBehaviouralDomain().getBuiltRepresenation().getClone()); +// StructuredType phenotypes = (StructuredType) this.getProperties().get(EntityType.Individual.PHENOTYPES); +// phenotypes.randomize(random); +// } this.dimension = this.getCandidateSolution().size(); this.getProperties().put(EntityType.FITNESS, InferiorFitness.instance()); -- 1.6.3.3 |
From: Gary P. <gpa...@gm...> - 2009-07-20 06:35:28
|
Functions provide a relationship for an input to an output. These changes define that the input and output types are parameterized. This removed the need to have: public Object getMinimum() { return new Double(0.0); } and simply allows: public Double getMinimum() { return 0.0; } where the function is defined to be a Function<F, Double> where F is any input type. Additionally, this makes the API simpler to use and adds more type safety to the functions. The most notable is that DiscreteFunctions now work with Integer objects and not Double objects, was was the case previously. Signed-off-by: Gary Pampara <gpa...@gm...> --- .../cilib/functions/ContinuousFunction.java | 37 ++----- .../cilib/functions/DiscreteFunction.java | 32 +----- .../net/sourceforge/cilib/functions/Function.java | 109 ++++--------------- .../functions/activation/ActivationFunction.java | 12 +-- .../cilib/functions/activation/Sigmoid.java | 17 +-- .../clustering/ClusteringFitnessFunction.java | 2 +- .../cilib/functions/continuous/ContinuousStep.java | 13 +- .../functions/continuous/ExpressionFunction.java | 4 +- .../cilib/functions/continuous/Foxholes.java | 9 +- .../continuous/FunctionDimensionMapping.java | 4 +- .../cilib/functions/continuous/GoldsteinPrice.java | 10 +- .../cilib/functions/continuous/Himmelblau.java | 16 +-- .../cilib/functions/continuous/HyperEllipsoid.java | 9 +- .../continuous/MaximumDeratingFunction1.java | 12 +- .../cilib/functions/continuous/Michalewicz12.java | 120 -------------------- .../functions/continuous/MultimodalFunction1.java | 9 +- .../functions/continuous/MultimodalFunction2.java | 11 +- .../functions/continuous/MultimodalFunction3.java | 9 +- .../functions/continuous/MultimodalFunction4.java | 11 +- .../functions/continuous/MultimodalFunction5.java | 7 +- .../cilib/functions/continuous/NastyBenchmark.java | 9 +- .../cilib/functions/continuous/Neumaier3.java | 10 +- .../cilib/functions/continuous/Quadric.java | 14 +- .../cilib/functions/continuous/Quartic.java | 15 ++- .../cilib/functions/continuous/Ripple.java | 7 +- .../cilib/functions/continuous/Salomon.java | 10 +- .../cilib/functions/continuous/Schaffer2.java | 9 +- .../cilib/functions/continuous/Schaffer6.java | 7 +- .../cilib/functions/continuous/Schwefel.java | 11 +- .../functions/continuous/SchwefelProblem1_2.java | 8 +- .../functions/continuous/SchwefelProblem2_21.java | 12 +- .../functions/continuous/SchwefelProblem2_22.java | 13 +- .../functions/continuous/SchwefelProblem2_26.java | 9 +- .../cilib/functions/continuous/ShekelN.java | 13 +- .../functions/continuous/ShekelsFoxholes.java | 9 +- .../cilib/functions/continuous/Shir.java | 11 +- .../cilib/functions/continuous/Shubert.java | 9 +- .../functions/continuous/SixHumpCamelBack.java | 11 +- .../cilib/functions/continuous/Step.java | 6 +- .../cilib/functions/continuous/UrsemF1.java | 7 +- .../cilib/functions/continuous/UrsemF3.java | 7 +- .../cilib/functions/continuous/UrsemF4.java | 7 +- .../continuous/decorators/AngleModulation.java | 24 ++-- .../decorators/InvertedFunctionDecorator.java | 12 +- .../decorators/NoisyFunctionDecorator.java | 4 +- .../decorators/ReflectedFunctionDecorator.java | 12 +- .../decorators/RotatedFunctionDecorator.java | 10 +- .../decorators/ScaledFunctionDecorator.java | 12 +- .../decorators/ShiftedFunctionDecorator.java | 10 +- .../functions/continuous/dynamic/MovingPeaks.java | 13 +- .../continuous/dynamic/moo/fda1/FDA1_f1.java | 5 +- .../continuous/dynamic/moo/fda1/FDA1_f2.java | 11 +- .../continuous/dynamic/moo/fda1/FDA1_g.java | 7 +- .../continuous/dynamic/moo/fda1/FDA1_h.java | 9 +- .../continuous/dynamic/moo/fda2/FDA2_f1.java | 5 +- .../continuous/dynamic/moo/fda2/FDA2_f2.java | 10 +- .../continuous/dynamic/moo/fda2/FDA2_g.java | 7 +- .../continuous/dynamic/moo/fda2/FDA2_h.java | 19 ++-- .../continuous/unconstrained/AbsoluteValue.java | 8 +- .../functions/continuous/unconstrained/Ackley.java | 10 +- .../functions/continuous/unconstrained/Beale.java | 10 +- .../functions/continuous/unconstrained/Bird.java | 10 +- .../continuous/unconstrained/Bohachevsky1.java | 8 +- .../continuous/unconstrained/Bohachevsky2.java | 4 +- .../continuous/unconstrained/Bohachevsky3.java | 4 +- .../functions/continuous/unconstrained/Booth.java | 10 +- .../functions/continuous/unconstrained/Branin.java | 11 +- .../functions/continuous/unconstrained/Bukin4.java | 10 +- .../functions/continuous/unconstrained/Bukin6.java | 10 +- .../continuous/unconstrained/Colville.java | 15 ++- .../continuous/unconstrained/Damavandi.java | 12 +- .../functions/continuous/unconstrained/Easom.java | 13 +- .../continuous/unconstrained/EggHolder.java | 16 ++-- .../continuous/unconstrained/Griewank.java | 13 +- .../continuous/unconstrained/Michalewicz.java | 12 +- .../continuous/unconstrained/Rastrigin.java | 9 +- .../continuous/unconstrained/Rosenbrock.java | 12 +- .../continuous/unconstrained/Spherical.java | 11 +- .../cilib/functions/discrete/BinaryAdapter.java | 27 ++--- .../cilib/functions/discrete/BitStringMatcher.java | 15 +-- .../cilib/functions/discrete/KnapSack.java | 20 ++-- .../cilib/functions/discrete/KnightsCoverage.java | 2 +- .../cilib/functions/discrete/KnightsTour.java | 22 ++-- .../discrete/LongestCommonSubsequence.java | 16 ++-- .../cilib/functions/discrete/Queens.java | 8 +- .../single/GenericFunctionMeasurement.java | 8 +- .../foundation/NeuralNetworkRetrievalVisitor.java | 4 +- .../neuralnetwork/testarea/NNFunctionAdapter.java | 8 +- .../DeratingFunctionMaximisationProblem.java | 13 +- .../cilib/problem/FunctionLearningProblem.java | 15 ++- .../cilib/problem/FunctionMaximisationProblem.java | 5 +- .../cilib/problem/FunctionMinimisationProblem.java | 5 +- .../cilib/problem/FunctionOptimisationProblem.java | 12 +- .../NaturalOrderFitnessComparatorTest.java | 78 +++++++++++++ .../cilib/functions/continuous/QuarticTest.java | 9 +- .../unconstrained/AbsoluteValueTest.java | 3 +- .../continuous/unconstrained/AckleyTest.java | 3 +- .../continuous/unconstrained/BealeTest.java | 3 +- .../continuous/unconstrained/BirdTest.java | 3 +- .../continuous/unconstrained/Bohachevsky1Test.java | 3 +- .../continuous/unconstrained/BoothTest.java | 3 +- .../continuous/unconstrained/BraninTest.java | 4 +- .../continuous/unconstrained/Bukin4Test.java | 2 +- .../continuous/unconstrained/Bukin6Test.java | 3 +- .../continuous/unconstrained/ColvilleTest.java | 3 +- .../continuous/unconstrained/DamavandiTest.java | 3 +- .../continuous/unconstrained/EasomTest.java | 2 +- .../continuous/unconstrained/GriewankTest.java | 2 +- .../continuous/unconstrained/RastriginTest.java | 3 +- .../continuous/unconstrained/SphericalTest.java | 3 +- .../problem/FunctionMinimisationProblemTest.java | 6 +- 111 files changed, 623 insertions(+), 738 deletions(-) delete mode 100644 src/main/java/net/sourceforge/cilib/functions/continuous/Michalewicz12.java create mode 100644 src/test/java/net/sourceforge/cilib/entity/comparator/NaturalOrderFitnessComparatorTest.java diff --git a/src/main/java/net/sourceforge/cilib/functions/ContinuousFunction.java b/src/main/java/net/sourceforge/cilib/functions/ContinuousFunction.java index 59397a3..7453a8d 100644 --- a/src/main/java/net/sourceforge/cilib/functions/ContinuousFunction.java +++ b/src/main/java/net/sourceforge/cilib/functions/ContinuousFunction.java @@ -21,15 +21,13 @@ */ package net.sourceforge.cilib.functions; -import net.sourceforge.cilib.type.types.Type; import net.sourceforge.cilib.type.types.container.Vector; /** * @author Edwin Peer * @author Olusegun Olorunda */ -public abstract class ContinuousFunction extends Function { - +public abstract class ContinuousFunction extends AbstractFunction<Vector, Double> { private static final long serialVersionUID = -2483529496289508896L; /** @@ -50,42 +48,23 @@ public abstract class ContinuousFunction extends Function { /** * {@inheritDoc} */ + @Override public abstract ContinuousFunction getClone(); /** * {@inheritDoc} */ - public Object getMinimum() { - return new Double(-Double.MAX_VALUE); - } - - /** - * {@inheritDoc} - */ - public Object getMaximum() { - return new Double(Double.MAX_VALUE); + @Override + public Double getMinimum() { + return -Double.MAX_VALUE; } /** * {@inheritDoc} */ - public Double evaluate(Type x) { - Double d = null; - try { - d = new Double(evaluate((Vector) x)); - } - catch (ClassCastException c) { - c.printStackTrace(); - } - - return d; + @Override + public Double getMaximum() { + return Double.MAX_VALUE; } - /** - * Evaluate the function with the given {@link net.sourceforge.cilib.type.types.container.Vector} as input. - * @param x The input {@link net.sourceforge.cilib.type.types.container.Vector}. - * @return The value of the evaluation. - */ - public abstract double evaluate(Vector x); - } diff --git a/src/main/java/net/sourceforge/cilib/functions/DiscreteFunction.java b/src/main/java/net/sourceforge/cilib/functions/DiscreteFunction.java index 407b8f9..5485622 100644 --- a/src/main/java/net/sourceforge/cilib/functions/DiscreteFunction.java +++ b/src/main/java/net/sourceforge/cilib/functions/DiscreteFunction.java @@ -21,13 +21,12 @@ */ package net.sourceforge.cilib.functions; -import net.sourceforge.cilib.type.types.Type; import net.sourceforge.cilib.type.types.container.Vector; /** * @author Gary Pampara */ -public abstract class DiscreteFunction extends Function { +public abstract class DiscreteFunction extends AbstractFunction<Vector, Integer> { private static final long serialVersionUID = -1966158048234228064L; /** @@ -39,36 +38,15 @@ public abstract class DiscreteFunction extends Function { /** * {@inheritDoc} */ - public Object getMinimum() { - return new Double(-Double.MAX_VALUE); + public Integer getMinimum() { + return -Integer.MAX_VALUE; } /** * {@inheritDoc} */ - public Object getMaximum() { - return new Double(Double.MAX_VALUE); + public Integer getMaximum() { + return Integer.MAX_VALUE; } - /** - * {@inheritDoc} - */ - public Double evaluate(Type x) { - Double d = null; - try { - d = new Double(evaluate((Vector) x)); - } - catch (ClassCastException c) { - c.printStackTrace(); - } - - return d; - } - - /** - * Evaluate the function output, given the function input, {@code x}. - * @param x The {@linkplain Vector} representing the function input. - * @return The result of the evaluation. - */ - public abstract double evaluate(Vector x); } diff --git a/src/main/java/net/sourceforge/cilib/functions/Function.java b/src/main/java/net/sourceforge/cilib/functions/Function.java index d883fcf..75079fb 100644 --- a/src/main/java/net/sourceforge/cilib/functions/Function.java +++ b/src/main/java/net/sourceforge/cilib/functions/Function.java @@ -21,113 +21,44 @@ */ package net.sourceforge.cilib.functions; -import java.io.Serializable; - -import net.sourceforge.cilib.type.DomainRegistry; -import net.sourceforge.cilib.type.StringBasedDomainRegistry; -import net.sourceforge.cilib.type.types.Type; import net.sourceforge.cilib.util.Cloneable; /** - * All functions should inherit from <code>Function</code>. - * @author Edwin Peer - * @author Gary Pampara + * Function difinition. All functions apply some or other transformation + * on a set of input variables and create an output that is representative of + * the input. + * @param <F> The "from" type. + * @param <T> The "to" type. */ -public abstract class Function implements Cloneable, Serializable { - private static final long serialVersionUID = -4843291761555348251L; - - private DomainRegistry domainRegistry; - private DomainRegistry behavioralDomainRegistry; - - /** - * Create a new instance of {@linkplain Function}. - */ - public Function() { - domainRegistry = new StringBasedDomainRegistry(); - behavioralDomainRegistry = new StringBasedDomainRegistry(); - } - - /** - * Create a copy of the provided instance. - * @param copy The instance to copy. - */ - public Function(Function copy) { - domainRegistry = copy.domainRegistry.getClone(); - behavioralDomainRegistry = copy.behavioralDomainRegistry.getClone(); - } +public interface Function<F, T> extends Cloneable { /** - * @return The dimension of the function. + * Perfrom the evaluation of the input and return the result. + * @param input The input for the function. + * @return The result of the evaluation. */ - public int getDimension() { - return this.getDomainRegistry().getDimension(); - } + public T evaluate(F input); /** - * Accessor for the domain of the function. See {@link net.sourceforge.cilib.Domain.Component}. - * @return The function domain. + * The maximum of the function. + * @return The function maximum. */ - public DomainRegistry getDomainRegistry() { - return domainRegistry; - } + public T getMaximum(); /** - * @return Returns the behaviouralDomainRegistry. + * The minimum of the function. + * @return The function minimum. */ - public DomainRegistry getBehavioralDomainRegistry() { - return behavioralDomainRegistry; - } + public T getMinimum(); /** - * @param behavioralDomainRegistry The behaviouralDomainRegistry to set. + * @return The dimension of the function. */ - public void setBehaviouralDomainRegistry(StringBasedDomainRegistry behavioralDomainRegistry) { - throw new UnsupportedOperationException("You are not allowed to set the BehaviroalDomainRegistry!"); - } + public int getDimension(); /** * @return The domain {@linkplain String}. */ - public String getDomain() { - return domainRegistry.getDomainString(); - } - - /** - * Sets the domain of the function. - * @param representation the string representation for the function domain. - */ - public void setDomain(String representation) { - this.domainRegistry.setDomainString(representation); - } - - /** - * Set the behavioural domain of the {@linkplain Function}. - * @param behavioralDomain The value to set. - */ - public void setBehavioralDomain(String behavioralDomain) { - this.behavioralDomainRegistry.setDomainString(behavioralDomain); - } - - /** - * Accessor for the function minimum. This is the minimum value of the function in the given - * domain. - * @return The minimum function value. - */ - public abstract Object getMinimum(); - - /** - * Accessor for the function maximum. This is the maximum value of the function in the given - * domain. - * @return The maximum of the function. - */ - public abstract Object getMaximum(); - - /** - * Each function must provide an implementation which returns the function value at the given - * position. The length of the position array should be the same as the function dimension. - * @param x the position - * @return The result of the evaluation. - */ - public abstract Double evaluate(Type x); - + public String getDomain(); + } diff --git a/src/main/java/net/sourceforge/cilib/functions/activation/ActivationFunction.java b/src/main/java/net/sourceforge/cilib/functions/activation/ActivationFunction.java index bd4a632..ad8b2e5 100644 --- a/src/main/java/net/sourceforge/cilib/functions/activation/ActivationFunction.java +++ b/src/main/java/net/sourceforge/cilib/functions/activation/ActivationFunction.java @@ -22,23 +22,17 @@ package net.sourceforge.cilib.functions.activation; import net.sourceforge.cilib.functions.Differentiable; -import net.sourceforge.cilib.functions.Function; -import net.sourceforge.cilib.type.types.Type; +import net.sourceforge.cilib.functions.AbstractFunction; +import net.sourceforge.cilib.type.types.container.Vector; /** * Activation functions are functions that are typically used within Neurons. This class provides * an abstraction for all functions that can be used in this manner. */ -public abstract class ActivationFunction extends Function implements Differentiable { +public abstract class ActivationFunction extends AbstractFunction<Vector, Double> implements Differentiable { private static final long serialVersionUID = 4692200308338537909L; /** - * {@inheritDoc} - */ - @Override - public abstract Double evaluate(Type x); - - /** * Determine the value of the {@link ActivationFunction} at the provided <code>point</code>. * The provided <code>point</code> is simply a {@linkplain Number} that is provided as input. * @param number The input value. diff --git a/src/main/java/net/sourceforge/cilib/functions/activation/Sigmoid.java b/src/main/java/net/sourceforge/cilib/functions/activation/Sigmoid.java index eaa62c3..2e749e4 100644 --- a/src/main/java/net/sourceforge/cilib/functions/activation/Sigmoid.java +++ b/src/main/java/net/sourceforge/cilib/functions/activation/Sigmoid.java @@ -24,7 +24,6 @@ package net.sourceforge.cilib.functions.activation; import net.sourceforge.cilib.controlparameter.ConstantControlParameter; import net.sourceforge.cilib.controlparameter.ControlParameter; import net.sourceforge.cilib.type.types.Real; -import net.sourceforge.cilib.type.types.Type; import net.sourceforge.cilib.type.types.container.Vector; import net.sourceforge.cilib.util.Vectors; @@ -61,16 +60,14 @@ public class Sigmoid extends ActivationFunction { * {@inheritDoc} */ @Override - public Double evaluate(Type x) { - Vector vector = (Vector) x; - - if (vector.getDimension() != 1) + public Double evaluate(Vector input) { + if (input.getDimension() != 1) throw new UnsupportedOperationException("Cannot determine the actvation of more than a single value"); if (steepness.getParameter() < 0.0) throw new UnsupportedOperationException("Steepness value for sigmoid function must be >= 0"); - return (1.0 / (1.0+Math.pow(Math.E, -1.0*steepness.getParameter()*(vector.getReal(0)-offset.getParameter())))); + return (1.0 / (1.0+Math.pow(Math.E, -1.0*steepness.getParameter()*(input.getReal(0)-offset.getParameter())))); } /** @@ -87,16 +84,16 @@ public class Sigmoid extends ActivationFunction { * {@inheritDoc} */ @Override - public Object getMaximum() { - return new Double(1.0); + public Double getMaximum() { + return 1.0; } /** * {@inheritDoc} */ @Override - public Object getMinimum() { - return new Double(0.0); + public Double getMinimum() { + return 0.0; } /** diff --git a/src/main/java/net/sourceforge/cilib/functions/clustering/ClusteringFitnessFunction.java b/src/main/java/net/sourceforge/cilib/functions/clustering/ClusteringFitnessFunction.java index bab0e7f..8b034f2 100644 --- a/src/main/java/net/sourceforge/cilib/functions/clustering/ClusteringFitnessFunction.java +++ b/src/main/java/net/sourceforge/cilib/functions/clustering/ClusteringFitnessFunction.java @@ -93,7 +93,7 @@ public abstract class ClusteringFitnessFunction extends ContinuousFunction { * @return the fitness that has been calculated */ @Override - public double evaluate(Vector centroids) { + public Double evaluate(Vector centroids) { helper = ClusteringUtils.get(); //this statement should not be in a constructor helper.arrangeClustersAndCentroids(centroids); arrangedClusters = helper.getArrangedClusters(); diff --git a/src/main/java/net/sourceforge/cilib/functions/continuous/ContinuousStep.java b/src/main/java/net/sourceforge/cilib/functions/continuous/ContinuousStep.java index 6475011..bd2174b 100644 --- a/src/main/java/net/sourceforge/cilib/functions/continuous/ContinuousStep.java +++ b/src/main/java/net/sourceforge/cilib/functions/continuous/ContinuousStep.java @@ -55,8 +55,8 @@ public class ContinuousStep extends ContinuousFunction { * be the value of 0.0. * @return An {@code Object} containing the value 0.0. */ - public Object getMinimum() { - return new Double(0); + public Double getMinimum() { + return 0.0; } /** @@ -64,17 +64,18 @@ public class ContinuousStep extends ContinuousFunction { * be the value of 55.0. * @return An {@code Object} containing the value 55.0. */ - public Object getMaximum() { - return new Double(55.0); + public Double getMaximum() { + return 55.0; } /** * {@inheritDoc} */ - public double evaluate(Vector x) { + @Override + public Double evaluate(Vector input) { double sum = 0.0; for (int i = 0; i < getDimension(); ++i) { - sum += (x.getReal(i) + 0.5) * (x.getReal(i) + 0.5); + sum += (input.getReal(i) + 0.5) * (input.getReal(i) + 0.5); } return sum; } diff --git a/src/main/java/net/sourceforge/cilib/functions/continuous/ExpressionFunction.java b/src/main/java/net/sourceforge/cilib/functions/continuous/ExpressionFunction.java index ca644d7..87993b5 100644 --- a/src/main/java/net/sourceforge/cilib/functions/continuous/ExpressionFunction.java +++ b/src/main/java/net/sourceforge/cilib/functions/continuous/ExpressionFunction.java @@ -74,9 +74,9 @@ public class ExpressionFunction extends ContinuousFunction { * {@inheritDoc} */ @Override - public double evaluate(Vector x) { + public Double evaluate(Vector input) { for (int i = 0; i < getDimension(); i++) { - this.parser.addVariable("x" + Integer.toString(i + 1), x.getReal(i)); + this.parser.addVariable("x" + Integer.toString(i + 1), input.getReal(i)); } return this.parser.getValue(); } diff --git a/src/main/java/net/sourceforge/cilib/functions/continuous/Foxholes.java b/src/main/java/net/sourceforge/cilib/functions/continuous/Foxholes.java index ff6266f..7085350 100644 --- a/src/main/java/net/sourceforge/cilib/functions/continuous/Foxholes.java +++ b/src/main/java/net/sourceforge/cilib/functions/continuous/Foxholes.java @@ -56,15 +56,16 @@ public class Foxholes extends ContinuousFunction { /** * {@inheritDoc} */ - public Object getMinimum() { - return new Double(1.0); + public Double getMinimum() { + return 1.0; } /** * {@inheritDoc} */ // This impl is according to the function defined by Xin Yao in the FastEP and by the DE guys - public double evaluate(Vector x) { + @Override + public Double evaluate(Vector input) { double result = 0.002; double sum = 0.0; @@ -78,7 +79,7 @@ public class Foxholes extends ContinuousFunction { else tmp_a = a[1][j/5]; - tmp += Math.pow((x.getReal(i) - tmp_a), 6); + tmp += Math.pow((input.getReal(i) - tmp_a), 6); } sum += 1.0 / (j + tmp); diff --git a/src/main/java/net/sourceforge/cilib/functions/continuous/FunctionDimensionMapping.java b/src/main/java/net/sourceforge/cilib/functions/continuous/FunctionDimensionMapping.java index 2623650..7ff2707 100755 --- a/src/main/java/net/sourceforge/cilib/functions/continuous/FunctionDimensionMapping.java +++ b/src/main/java/net/sourceforge/cilib/functions/continuous/FunctionDimensionMapping.java @@ -68,10 +68,10 @@ public class FunctionDimensionMapping extends ContinuousFunction { * {@inheritDoc} */ @Override - public double evaluate(Vector x) { + public Double evaluate(Vector input) { // The vector x is an entities information vector which represents the seed to // a random number generator. - long seed = convert(x); + long seed = convert(input); Random generator = new MersenneTwister(); generator.setSeed(seed); diff --git a/src/main/java/net/sourceforge/cilib/functions/continuous/GoldsteinPrice.java b/src/main/java/net/sourceforge/cilib/functions/continuous/GoldsteinPrice.java index b57edbe..22bddde 100644 --- a/src/main/java/net/sourceforge/cilib/functions/continuous/GoldsteinPrice.java +++ b/src/main/java/net/sourceforge/cilib/functions/continuous/GoldsteinPrice.java @@ -56,17 +56,17 @@ public class GoldsteinPrice extends ContinuousFunction { /** * Get the minimum of the function. The value of the minimum of 3.0. */ - public Object getMinimum() { - return new Double(3.0); + public Double getMinimum() { + return 3.0; } /** * {@inheritDoc} */ @Override - public double evaluate(Vector x) { - double part1 = 1 + (x.getReal(0) + x.getReal(1) + 1.0) * (x.getReal(0) + x.getReal(1) + 1.0) * (19.0 - 14.0 * x.getReal(0) + 3 * x.getReal(0) * x.getReal(0) - 14 * x.getReal(1) + 6 * x.getReal(0) * x.getReal(1) + 3 * x.getReal(1) * x.getReal(1)); - double part2 = 30 + (2 * x.getReal(0) - 3 * x.getReal(1)) * (2 * x.getReal(0) - 3 * x.getReal(1)) * (18 - 32 * x.getReal(0) + 12 * x.getReal(0) * x.getReal(0) + 48 * x.getReal(1) - 36 * x.getReal(0) * x.getReal(1) + 27 * x.getReal(1) * x.getReal(1)); + public Double evaluate(Vector input) { + double part1 = 1 + (input.getReal(0) + input.getReal(1) + 1.0) * (input.getReal(0) + input.getReal(1) + 1.0) * (19.0 - 14.0 * input.getReal(0) + 3 * input.getReal(0) * input.getReal(0) - 14 * input.getReal(1) + 6 * input.getReal(0) * input.getReal(1) + 3 * input.getReal(1) * input.getReal(1)); + double part2 = 30 + (2 * input.getReal(0) - 3 * input.getReal(1)) * (2 * input.getReal(0) - 3 * input.getReal(1)) * (18 - 32 * input.getReal(0) + 12 * input.getReal(0) * input.getReal(0) + 48 * input.getReal(1) - 36 * input.getReal(0) * input.getReal(1) + 27 * input.getReal(1) * input.getReal(1)); return part1 * part2; } } diff --git a/src/main/java/net/sourceforge/cilib/functions/continuous/Himmelblau.java b/src/main/java/net/sourceforge/cilib/functions/continuous/Himmelblau.java index 8ea96d5..4dc09b8 100644 --- a/src/main/java/net/sourceforge/cilib/functions/continuous/Himmelblau.java +++ b/src/main/java/net/sourceforge/cilib/functions/continuous/Himmelblau.java @@ -63,20 +63,16 @@ public class Himmelblau extends ContinuousFunction { /** * {@inheritDoc} */ - public Object getMinimum() { - return new Double(0); + public Double getMinimum() { + return 0.0; } /** - * Evaluate the function and return the result of the evaluation. - * - * @param vector The {@linkplain Vector} containing the two dimensional data. - * @return The value of the Himmalblau function with {@code vector} containing the - * function input. + * {@inheritDoc} */ - public double evaluate(Vector vector) { - double x = vector.getReal(0); - double y = vector.getReal(1); + public Double evaluate(Vector input) { + double x = input.getReal(0); + double y = input.getReal(1); return -Math.pow((x*x + y -11), 2) + Math.pow((x + y*y -7), 2); } diff --git a/src/main/java/net/sourceforge/cilib/functions/continuous/HyperEllipsoid.java b/src/main/java/net/sourceforge/cilib/functions/continuous/HyperEllipsoid.java index 1e4a92b..4fdeecc 100644 --- a/src/main/java/net/sourceforge/cilib/functions/continuous/HyperEllipsoid.java +++ b/src/main/java/net/sourceforge/cilib/functions/continuous/HyperEllipsoid.java @@ -59,17 +59,18 @@ public class HyperEllipsoid extends ContinuousFunction { /** * {@inheritDoc} */ - public Object getMinimum() { - return new Double(0); + public Double getMinimum() { + return 0.0; } /** * {@inheritDoc} */ - public double evaluate(Vector x) { + @Override + public Double evaluate(Vector input) { double tmp = 0; for (int i = 0; i < getDimension(); ++i) { - tmp += (i + 1) * x.getReal(i) * x.getReal(i); + tmp += (i + 1) * input.getReal(i) * input.getReal(i); } return tmp; } diff --git a/src/main/java/net/sourceforge/cilib/functions/continuous/MaximumDeratingFunction1.java b/src/main/java/net/sourceforge/cilib/functions/continuous/MaximumDeratingFunction1.java index aa864e2..e4639d4 100644 --- a/src/main/java/net/sourceforge/cilib/functions/continuous/MaximumDeratingFunction1.java +++ b/src/main/java/net/sourceforge/cilib/functions/continuous/MaximumDeratingFunction1.java @@ -53,8 +53,8 @@ public class MaximumDeratingFunction1 extends ContinuousFunction { /** * {@inheritDoc} */ - public Object getMinimum() { - return new Double(0); + public Double getMinimum() { + return 0.0; } /** @@ -92,17 +92,17 @@ public class MaximumDeratingFunction1 extends ContinuousFunction { /** * {@inheritDoc} */ - public double evaluate(Vector parm1) { + public Double evaluate(Vector input) { // the derating function is only to be used with Derating Function Problem // if the this class is misused, then prcocess will exit inorder to prevent // errorneous results. //if (parm1.length > 1) { - if (parm1.getDimension() > 1) + if (input.getDimension() > 1) throw new RuntimeException("derating function may only be used in one dimension"); - if (parm1.getReal(0) >= radius) + if (input.getReal(0) >= radius) return 1.0; - return Math.pow(parm1.getReal(0) / radius, alpha); + return Math.pow(input.getReal(0) / radius, alpha); } } diff --git a/src/main/java/net/sourceforge/cilib/functions/continuous/Michalewicz12.java b/src/main/java/net/sourceforge/cilib/functions/continuous/Michalewicz12.java deleted file mode 100644 index 55bb6e3..0000000 --- a/src/main/java/net/sourceforge/cilib/functions/continuous/Michalewicz12.java +++ /dev/null @@ -1,120 +0,0 @@ -/** - * Copyright (C) 2003 - 2009 - * Computational Intelligence Research Group (CIRG@UP) - * Department of Computer Science - * University of Pretoria - * South Africa - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package net.sourceforge.cilib.functions.continuous; - -import net.sourceforge.cilib.functions.ContinuousFunction; -import net.sourceforge.cilib.type.types.container.Vector; - -/** - * Michalewicz function. - * - * <p>Title: CILib</p> - * <p>Description: CILib (Computational Intelligence Library)</p> - * <p>Copyright: Copyright (c) 2004</p> - * <p>Company: </p> - * - * Characteristics: - * <ul> - * <li>Multimodal</li> - * <li>Continuous</li> - * <li>Separable</li> - * </ul> - * - * f(x) = -4.687 if n = 5 - * f(x) = -9.66 if n = 10 - * - * @author Clive Naicker - * @version 1.0 - */ -public class Michalewicz12 extends ContinuousFunction { - private static final long serialVersionUID = -2885728189740122807L; - - private int m; - - /** - * Create an instance of {@linkplain Michalewicz12}. Domain is set to R(0, PI)^30 - */ - public Michalewicz12() { - //constraint.add(new DimensionValidator(2)); - setDomain("R(0, 3.141592653589793)^30"); - - m = 10; - } - - /** - * {@inheritDoc} - */ - @Override - public Michalewicz12 getClone() { - return new Michalewicz12(); - } - - /** - * {@inheritDoc} - */ - public Object getMinimum() { - if (this.getDimension() == 5) - return new Double(-4.687); - else if (this.getDimension() == 10) - return new Double(-9.66); - - return new Double(-Double.MAX_VALUE); - } - - /** - * {@inheritDoc} - */ - public double evaluate(Vector input) { - /*double x = X.getReal(0); - double y = X.getReal(1); - - double result = Math.sin(x)*Math.pow(Math.sin(x*x/Math.PI), 20); - result += Math.sin(y)*Math.pow(Math.sin(y*y/Math.PI), 20); - return result;*/ - - double sumsq = 0.0; - - for (int i = 0; i < getDimension(); i++) { - double x = input.getReal(i); - sumsq += Math.sin(x) * Math.pow(Math.sin(((i+1) * x * x)/Math.PI), 2*m); - } - - return -sumsq; - } - - /** - * Get the value for <code>M</code>. - * @return The value for <code>M</code>. - */ - public int getM() { - return m; - } - - /** - * Set the value for <code>M</code>. - * @param m The value to set. - */ - public void setM(int m) { - this.m = m; - } - -} diff --git a/src/main/java/net/sourceforge/cilib/functions/continuous/MultimodalFunction1.java b/src/main/java/net/sourceforge/cilib/functions/continuous/MultimodalFunction1.java index 0803383..26c6224 100644 --- a/src/main/java/net/sourceforge/cilib/functions/continuous/MultimodalFunction1.java +++ b/src/main/java/net/sourceforge/cilib/functions/continuous/MultimodalFunction1.java @@ -48,17 +48,18 @@ public class MultimodalFunction1 extends ContinuousFunction { /** * Get the minimum value of the function. The minimum is defined to be <code>0.0</code>. */ - public Object getMinimum() { - return new Double(0); + public Double getMinimum() { + return 0.0; } /** * {@inheritDoc} */ - public double evaluate(Vector parm1) { + @Override + public Double evaluate(Vector input) { double dResult = 0.0; for (int i = 0; i < getDimension(); ++i) { - double x = Math.pow(Math.sin(5.0 * Math.PI * parm1.getReal(i)), 6.0); + double x = Math.pow(Math.sin(5.0 * Math.PI * input.getReal(i)), 6.0); dResult += x; } return dResult; diff --git a/src/main/java/net/sourceforge/cilib/functions/continuous/MultimodalFunction2.java b/src/main/java/net/sourceforge/cilib/functions/continuous/MultimodalFunction2.java index 8089162..2449114 100644 --- a/src/main/java/net/sourceforge/cilib/functions/continuous/MultimodalFunction2.java +++ b/src/main/java/net/sourceforge/cilib/functions/continuous/MultimodalFunction2.java @@ -51,19 +51,20 @@ public class MultimodalFunction2 extends ContinuousFunction { * Get the minimum of the function. It is defined to be a value of <code>0.0</code>. * @return The function minimum value. */ - public Object getMinimum() { - return new Double(0); + public Double getMinimum() { + return 0.0; } /** * {@inheritDoc} */ - public double evaluate(Vector parm1) { + @Override + public Double evaluate(Vector input) { double dResult = 0.0; for (int i = 0; i < getDimension(); i++) { - double x = Math.pow(Math.sin(5.0 * Math.PI * parm1.getReal(i)), 6.0); + double x = Math.pow(Math.sin(5.0 * Math.PI * input.getReal(i)), 6.0); double exp1 = -2.0 * Math.log(2); - double exp2 = Math.pow((parm1.getReal(i) - 0.1) / 0.8, 2.0); + double exp2 = Math.pow((input.getReal(i) - 0.1) / 0.8, 2.0); double y = Math.exp(exp1 * exp2); dResult += x * y; } diff --git a/src/main/java/net/sourceforge/cilib/functions/continuous/MultimodalFunction3.java b/src/main/java/net/sourceforge/cilib/functions/continuous/MultimodalFunction3.java index 30e9299..d917b38 100644 --- a/src/main/java/net/sourceforge/cilib/functions/continuous/MultimodalFunction3.java +++ b/src/main/java/net/sourceforge/cilib/functions/continuous/MultimodalFunction3.java @@ -49,17 +49,18 @@ public class MultimodalFunction3 extends ContinuousFunction { * Get the minimum of the function. It is defined to be a value of <code>0.0</code>. * @return The function minimum value. */ - public Object getMinimum() { - return new Double(0); + public Double getMinimum() { + return 0.0; } /** * {@inheritDoc} */ - public double evaluate(Vector parm1) { + @Override + public Double evaluate(Vector input) { double dResult = 0.0; for (int i = 0; i < getDimension(); ++i) { - double x = Math.pow(Math.sin(5.0 * Math.PI * (Math.pow(parm1.getReal(i), 0.75) - 0.05)), 6.0); + double x = Math.pow(Math.sin(5.0 * Math.PI * (Math.pow(input.getReal(i), 0.75) - 0.05)), 6.0); dResult += x; } return dResult; diff --git a/src/main/java/net/sourceforge/cilib/functions/continuous/MultimodalFunction4.java b/src/main/java/net/sourceforge/cilib/functions/continuous/MultimodalFunction4.java index 5f10cf3..180b528 100644 --- a/src/main/java/net/sourceforge/cilib/functions/continuous/MultimodalFunction4.java +++ b/src/main/java/net/sourceforge/cilib/functions/continuous/MultimodalFunction4.java @@ -49,19 +49,20 @@ public class MultimodalFunction4 extends ContinuousFunction { * Get the minimum of the function. It is defined to be a value of <code>0.0</code>. * @return The function minimum value. */ - public Object getMinimum() { - return new Double(0); + public Double getMinimum() { + return 0.0; } /** * {@inheritDoc} */ - public double evaluate(Vector parm1) { + @Override + public Double evaluate(Vector input) { double dResult = 0.0; for (int i = 0; i < getDimension(); i++) { - double x = Math.pow(Math.sin(5.0 * Math.PI * (Math.pow(parm1.getReal(i), 0.75) - 0.05)), 6.0); + double x = Math.pow(Math.sin(5.0 * Math.PI * (Math.pow(input.getReal(i), 0.75) - 0.05)), 6.0); double exp1 = -2.0 * Math.log(2); - double exp2 = Math.pow((parm1.getReal(i) - 0.08) / 0.854, 2.0); + double exp2 = Math.pow((input.getReal(i) - 0.08) / 0.854, 2.0); double y = Math.exp(exp1 * exp2); dResult += x * y; } diff --git a/src/main/java/net/sourceforge/cilib/functions/continuous/MultimodalFunction5.java b/src/main/java/net/sourceforge/cilib/functions/continuous/MultimodalFunction5.java index 6b126dc..e83f066 100644 --- a/src/main/java/net/sourceforge/cilib/functions/continuous/MultimodalFunction5.java +++ b/src/main/java/net/sourceforge/cilib/functions/continuous/MultimodalFunction5.java @@ -49,14 +49,15 @@ public class MultimodalFunction5 extends ContinuousFunction { * Get the minimum of the function. It is defined to be a value of <code>0.0</code>. * @return The function minimum value. */ - public Object getMinimum() { - return new Double(0); + public Double getMinimum() { + return 0.0; } /** * {@inheritDoc} */ - public double evaluate(Vector input) { + @Override + public Double evaluate(Vector input) { double x = input.getReal(0); double y = input.getReal(1); double result; diff --git a/src/main/java/net/sourceforge/cilib/functions/continuous/NastyBenchmark.java b/src/main/java/net/sourceforge/cilib/functions/continuous/NastyBenchmark.java index ecf5891..7a7882e 100644 --- a/src/main/java/net/sourceforge/cilib/functions/continuous/NastyBenchmark.java +++ b/src/main/java/net/sourceforge/cilib/functions/continuous/NastyBenchmark.java @@ -51,17 +51,18 @@ public class NastyBenchmark extends ContinuousFunction { * Get the minimum of the function. It is defined to be a value of <code>0.0</code>. * @return The function minimum value. */ - public Object getMinimum() { - return new Double(0); + public Double getMinimum() { + return 0.0; } /** * {@inheritDoc} */ - public double evaluate(Vector x) { + @Override + public Double evaluate(Vector input) { double tmp = 0; for (int i = 0; i < getDimension(); ++i) { - double factor = (x.getReal(i) - (i + 1)); + double factor = (input.getReal(i) - (i + 1)); tmp += factor * factor; } return tmp; diff --git a/src/main/java/net/sourceforge/cilib/functions/continuous/Neumaier3.java b/src/main/java/net/sourceforge/cilib/functions/continuous/Neumaier3.java index 198d904..7040d46 100644 --- a/src/main/java/net/sourceforge/cilib/functions/continuous/Neumaier3.java +++ b/src/main/java/net/sourceforge/cilib/functions/continuous/Neumaier3.java @@ -51,22 +51,22 @@ public class Neumaier3 extends ContinuousFunction { /** * {@inheritDoc} */ - public Object getMinimum() { + public Double getMinimum() { double dimension = getDimension(); - return new Double((dimension * (dimension + 4) * (dimension - 1)) / 6); + return (dimension * (dimension + 4.0) * (dimension - 1.0)) / 6.0; } /** * {@inheritDoc} */ - public double evaluate(Vector x) { + public Double evaluate(Vector input) { double tmp1 = 0; double tmp2 = 0; for (int i = 0; i < getDimension(); ++i) { - tmp1 += (x.getReal(i) - 1) * (x.getReal(i) - 1); + tmp1 += (input.getReal(i) - 1) * (input.getReal(i) - 1); } for (int i = 1; i < getDimension(); ++i) { - tmp2 += x.getReal(i) * x.getReal(i - 1); + tmp2 += input.getReal(i) * input.getReal(i - 1); } return tmp1 - tmp2; } diff --git a/src/main/java/net/sourceforge/cilib/functions/continuous/Quadric.java b/src/main/java/net/sourceforge/cilib/functions/continuous/Quadric.java index b143aa4..085a309 100644 --- a/src/main/java/net/sourceforge/cilib/functions/continuous/Quadric.java +++ b/src/main/java/net/sourceforge/cilib/functions/continuous/Quadric.java @@ -47,25 +47,25 @@ public class Quadric extends ContinuousFunction { * Get the minimum of the function. It is defined to be a value of <code>0.0</code>. * @return The function minimum value. */ - public Object getMinimum() { - return new Double(0); + public Double getMinimum() { + return 0.0; } - public Object getMaximum() { - return new Double(1248.2); + public Double getMaximum() { + return 1248.2; } /** * {@inheritDoc} */ - public double evaluate(Vector x) { + public Double evaluate(Vector input) { double sumsq = 0; for (int i = 0; i < getDimension(); ++i) { double sum = 0; for (int j = 0; j <= i; ++j) { - sum += x.getReal(j); + sum += input.getReal(j); } - sumsq += (sum) * (sum); + sumsq += sum * sum; } return sumsq; } diff --git a/src/main/java/net/sourceforge/cilib/functions/continuous/Quartic.java b/src/main/java/net/sourceforge/cilib/functions/continuous/Quartic.java index f3e4c85..3512e90 100644 --- a/src/main/java/net/sourceforge/cilib/functions/continuous/Quartic.java +++ b/src/main/java/net/sourceforge/cilib/functions/continuous/Quartic.java @@ -52,25 +52,26 @@ public class Quartic extends ContinuousFunction { * * This is extra stuff i hope is added. */ - public Object getMinimum() { - return new Double(0); + public Double getMinimum() { + return 0.0; } /** * {@inheritDoc} */ - public Object getMaximum() { - return new Double(1248.2); + public Double getMaximum() { + return 1248.2; } /** * {@inheritDoc} */ - public double evaluate(Vector x) { + @Override + public Double evaluate(Vector input) { double result = 0.0; - for (int i = 0; i < x.getDimension(); i++) { - double square = x.getReal(i) * x.getReal(i); + for (int i = 0; i < input.getDimension(); i++) { + double square = input.getReal(i) * input.getReal(i); double square2 = square * square; result += i * square2; diff --git a/src/main/java/net/sourceforge/cilib/functions/continuous/Ripple.java b/src/main/java/net/sourceforge/cilib/functions/continuous/Ripple.java index 6c17711..4c7f212 100644 --- a/src/main/java/net/sourceforge/cilib/functions/continuous/Ripple.java +++ b/src/main/java/net/sourceforge/cilib/functions/continuous/Ripple.java @@ -57,14 +57,15 @@ public class Ripple extends ContinuousFunction { /** * {@inheritDoc} */ - public Object getMinimum() { - return new Double(2.2); + public Double getMinimum() { + return 2.2; } /** * {@inheritDoc} */ - public double evaluate(Vector input) { + @Override + public Double evaluate(Vector input) { double x = input.getReal(0); double y = input.getReal(1); diff --git a/src/main/java/net/sourceforge/cilib/functions/continuous/Salomon.java b/src/main/java/net/sourceforge/cilib/functions/continuous/Salomon.java index ebe79e7..1efcc51 100644 --- a/src/main/java/net/sourceforge/cilib/functions/continuous/Salomon.java +++ b/src/main/java/net/sourceforge/cilib/functions/continuous/Salomon.java @@ -56,20 +56,20 @@ public class Salomon extends ContinuousFunction { /** * {@inheritDoc} */ - public Object getMinimum() { - return new Double(0); + public Double getMinimum() { + return 0.0; } /** * {@inheritDoc} */ @Override - public double evaluate(Vector x) { + public Double evaluate(Vector input) { double functionValue = 0.0; double sumSquares = 0.0; - for (int i = 0; i < x.getDimension(); i++) { - sumSquares += x.getReal(i) * x.getReal(i); + for (int i = 0; i < input.getDimension(); i++) { + sumSquares += input.getReal(i) * input.getReal(i); } functionValue = -(Math.cos(2 * Math.PI * Math.sqrt(sumSquares))) + (0.1 * Math.sqrt(sumSquares)) + 1; diff --git a/src/main/java/net/sourceforge/cilib/functions/continuous/Schaffer2.java b/src/main/java/net/sourceforge/cilib/functions/continuous/Schaffer2.java index ed0118f..7ed48eb 100644 --- a/src/main/java/net/sourceforge/cilib/functions/continuous/Schaffer2.java +++ b/src/main/java/net/sourceforge/cilib/functions/continuous/Schaffer2.java @@ -48,15 +48,16 @@ public class Schaffer2 extends ContinuousFunction { /** * {@inheritDoc} */ - public Object getMinimum() { - return new Double(0); + public Double getMinimum() { + return 0.0; } /** * {@inheritDoc} */ - public double evaluate(Vector x) { - double sum_squares = x.getReal(0) * x.getReal(0) + x.getReal(1) * x.getReal(1); + @Override + public Double evaluate(Vector input) { + double sum_squares = input.getReal(0) * input.getReal(0) + input.getReal(1) * input.getReal(1); double term1 = Math.pow(sum_squares, 0.25); double term2 = Math.pow(50 * Math.pow(sum_squares, 0.1), 2) + 1; return term1 * term2; diff --git a/src/main/java/net/sourceforge/cilib/functions/continuous/Schaffer6.java b/src/main/java/net/sourceforge/cilib/functions/continuous/Schaffer6.java index e39106a..f22e9e7 100644 --- a/src/main/java/net/sourceforge/cilib/functions/continuous/Schaffer6.java +++ b/src/main/java/net/sourceforge/cilib/functions/continuous/Schaffer6.java @@ -66,8 +66,8 @@ public class Schaffer6 extends ContinuousFunction { * Initialise the function minimum value. * @return The minimum value as a <tt>Double</tt> object with value of 0.0 */ - public Object getMinimum() { - return new Double(-1.0); + public Double getMinimum() { + return -1.0; } @@ -77,7 +77,8 @@ public class Schaffer6 extends ContinuousFunction { * @param x The input vector to the function * @return A double value representing the function evaluation */ - public double evaluate(Vector input) { + @Override + public Double evaluate(Vector input) { double x = input.getReal(0); double y = input.getReal(1); diff --git a/src/main/java/net/sourceforge/cilib/functions/continuous/Schwefel.java b/src/main/java/net/sourceforge/cilib/functions/continuous/Schwefel.java index f2b5ea8..15b9b25 100644 --- a/src/main/java/net/sourceforge/cilib/functions/continuous/Schwefel.java +++ b/src/main/java/net/sourceforge/cilib/functions/continuous/Schwefel.java @@ -65,17 +65,18 @@ public class Schwefel extends ContinuousFunction { // ? * Get the minimum of the function. It is defined to be a value of <code>0.0</code>. * @return The function minimum value. */ - public Object getMinimum() { - return new Double(0); + public Double getMinimum() { + return 0.0; } /** * {@inheritDoc} */ - public double evaluate(Vector x) { + @Override + public Double evaluate(Vector input) { double sum = 0; - for (int i = 0; i < x.getDimension(); ++i) { - sum += x.getReal(i) * Math.sin(Math.sqrt(Math.abs(x.getReal(i)))); + for (int i = 0; i < input.getDimension(); ++i) { + sum += input.getReal(i) * Math.sin(Math.sqrt(Math.abs(input.getReal(i)))); } sum += getDimension() * 4.18982887272434686131e+02; return sum; diff --git a/src/main/java/net/sourceforge/cilib/functions/continuous/SchwefelProblem1_2.java b/src/main/java/net/sourceforge/cilib/functions/continuous/SchwefelProblem1_2.java index 7f58749..acf4323 100644 --- a/src/main/java/net/sourceforge/cilib/functions/continuous/SchwefelProblem1_2.java +++ b/src/main/java/net/sourceforge/cilib/functions/continuous/SchwefelProblem1_2.java @@ -57,15 +57,15 @@ public class SchwefelProblem1_2 extends ContinuousFunction { * Get the minimum of the function. It is defined to be a value of <code>0.0</code>. * @return The function minimum value. */ - public Object getMinimum() { - return new Double(0.0); + public Double getMinimum() { + return 0.0; } /** * {@inheritDoc} */ @Override - public double evaluate(Vector x) { + public Double evaluate(Vector input) { double sumsq = 0.0; double sum = 0.0; @@ -73,7 +73,7 @@ public class SchwefelProblem1_2 extends ContinuousFunction { sum = 0.0; for (int j = 0; j < i; j++) { - sum += x.getReal(j); + sum += input.getReal(j); } sumsq += sum * sum; diff --git a/src/main/java/net/sourceforge/cilib/functions/continuous/SchwefelProblem2_21.java b/src/main/java/net/sourceforge/cilib/functions/continuous/SchwefelProblem2_21.java index 3cb5b7b..3664a16 100644 --- a/src/main/java/net/sourceforge/cilib/functions/continuous/SchwefelProblem2_21.java +++ b/src/main/java/net/sourceforge/cilib/functions/continuous/SchwefelProblem2_21.java @@ -58,19 +58,19 @@ public class SchwefelProblem2_21 extends ContinuousFunction { * Get the minimum of the function. It is defined to be a value of <code>0.0</code>. * @return The function minimum value. */ - public Object getMinimum() { - return new Double(0); + public Double getMinimum() { + return 0.0; } /** * {@inheritDoc} */ - public double evaluate(Vector x) { - double max = Math.abs(x.getReal(0)); + public Double evaluate(Vector input) { + double max = Math.abs(input.getReal(0)); double value; - for (int i = 1; i < x.getDimension(); ++i) { - value = Math.abs(x.getReal(i)); + for (int i = 1; i < input.getDimension(); ++i) { + value = Math.abs(input.getReal(i)); if (value > max) max = value; } diff --git a/src/main/java/net/sourceforge/cilib/functions/continuous/SchwefelProblem2_22.java b/src/main/java/net/sourceforge/cilib/functions/continuous/SchwefelProblem2_22.java index c19051c..260beec 100644 --- a/src/main/java/net/sourceforge/cilib/functions/continuous/SchwefelProblem2_22.java +++ b/src/main/java/net/sourceforge/cilib/functions/continuous/SchwefelProblem2_22.java @@ -58,22 +58,23 @@ public class SchwefelProblem2_22 extends ContinuousFunction { /** * {@inheritDoc} */ - public Object getMinimum() { - return new Double(0); + public Double getMinimum() { + return 0.0; } /** * {@inheritDoc} */ - public double evaluate(Vector x) { + @Override + public Double evaluate(Vector input) { double sum = 0; double product = 0; for (int i = 0; i < getDimension(); ++i) { - sum += Math.abs(x.getReal(i)); + sum += Math.abs(input.getReal(i)); if (i == 0) - product = Math.abs(x.getReal(i)); + product = Math.abs(input.getReal(i)); else - product *= Math.abs(x.getReal(i)); + product *= Math.abs(input.getReal(i)); } return sum + product; diff --git a/src/main/java/net/sourceforge/cilib/functions/continuous/SchwefelProblem2_26.java b/src/main/java/net/sourceforge/cilib/functions/continuous/SchwefelProblem2_26.java index 6c4eca4..31aba5c 100644 --- a/src/main/java/net/sourceforge/cilib/functions/continuous/SchwefelProblem2_26.java +++ b/src/main/java/net/sourceforge/cilib/functions/continuous/SchwefelProblem2_26.java @@ -53,18 +53,19 @@ public class SchwefelProblem2_26 extends ContinuousFunction { return new SchwefelProblem2_26(); } - public Object getMinimum() { - return new Double(-12569.5); + public Double getMinimum() { + return -12569.5; } /** * {@inheritDoc} */ - public double evaluate(Vector x) { + @Override + public Double evaluate(Vector input) { double sum = 0.0; for (int i = 0; i < getDimension(); i++) { - sum += x.getReal(i)*Math.sin(Math.sqrt(Math.abs(x.getReal(i)))); + sum += input.getReal(i)*Math.sin(Math.sqrt(Math.abs(input.getReal(i)))); } return -sum; } diff --git a/src/main/java/net/sourceforge/cilib/functions/continuous/ShekelN.java b/src/main/java/net/sourceforge/cilib/functions/continuous/ShekelN.java index 7f42eb4..131e2d6 100644 --- a/src/main/java/net/sourceforge/cilib/functions/continuous/ShekelN.java +++ b/src/main/java/net/sourceforge/cilib/functions/continuous/ShekelN.java @@ -52,11 +52,11 @@ public class ShekelN extends ContinuousFunction { /** * {@inheritDoc} */ - public Object getMinimum() { + public Double getMinimum() { switch (n) { - case 5: return new Double(-10.15320); - case 7: return new Double(-10.40294); - case 10: return new Double(-10.53641); + case 5: return -10.15320; + case 7: return -10.40294; + case 10: return -10.53641; default: return super.getMinimum(); } } @@ -64,12 +64,13 @@ public class ShekelN extends ContinuousFunction { /** * {@inheritDoc} */ - public double evaluate(Vector x) { + @Override + public Double evaluate(Vector input) { double sum = 0; for (int i = 0; i < n; ++i) { double innerSum = 0; for (int j = 0; j < 4; ++j) { - innerSum += (x.getReal(j) - A[i][j]) * (x.getReal(j) - A[i][j]); + innerSum += (input.getReal(j) - A[i][j]) * (input.getReal(j) - A[i][j]); } sum += 1 / (innerSum + C[i]); } diff --git a/src/main/java/net/sourceforge/cilib/functions/continuous/ShekelsFoxholes.java b/src/main/java/net/sourceforge/cilib/functions/continuous/ShekelsFoxholes.java index 00f069e..4c24aa8 100644 --- a/src/main/java/net/sourceforge/cilib/functions/continuous/ShekelsFoxholes.java +++ b/src/main/java/net/sourceforge/cilib/functions/continuous/ShekelsFoxholes.java @@ -62,20 +62,21 @@ public class ShekelsFoxholes extends ContinuousFunction { return new ShekelsFoxholes(); } - public Object getMinimum() { - return new Double(0.9980038); + public Double getMinimum() { + return 0.9980038; } /** * {@inheritDoc} */ - public double evaluate(Vector x) { + @Override + public Double evaluate(Vector input) { double result = 0.002; double resultI = 0.0; for (int i=1; i<=25; i++) { double resultJ = 0.0; for (int j=0; j<2; j++) { - resultJ += Math.pow(x.getReal(j) - a[j][i-1], 6); + resultJ += Math.pow(input.getReal(j) - a[j][i-1], 6); } resultJ = i + resultJ; resultI += 1/resultJ; diff --git a/src/main/java/net/sourceforge/cilib/functions/continuous/Shir.java b/src/main/java/net/sourceforge/cilib/functions/continuous/Shir.java index 228123b..ad42f0e 100644 --- a/src/main/java/net/sourceforge/cilib/functions/continuous/Shir.java +++ b/src/main/java/net/sourceforge/cilib/functions/continuous/Shir.java @@ -67,14 +67,15 @@ public class Shir extends ContinuousFunction { /** * {@inheritDoc} */ - public Object getMaximum() { - return new Double(1); + public Double getMaximum() { + return 1.0; } /** * {@inheritDoc} */ - public double evaluate(Vector x) { + @Override + public Double evaluate(Vector input) { double sinTerm; double expTerm; double product = 1.0; @@ -82,8 +83,8 @@ public class Shir extends ContinuousFunction { for (int i = 0; i < getDimension(); i++) { sinTerm = 1.0; for (int k = 1; k <= sharpness; k++) - sinTerm *= Math.sin(l1*Math.PI*x.getReal(i) + l2); - expTerm = Math.exp(-l3*((x.getReal(i)-l4)/l5)*((x.getReal(i)-l4)/l5)); + sinTerm *= Math.sin(l1*Math.PI*input.getReal(i) + l2); + expTerm = Math.exp(-l3*((input.getReal(i)-l4)/l5)*((input.getReal(i)-l4)/l5)); product *= (sinTerm * expTerm); } diff --git a/src/main/java/net/sourceforge/cilib/functions/continuous/Shubert.java b/src/main/java/net/sourceforge/cilib/functions/continuous/Shubert.java index da4d7f6..0b411ec 100644 --- a/src/main/java/net/sourceforge/cilib/functions/continuous/Shubert.java +++ b/src/main/java/net/sourceforge/cilib/functions/continuous/Shubert.java @@ -56,19 +56,20 @@ public class Shubert extends ContinuousFunction { /** * {@inheritDoc} */ - public Object getMinimum() { - return new Double(-186.7309088); + public Double getMinimum() { + return -186.7309088; } /** * {@inheritDoc} */ - public double evaluate(Vector x) { + @Override + public Double evaluate(Vector input) { double result = 1.0; for (int i... [truncated message content] |
From: gpampara <gpa...@cs...> - 2009-07-17 15:26:14
|
The list is quite long. The main aspects are more type safety and the following list (as taken from the home page of google-collections): * New Collection types: Multimap, Multiset, BiMap and others * High-performance immutable implementations of the standard collection types, for example ImmutableSet * MapMaker, a builder for concurrent hash maps with many advanced features * Ordering, which can only be described as a "Comparator on steroids" * Iterators and Iterables utility classes: element-based equality, cycle, concat, partition, filter with predicate, transform with function, and much more * Lists, Sets and Maps utility classes: a plethora of convenient factory methods and much more * Forwarding collections, such as ForwardingSet, allowing you to customize collection behavior without subclassing * Implementation helpers like AbstractIterator * and still more The functionality I like is the ability to use predicates, filters and transformations on collections, not to mention the Immutable collections. I envisage some very useful applications, especially to entities. Regards, Gary On Fri, 17 Jul 2009 16:07:01 +0200, Andries Engelbrecht <en...@cs...> wrote: > What are the additional functionalities? > > Gary Pampara wrote: >> Hi all, >> >> I would like to propose the addition of google-collections as a >> dependency of >> CIlib. The additional functionality would be really useful. >> >> Regards, >> Gary >> >> ------------------------------------------------------------------------------ >> Enter the BlackBerry Developer Challenge >> This is your chance to win up to $100,000 in prizes! For a limited time, >> vendors submitting new applications to BlackBerry App World(TM) will have >> the opportunity to enter the BlackBerry Developer Challenge. See full >> prize >> details at: http://p.sf.net/sfu/Challenge >> _______________________________________________ >> cilib-devel mailing list >> cil...@li... >> https://lists.sourceforge.net/lists/listinfo/cilib-devel >> |
From: Andries E. <en...@cs...> - 2009-07-17 14:05:25
|
What are the additional functionalities? Gary Pampara wrote: > Hi all, > > I would like to propose the addition of google-collections as a dependency of > CIlib. The additional functionality would be really useful. > > Regards, > Gary > > ------------------------------------------------------------------------------ > Enter the BlackBerry Developer Challenge > This is your chance to win up to $100,000 in prizes! For a limited time, > vendors submitting new applications to BlackBerry App World(TM) will have > the opportunity to enter the BlackBerry Developer Challenge. See full prize > details at: http://p.sf.net/sfu/Challenge > _______________________________________________ > cilib-devel mailing list > cil...@li... > https://lists.sourceforge.net/lists/listinfo/cilib-devel > -- ========================================================== Prof Andries P Engelbrecht South African Research Chair in Artificial Intelligence Fundamentals of Computational Swarm Intelligence, John Wiley & Sons, December 2005. Computational Intelligence, An Introduction John Wiley & Sons, Second edition to be published soon Computational Intelligence Research Group: http://cirg.cs.up.ac.za Department of Computer Science School of Information Technology University of Pretoria Pretoria 0002, South Africa Tel: +27 12 420 3578 Fax: +27 12 362 5188 http://www.cs.up.ac.za/~engel ================================================ This message and attachments are subject to a disclaimer. Please refer to www.it.up.ac.za/documentation/governance/disclaimer/ for full details. / Hierdie boodskap en aanhangsels is aan 'n vrywaringsklousule onderhewig. Volledige besonderhede is by www.it.up.ac.za/documentation/governance/disclaimer/ beskikbaar. |
From: Andrich v. W. <avw...@gm...> - 2009-07-17 14:00:43
|
I vote Yes, but we should think at looking into using more iterators (and iterables) in that case, especially within our collection and topology classes as they focus heavily on it (see the FAQ on their wiki, or go through the API, if you haven't done so already). Also they have a lot of classes that cannot be extended (mostly to do with Immutable collections), just something to remember. On Fri, Jul 17, 2009 at 3:38 PM, Gary Pampara <gpa...@gm...> wrote: > Hi all, > > I would like to propose the addition of google-collections as a dependency > of > CIlib. The additional functionality would be really useful. > > Regards, > Gary > > > ------------------------------------------------------------------------------ > Enter the BlackBerry Developer Challenge > This is your chance to win up to $100,000 in prizes! For a limited time, > vendors submitting new applications to BlackBerry App World(TM) will have > the opportunity to enter the BlackBerry Developer Challenge. See full prize > details at: http://p.sf.net/sfu/Challenge > _______________________________________________ > cilib-devel mailing list > cil...@li... > https://lists.sourceforge.net/lists/listinfo/cilib-devel > -- Andrich van Wyk |