package org.dgpf.search.api.utils;
import java.io.Serializable;
import org.dgpf.search.api.SearchContext;
/**
* This class allows you to use different mutation techniques with assigned
* probability weights.
* @param <Genotype> The type of the things to be mutated.
* @param <Contexttype> The sort of context to be used.
* @param <Infotype> An information object to be propagated. If no
* information object is needed, just leave this
* parameter <code>Object</code> and always pass in
* <code>null</code>.
* @author Thomas Weise
*/
public class WeightedMutator<Genotype extends Serializable,
Contexttype extends SearchContext<?>,
Infotype>
extends WeightedSet<IMutator<Genotype, Contexttype, Infotype>>
implements IMutator<Genotype, Contexttype, Infotype>
{
/**
* The serial version uid.
*/
private static final long serialVersionUID = 1;
/**
* Create a new weighted mutator set. Weighted mutator sets are fixed and
* cannot be modified.
* @param p_wsb The weighted set builder to use.
*/
public WeightedMutator(final WeightedSetBuilder<IMutator
<Genotype, Contexttype, Infotype>> p_wsb)
{
super(p_wsb);
}
/**
* Perform the mutation.
* @param p_source The source object to create a randomizedly altered
* copy of.
* @param p_context The context hosting the operation.
* @param p_info The information record.
* @return The new, randomizedly altered copy of the object
* <code>p_source</code> or <code>p_source</code> itself if no
* mutation was possible.
*/
public Genotype mutate ( Genotype p_source,
final Contexttype p_context,
final Infotype p_info)
{
WeightedSet<IMutator<Genotype, Contexttype, Infotype>>.Session l_s;
Genotype l_g;
l_s = this.open_session(p_context.get_randomizer());
while(l_s.hasNext())
{
l_g = l_s.next().mutate(p_source, p_context, p_info);
if((l_g != p_source) && (l_g != null) && (!(l_g.equals(p_source))))
{
l_s.close();
return l_g;
}
}
l_s.close();
return p_source;
}
}