nlpsolver/ThirdParty/EvolutionarySolver/src/net/adaptivebox/deps/behavior/DEGTBehavior.java | 61 +++++++--- 1 file changed, 48 insertions(+), 13 deletions(-)
New commits: commit c728bb5420f19eb6fbec859ec927f35d772694be Author: Todor Balabanov <todor.balaba...@gmail.com> AuthorDate: Thu May 2 15:17:38 2019 +0300 Commit: Tomaž Vajngerl <qui...@gmail.com> CommitDate: Sun May 12 04:04:54 2019 +0200 Generate behavior code simplification and very small speed-up. Change-Id: Ib13080e4c21738affa129d12a07f5380f665e7a4 Reviewed-on: https://gerrit.libreoffice.org/71673 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl <qui...@gmail.com> diff --git a/nlpsolver/ThirdParty/EvolutionarySolver/src/net/adaptivebox/deps/behavior/DEGTBehavior.java b/nlpsolver/ThirdParty/EvolutionarySolver/src/net/adaptivebox/deps/behavior/DEGTBehavior.java index a58a66196372..dc7f7400cd58 100644 --- a/nlpsolver/ThirdParty/EvolutionarySolver/src/net/adaptivebox/deps/behavior/DEGTBehavior.java +++ b/nlpsolver/ThirdParty/EvolutionarySolver/src/net/adaptivebox/deps/behavior/DEGTBehavior.java @@ -48,24 +48,59 @@ public class DEGTBehavior extends AbsGTBehavior implements ILibEngine { pbest_t = pbest; } + /** + * Crossover and mutation for a single vector element done in a single step. + * + * @param index + * Index of the trial vector element to be changed. + * @param trialVector + * Trial vector reference. + * @param globalVector + * Global best found vector reference. + * @param differenceVectors + * List of vectors used for difference delta calculation. + */ + private void crossoverAndMutation(int index, double trialVector[], double globalVector[], BasicPoint differenceVectors[]) { + double delta = 0D; + + for (int i = 0; i < differenceVectors.length; i++) { + delta += (i % 2 == 0 ? +1D : -1D) * differenceVectors[i].getLocation()[index]; + } + + trialVector[index] = globalVector[index] + FACTOR * delta; + } + @Override public void generateBehavior(SearchPoint trailPoint, ProblemEncoder problemEncoder) { - SearchPoint gbest_t = socialLib.getGbest(); - BasicPoint[] referPoints = getReferPoints(); int DIMENSION = problemEncoder.getDesignSpace().getDimension(); - int rj = RandomGenerator.intRangeRandom(0, DIMENSION-1); - for (int k=0; k<DIMENSION; k++) { - if (Math.random()<CR || k == DIMENSION-1) { - double Dabcd = 0; - for(int i=0; i<referPoints.length; i++) { - Dabcd += (i%2==0 ? +1D : -1D)*referPoints[i].getLocation()[rj]; - } - trailPoint.getLocation()[rj] = gbest_t.getLocation()[rj]+FACTOR*Dabcd; - } else { - trailPoint.getLocation()[rj] = pbest_t.getLocation()[rj]; + int guaranteeIndex = RandomGenerator.intRangeRandom(0, DIMENSION - 1); + + double[] trailVector = trailPoint.getLocation(); + double[] locaclVector = pbest_t.getLocation(); + double[] globalVector = socialLib.getGbest().getLocation(); + + /* Handle first part of the trial vector. */ + for (int index = 0; index < guaranteeIndex; index++) { + if (CR <= Math.random()) { + trailVector[index] = locaclVector[index]; + continue; } - rj = (rj+1)%DIMENSION; + + crossoverAndMutation(index, trailVector, globalVector, referPoints); + } + + /* Guarantee for at least one change in the trial vector. */ + crossoverAndMutation(guaranteeIndex, trailVector, globalVector, referPoints); + + /* Handle second part of the trial vector. */ + for (int index = guaranteeIndex + 1; index < DIMENSION; index++) { + if (CR <= Math.random()) { + trailVector[index] = locaclVector[index]; + continue; + } + + crossoverAndMutation(index, trailVector, globalVector, referPoints); } } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits