diff --git a/src/javaeva/server/go/problems/AbstractProblemDouble.java b/src/javaeva/server/go/problems/AbstractProblemDouble.java index 9f9e3fc7..ffb06f10 100644 --- a/src/javaeva/server/go/problems/AbstractProblemDouble.java +++ b/src/javaeva/server/go/problems/AbstractProblemDouble.java @@ -35,19 +35,28 @@ public abstract class AbstractProblemDouble extends AbstractOptimizationProblem } } + protected double[] getEvalArray(AbstractEAIndividual individual){ + double[] x = new double[((InterfaceDataTypeDouble) individual).getDoubleData().length]; + System.arraycopy(((InterfaceDataTypeDouble) individual).getDoubleData(), 0, x, 0, x.length); + return x; + } + @Override public void evaluate(AbstractEAIndividual individual) { double[] x; double[] fitness; - x = new double[((InterfaceDataTypeDouble) individual).getDoubleData().length]; - System.arraycopy(((InterfaceDataTypeDouble) individual).getDoubleData(), 0, x, 0, x.length); + x = getEvalArray(individual); // evaluate the vector fitness = this.eval(x); // if indicated, add Gaussian noise if (m_Noise != 0) RandomNumberGenerator.addNoise(fitness, m_Noise); - // set the fitness - individual.SetFitness(fitness); + // set the fitness + setEvalFitness(individual, x, fitness); + } + + protected void setEvalFitness(AbstractEAIndividual individual, double[] x, double[] fit) { + individual.SetFitness(fit); } /** @@ -63,9 +72,8 @@ public abstract class AbstractProblemDouble extends AbstractOptimizationProblem public void initPopulation(Population population) { AbstractEAIndividual tmpIndy; population.clear(); - ((InterfaceDataTypeDouble)this.m_Template).setDoubleDataLength(this.getProblemDimension()); - ((InterfaceDataTypeDouble)this.m_Template).SetDoubleRange(makeRange()); - + initTemplate(); + for (int i = 0; i < population.getPopulationSize(); i++) { tmpIndy = (AbstractEAIndividual)((AbstractEAIndividual)this.m_Template).clone(); tmpIndy.init(this); diff --git a/src/javaeva/server/go/problems/F10Problem.java b/src/javaeva/server/go/problems/F10Problem.java index e9f95b3e..2f784318 100644 --- a/src/javaeva/server/go/problems/F10Problem.java +++ b/src/javaeva/server/go/problems/F10Problem.java @@ -47,7 +47,7 @@ public class F10Problem extends F1Problem implements java.io.Serializable { * @param x The n-dimensional input vector * @return The m-dimensional output vector. */ - public double[] doEvaluation(double[] x) { + public double[] eval(double[] x) { double[] result = new double[1]; double c1 = this.calculateC(1); result[0] = 0.; diff --git a/src/javaeva/server/go/problems/F11Problem.java b/src/javaeva/server/go/problems/F11Problem.java index d73d3401..274efa99 100644 --- a/src/javaeva/server/go/problems/F11Problem.java +++ b/src/javaeva/server/go/problems/F11Problem.java @@ -48,7 +48,7 @@ public class F11Problem extends F1Problem implements java.io.Serializable { * @param x The n-dimensional input vector * @return The m-dimensional output vector. */ - public double[] doEvaluation(double[] x) { + public double[] eval(double[] x) { double[] result = new double[1]; double tmpProd = 1; result[0] = 0; diff --git a/src/javaeva/server/go/problems/F12Problem.java b/src/javaeva/server/go/problems/F12Problem.java index 7a282be5..105718ec 100644 --- a/src/javaeva/server/go/problems/F12Problem.java +++ b/src/javaeva/server/go/problems/F12Problem.java @@ -70,7 +70,7 @@ public class F12Problem extends F1Problem implements java.io.Serializable { * @param x The n-dimensional input vector * @return The m-dimensional output vector. */ - public double[] doEvaluation(double[] x) { + public double[] eval(double[] x) { double[] result = new double[1]; double tmp = -5; result[0] = 0; diff --git a/src/javaeva/server/go/problems/F13Problem.java b/src/javaeva/server/go/problems/F13Problem.java index 92474d4a..225abaa6 100644 --- a/src/javaeva/server/go/problems/F13Problem.java +++ b/src/javaeva/server/go/problems/F13Problem.java @@ -48,7 +48,7 @@ public class F13Problem extends F1Problem { * @param x The n-dimensional input vector * @return The m-dimensional output vector. */ - public double[] doEvaluation(double[] x) { + public double[] eval(double[] x) { double[] result = new double[1]; result[0] = 0; diff --git a/src/javaeva/server/go/problems/F14Problem.java b/src/javaeva/server/go/problems/F14Problem.java index 1603fb1b..e3130c17 100644 --- a/src/javaeva/server/go/problems/F14Problem.java +++ b/src/javaeva/server/go/problems/F14Problem.java @@ -43,7 +43,7 @@ public class F14Problem extends F1Problem implements java.io.Serializable { * @param x The n-dimensional input vector * @return The m-dimensional output vector. */ - public double[] doEvaluation(double[] x) { + public double[] eval(double[] x) { double[] result = new double[1]; double x0 = x[0]-2; double x1 = x[1]-2; diff --git a/src/javaeva/server/go/problems/F1Problem.java b/src/javaeva/server/go/problems/F1Problem.java index e2ec7f98..0e790569 100644 --- a/src/javaeva/server/go/problems/F1Problem.java +++ b/src/javaeva/server/go/problems/F1Problem.java @@ -1,11 +1,9 @@ package javaeva.server.go.problems; import javaeva.server.go.individuals.AbstractEAIndividual; -import javaeva.server.go.individuals.ESIndividualDoubleData; import javaeva.server.go.individuals.InterfaceDataTypeDouble; import javaeva.server.go.populations.Population; import javaeva.server.go.strategies.InterfaceOptimizer; -import javaeva.server.go.tools.RandomNumberGenerator; /** * Created by IntelliJ IDEA. @@ -27,9 +25,7 @@ public class F1Problem extends AbstractProblemDouble implements Interface2DBorde protected boolean m_UseTestConstraint = false; public F1Problem() { - this.m_Template = new ESIndividualDoubleData(); - ((ESIndividualDoubleData)this.m_Template).setDoubleDataLength(m_ProblemDimension); - ((ESIndividualDoubleData)this.m_Template).SetDoubleRange(makeRange()); + super(); } public F1Problem(F1Problem b) { @@ -64,62 +60,26 @@ public class F1Problem extends AbstractProblemDouble implements Interface2DBorde * @param population The populations that is to be inited */ public void initPopulation(Population population) { - AbstractEAIndividual tmpIndy; + super.initPopulation(population); - this.m_OverallBest = null; - - population.clear(); - - ((InterfaceDataTypeDouble)this.m_Template).setDoubleDataLength(this.m_ProblemDimension); - ((InterfaceDataTypeDouble)this.m_Template).SetDoubleRange(makeRange()); - - for (int i = 0; i < population.getPopulationSize(); i++) { - tmpIndy = (AbstractEAIndividual)((AbstractEAIndividual)this.m_Template).clone(); - tmpIndy.init(this); - population.add(tmpIndy); - } - // population init must be last - // it set's fitcalls and generation to zero - population.init(); - } - - protected double[][] getDoubleRange() { - return ((InterfaceDataTypeDouble)this.m_Template).getDoubleRange(); } - /** This method evaluate a single individual and sets the fitness values - * @param individual The individual that is to be evalutated - */ - public void evaluate(AbstractEAIndividual individual) { - double[] x; - double[] fitness; - - // retrieve the individual data - x = new double[((InterfaceDataTypeDouble) individual).getDoubleData().length]; - System.arraycopy(((InterfaceDataTypeDouble) individual).getDoubleData(), 0, x, 0, x.length); - + protected double[] getEvalArray(AbstractEAIndividual individual){ + double[] x = super.getEvalArray(individual); // add an offset in solution space for (int i = 0; i < x.length; i++) x[i] = x[i] - this.m_XOffSet; - - // evaluate the vector - fitness = this.eval(x); - - // add noise to the fitness - if (m_Noise != 0) RandomNumberGenerator.addNoise(fitness, m_Noise); - - // add an offset in fitness space - for (int i = 0; i < fitness.length; i++) fitness[i] += this.m_YOffSet; - - // finally set the fitness - individual.SetFitness(fitness); - + return x; + } + + protected void setEvalFitness(AbstractEAIndividual individual, double[] x, double[] fit) { + super.setEvalFitness(individual, x, fit); if (this.m_UseTestConstraint) { if (x[0] < 1) individual.addConstraintViolation(1-x[0]); } if ((this.m_OverallBest == null) || (this.m_OverallBest.getFitness(0) > individual.getFitness(0))) { this.m_OverallBest = (AbstractEAIndividual)individual.clone(); - } - } + } + } /** Ths method allows you to evaluate a simple bit string to determine the fitness * @param x The n-dimensional input vector @@ -228,6 +188,6 @@ public class F1Problem extends AbstractProblemDouble implements Interface2DBorde } public double[][] get2DBorder() { - return getDoubleRange(); + return ((InterfaceDataTypeDouble)this.m_Template).getDoubleRange(); } } diff --git a/src/javaeva/server/go/problems/F2Problem.java b/src/javaeva/server/go/problems/F2Problem.java index fe190901..122c31ac 100644 --- a/src/javaeva/server/go/problems/F2Problem.java +++ b/src/javaeva/server/go/problems/F2Problem.java @@ -41,7 +41,7 @@ public class F2Problem extends F1Problem implements java.io.Serializable { * @param x The n-dimensional input vector * @return The m-dimensional output vector. */ - public double[] doEvaluation(double[] x) { + public double[] eval(double[] x) { double[] result = new double[1]; result[0] = 0; for (int i = 0; i < x.length-1; i++) { diff --git a/src/javaeva/server/go/problems/F3Problem.java b/src/javaeva/server/go/problems/F3Problem.java index f7373f5d..ae3c4735 100644 --- a/src/javaeva/server/go/problems/F3Problem.java +++ b/src/javaeva/server/go/problems/F3Problem.java @@ -40,7 +40,7 @@ public class F3Problem extends F1Problem implements java.io.Serializable { * @param x The n-dimensional input vector * @return The m-dimensional output vector. */ - public double[] doEvaluation(double[] x) { + public double[] eval(double[] x) { double[] result = new double[1]; result[0] = 6*x.length; for (int i = 0; i < x.length-1; i++) { diff --git a/src/javaeva/server/go/problems/F4Problem.java b/src/javaeva/server/go/problems/F4Problem.java index 10f0eccd..dcf71e53 100644 --- a/src/javaeva/server/go/problems/F4Problem.java +++ b/src/javaeva/server/go/problems/F4Problem.java @@ -71,7 +71,7 @@ public class F4Problem extends F1Problem implements java.io.Serializable { * @param x The n-dimensional input vector * @return The m-dimensional output vector. */ - public double[] doEvaluation(double[] x) { + public double[] eval(double[] x) { double[] result = new double[1]; result[0] = 0; for (int i = 0; i < x.length-1; i++) { diff --git a/src/javaeva/server/go/problems/F5Problem.java b/src/javaeva/server/go/problems/F5Problem.java index 0c8df7c3..7b2db714 100644 --- a/src/javaeva/server/go/problems/F5Problem.java +++ b/src/javaeva/server/go/problems/F5Problem.java @@ -71,7 +71,7 @@ public class F5Problem extends F1Problem implements java.io.Serializable { * @param x The n-dimensional input vector * @return The m-dimensional output vector. */ - public double[] doEvaluation(double[] x) { + public double[] eval(double[] x) { double[] result = new double[1]; double tmp; result[0] = 0; diff --git a/src/javaeva/server/go/problems/F6Problem.java b/src/javaeva/server/go/problems/F6Problem.java index bf9e52b7..f9122af0 100644 --- a/src/javaeva/server/go/problems/F6Problem.java +++ b/src/javaeva/server/go/problems/F6Problem.java @@ -59,7 +59,7 @@ public class F6Problem extends F1Problem implements java.io.Serializable { * @param x The n-dimensional input vector * @return The m-dimensional output vector. */ - public double[] doEvaluation(double[] x) { + public double[] eval(double[] x) { if (doRotation) { Matrix resVec = rotation.times(new Matrix(x, x.length)); diff --git a/src/javaeva/server/go/problems/F7Problem.java b/src/javaeva/server/go/problems/F7Problem.java index c94eebe4..b4001d35 100644 --- a/src/javaeva/server/go/problems/F7Problem.java +++ b/src/javaeva/server/go/problems/F7Problem.java @@ -83,7 +83,7 @@ public class F7Problem extends F1Problem implements java.io.Serializable { System.arraycopy(((InterfaceDataTypeDouble) individual).getDoubleData(), 0, x, 0, x.length); for (int i = 0; i < x.length; i++) x[i] = x[i] - this.m_XOffSet; - fitness = this.doEvaluation(x); + fitness = this.eval(x); for (int i = 0; i < fitness.length; i++) { // add noise to the fitness fitness[i] += RandomNumberGenerator.gaussianDouble(this.m_Noise); @@ -103,7 +103,7 @@ public class F7Problem extends F1Problem implements java.io.Serializable { * @param x The n-dimensional input vector * @return The m-dimensional output vector. */ - public double[] doEvaluation(double[] x) { + public double[] eval(double[] x) { double[] result = new double[1]; result[0] = 0; if ((Math.floor(this.m_CurrentTimeStamp / this.m_t)%2) == 0) { diff --git a/src/javaeva/server/go/problems/F8Problem.java b/src/javaeva/server/go/problems/F8Problem.java index d6d1a4d7..94afe3c4 100644 --- a/src/javaeva/server/go/problems/F8Problem.java +++ b/src/javaeva/server/go/problems/F8Problem.java @@ -75,7 +75,7 @@ public class F8Problem extends F1Problem implements java.io.Serializable { * @param x The n-dimensional input vector * @return The m-dimensional output vector. */ - public double[] doEvaluation(double[] x) { + public double[] eval(double[] x) { double[] result = new double[1]; double sum1 = 0, sum2 = 0, exp1, exp2; diff --git a/src/javaeva/server/go/problems/F9Problem.java b/src/javaeva/server/go/problems/F9Problem.java index 33d31ac4..6c5c75be 100644 --- a/src/javaeva/server/go/problems/F9Problem.java +++ b/src/javaeva/server/go/problems/F9Problem.java @@ -40,7 +40,7 @@ public class F9Problem extends F1Problem implements java.io.Serializable { * @param x The n-dimensional input vector * @return The m-dimensional output vector. */ - public double[] doEvaluation(double[] x) { + public double[] eval(double[] x) { double[] result = new double[1]; result[0] = 0; for (int i = 0; i < x.length; i++) {