/*
* Copyright (c) 2006 Thomas Weise
*
* E-Mail : tweise@gmx.de
* Creation Date : 2006-04-26 06:11:26
* Original Filename: org.dgpf.search.api.p2p.adaptation.DefaultP2PAdapter.java
* Version : 2.0.0
* Last modification: 2006-05-08
* by: Thomas Weise
*
* License : GNU LESSER GENERAL PUBLIC LICENSE
* Version 2.1, February 1999
* You should have received a copy of this license along
* with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307, USA or download the license under
* http://www.gnu.org/copyleft/lesser.html.
*
* Warranty : This software is provided "as is" without any
* warranty; without even the implied warranty of
* merchantability or fitness for a particular purpose.
* See the Gnu Lesser General Public License for more
* details.
*/
package org.dgpf.search.api.p2p.adaptation;
import org.dgpf.search.api.SearchState;
import org.dgpf.search.api.p2p.P2PAdaptationStrategy;
import org.dgpf.search.api.p2p.P2PParameters;
import org.dgpf.search.api.p2p.P2PState;
import org.dgpf.search.api.p2p.StatefulP2PAdaptationStrategy;
/**
* This is the default peer-to-peer adaptation strategy
*
* @author Thomas Weise
*/
public class DefaultP2PAdapter extends StatefulP2PAdaptationStrategy
{
/**
* The serial version uid.
*/
private static final long serialVersionUID = 1;
/**
* Create a new stateful adaptation strategy for p2p parameters.
* @param p_parameters The peer-to-peer parameters to be adapted.
*/
public DefaultP2PAdapter(final P2PParameters p_parameters)
{
super(p_parameters);
}
/**
* Initialize the peer-to-peer parameters if needed.
* @param p_parameters The parameter set to initialize.
*/
@Override
protected void init(final P2PParameters p_parameters)
{
super.init(p_parameters);
p_parameters.set_immigration_by_level(true);
}
/**
* Create a new stateful adaptation strategy for p2p parameters.
* @param p_parameters The peer-to-peer parameters to be adapted.
* @param p_strategy A prototype to copy the internal data from.
*/
public DefaultP2PAdapter(
final P2PParameters p_parameters,
final P2PAdaptationStrategy p_strategy)
{
super(p_parameters, p_strategy);
}
/**
* This method will be called by the search engine whenever it feels like
* it is time to adapt the current search parameters to the current search
* state. If you override this method, you must also declare your class
* as instance of ICloneable
.
* @param p_state The current state of the search.
* @param p_p2p_state The peer-to-peer state.
* @return true
if and only if the update level should be
* resetted, false
if everything should continue
* normal.
*/
@Override
public boolean adapt (final SearchState> p_state,
final P2PState p_p2p_state)
{
P2PParameters l_gp;
int l_i;
double l_d;
l_gp = this.get_parameters();
if(p_state.get_improvement() > 0)
{
for(l_i = (p_state.get_fitness_function_count()-1); l_i >= 0; l_i--)
{
l_gp.set_immigration_threshold(l_i, Double.POSITIVE_INFINITY);
}
}
else
{
if( (p_state.get_rel_improvement() > 0) &&
(p_state.get_update_level() < p_state.get_update_count()) )
{
for(l_i = (p_state.get_fitness_function_count()-1); l_i >= 0; l_i--)
{
l_d = p_state.get_rel_best().get_fitness(l_i) * 0.975d;
if(l_d > l_gp.get_immigration_threshold(l_i))
{
l_gp.set_immigration_threshold(l_i, l_d);
}
}
}
}
return false;
}
/**
* This method will be called whenever the search parameters perform a
* reset, meaning that the search level is set back to 0.
*/
@Override
public void reset ()
{
P2PParameters l_gp;
int l_i;
l_gp = this.get_parameters();
for(l_i = (l_gp.get_fitness_function_count()-1); l_i >= 0; l_i--)
{
l_gp.set_immigration_threshold(l_i, 0.0d);
}
super.reset();
}
}