6

Actualmente estoy trabajando en un proyecto (TSP) y estoy intentando convertir un pseudocódigo de recocido simulado en Java. He tenido éxito en el pasado al convertir pseudocódigo en código Java, sin embargo, no puedo convertir esto con éxito.Recocido simulado de Java del pseudocódigo

El pseudocódigo es:

T0(T and a lowercase 0) Starting temperature 
Iter Number of iterations 
λ The cooling rate 

1. Set T = T0 (T and a lowercase 0) 
2. Let x = a random solution 
3. For i = 0 to Iter-1 
4. Let f = fitness of x 
5. Make a small change to x to make x’ 
6. Let f’ = fitness of new point 
7. If f’ is worse than f then 
8.  Let p = PR(f’, f, Ti (T with a lowercase i)) 
9.  If p > UR(0,1) then 
10.   Undo change (x and f) 
11.  Else 
12.   Let x = x’ 
13.  End if 
14.  Let Ti(T with a lowercase i) + 1 = λTi(λ and T with a lowercase i) 
15. End for 
Output: The solution x 

Si alguien me podría mostrar una marca de base en marcha de este en Java que estaría muy agradecido - Yo sólo parece que no puede averiguarlo!

Estoy trabajando en varias clases utilizando una serie de funciones (que no enumeraré ya que es irrelevante para lo que estoy preguntando). Ya tengo un método smallChange() y una función fitness. ¿Existe la posibilidad de que necesite crear varias versiones de dichos métodos? Por ejemplo, tengo algo como:

public static ArrayList<Integer> smallChange(ArrayList<Integer> solution){ 

//Code is here. 

} 

¿Podría posiblemente necesitar otra versión de este método que acepte parámetros diferentes? Algo a lo largo de las líneas de:

public static double smallChange(double d){ 

//Code is here. 

} 

Todo lo que necesita es una idea básica de cómo se vería cuando está escrito en Java - voy a ser capaz de adaptarlo a mi código una vez que sepa lo que debe ser similar en el sintaxis correcta, pero parece que no puedo superar este obstáculo en particular.

Gracias.

Mick

+0

Aquí, también puede echar un vistazo a mi aplicación (parte de ella). Se mantiene muy genérico. http://stackoverflow.com/a/18657788/1809463 – mike

Respuesta

5

El código básico debería tener este aspecto:

public class YourClass { 
    public static Solution doYourStuff(double startingTemperature, int numberOfIterations, double coolingRate) { 
    double t = startingTemperature; 
    Solution x = createRandomSolution(); 
    double ti = t; 

    for (int i = 0; i < numberOfIterations; i ++) { 
     double f = calculateFitness(x); 
     Solution mutatedX = mutate(x); 
     double newF = calculateFitness(mutatedX); 
     if (newF < f) { 
     double p = PR(); // no idea what you're talking about here 
     if (p > UR(0, 1)) { // likewise 
      // then do nothing 
     } else { 
      x = mutatedX; 
     } 
     ti = t * coolingRate; 
     } 
    } 
    return x; 
    } 

    static class Solution { 
    // no idea what's in here... 
    } 
} 

Ahora por lo que querer diferentes versiones del método SmallChange() - totalmente factible, pero hay que leer sobre herencia un poco

+2

Tengo la sensación 'ti = t * coolingRate; 'debe ser' ti = ti * coolingRate; ' – Deleplace

3

Además, un enfoque basado en Java para la enseñanza de recocido simulado (con código de ejemplo) es aquí:

Neller, Todd. Teaching Stochastic Local Search, en I. Russell y Z. Markov, eds. Actas de la 18ª Conferencia Internacional FLAIRS (FLAIRS-2005), Clearwater Beach, Florida, 15-17 de mayo de 2005, AAAI Press, págs. 8-13.

relacionados, referencias y demostraciones están aquí: http://cs.gettysburg.edu/~tneller/resources/sls/index.html

+0

El documento realmente vale la pena leerlo. Motiva y explica la funcionalidad del recocido simulado perfectamente utilizando ejemplos de codificación. El código que proporcionan se puede adaptar fácilmente a cualquier tipo de problema de optimización. – Michael

Cuestiones relacionadas