001 /* 002 * Copyright 2011 Christian Kumpe http://kumpe.de/christian/java 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package de.kumpe.hadooptimizer.impl; 017 018 import org.apache.commons.logging.Log; 019 import org.apache.commons.logging.LogFactory; 020 import org.apache.commons.math.random.RandomGenerator; 021 022 import de.kumpe.hadooptimizer.EsWrappableMutator; 023 import de.kumpe.hadooptimizer.NeedsRandomGenerator; 024 025 /** 026 * Base class for Mutators based on gaussian random number. 027 * 028 * @author <a href="http://kumpe.de/christian/java">Christian Kumpe</a> 029 */ 030 public abstract class GaussionMutatorBase implements EsWrappableMutator, 031 NeedsRandomGenerator { 032 private static final long serialVersionUID = 1L; 033 private static final Log log = LogFactory.getLog(GaussionMutatorBase.class); 034 035 protected transient RandomGenerator randomGenerator; 036 protected final double standardDeviation; 037 038 public GaussionMutatorBase(final double standardDeviation) { 039 this.standardDeviation = standardDeviation; 040 } 041 042 @Override 043 public void setRandomGenerator(final RandomGenerator randomGenerator) { 044 if (log.isTraceEnabled()) { 045 log.trace("Received new RandomGenerator-instance: " 046 + randomGenerator); 047 } 048 049 this.randomGenerator = randomGenerator; 050 } 051 052 @Override 053 public double[] mutate(final double[] individual, 054 final double standardDeviation) { 055 final double[] newIndividual = new double[individual.length]; 056 for (int i = 0; i < newIndividual.length; i++) { 057 newIndividual[i] = individual[i] + nextGaussian(standardDeviation); 058 } 059 return newIndividual; 060 } 061 062 /** 063 * Produces a normal distributed random number with the given standard 064 * deviation. 065 */ 066 protected final double nextGaussian(final double standardDeviation) { 067 return randomGenerator.nextGaussian() * standardDeviation; 068 } 069 070 @Override 071 public double getMinIncrement() { 072 return standardDeviation; 073 } 074 }