Versiones anteriores de esta página
Contenido
En el problema del vendedor viajante (TSP) se hace la siguiente pregunta:
Dada una lista de ciudades y las distancias entre cada par de ciudades, que corresponde con la ruta más corta posible que para visite cada ciudad exactamente una vez y regrese a la ciudad de origen?
Una discusión sobre el trabajo de Hamilton & Kirkman se puede encontrar en el libro Graph Theory (Biggs et al. 1976).
Se cree que la forma general del TSP ha sido estudiada por primera vez por Kalr Menger en Viena y Harvard. El problema fue promovido más tarde por Hassler, Whitney & Merrill en Princeton. Una descripción detallada sobre la conexión entre Menger & Whitney, y el desarrollo del TSP se puede encontrar en On the history of combinatorial optimization (till 1960)
El algoritmo de recocido simulado se inspiró originalmente en el proceso de recocido en el trabajo de metal.
El recocido implica calentar y enfriar un material para alterar sus propiedades físicas debido a los cambios en su estructura interna. A medida que el metal se enfría, su nueva estructura se fija, haciendo que el metal conserve sus propiedades recién obtenidas.
Pseudocódigo
Dada una solución inicial, el proceso de recocido simulado, comenzará con una alta temperatura y se enfriará gradualmente hasta que se alcance la temperatura deseada.
Para cada temperatura, se calcula una nueva solución vecina newSolution. Cuanto mayor sea la temperatura, mayor será la probabilidad de aceptar la nueva solución como posible mejor solución.
Una vez alcanzada la temperatura deseada, se devuelve la mejor solución encontrada
Solution = initial_solution;
temperature = initial_temperature;
while (temperature > final_temperature) {
do tries_per_temperature times {
newSolution = neighbour(solution);
If P(E(solution), E(newSolution), T) >= random(0, 1)
solution = newSolution;
}
temperature = temperature * cooling factor;
}
Output: the best solution
La implementación de pgRouting agrega algunos parámetros adicionales para permitir algunos controles de salida dentro del proceso de recocido simulado.
max_changes_per_temperature
:max_consecutive_non_changes
:max_processing_time
:Solution = initial_solution;
temperature = initial_temperature;
WHILE (temperature > final_temperature) {
DO tries_per_temperature times {
newSolution = neighbour(solution);
If Probability(E(solution), E(newSolution), T) >= random(0, 1)
solution = newSolution;
BREAK DO WHEN:
max_changes_per_temperature is reached
OR max_consecutive_non_changes is reached
}
temperature = temperature * cooling factor;
BREAK WHILE WHEN:
no changes were done in the current temperature
OR max_processing_time has being reached
}
Output: the best solution found
No hay una regla exacta sobre cómo se deben elegir los parámetros, dependerá de las características especiales del problema.
Una recomendación es jugar con los valores y ver lo que se ajusta a los datos en particular.
Los parámetros de control son opcionales y tienen un valor predeterminado.
Parámetro | Tipo | Valores predeterminados | Descripción |
---|---|---|---|
start_vid | BIGINT |
0 | La parte ambiciosa de la implementación utilizará este identificador. |
end_vid | BIGINT |
0 | El último vértice de visita antes de volver a start_vid. |
max_processing_time | FLOAT |
+infinity | Detenga el proceso de recocido cuando se alcance el valor. |
tries_per_temperature | INTEGER |
500 | Número máximo de veces que se busca a un(os) vecino(s) en cada temperatura. |
max_changes_per_temperature | INTEGER |
60 | Número máximo de veces que se cambia la solución en cada temperatura. |
max_consecutive_non_changes | INTEGER |
100 | Número máximo de veces consecutivas que la solución no cambia en cada temperatura. |
initial_temperature | FLOAT |
100 | Temperatura de inicio. |
temperatura_final | FLOAT |
0.1 | Temperatura final. |
factor_de_enfriamiento | FLOAT |
0.9 | Valor entre 0 y 1 (sin incluir) utilizado para calcular la siguiente temperatura. |
aleatorizar | BOOLEAN |
true | Elija la semilla aleatoria
|
Devuelve el CONJUNTO DE (seq, node, cost, agg_cost)
Columna | Tipo | Descripción |
---|---|---|
seq | INTEGER |
Secuencia de filas. |
node | BIGINT |
Identificador del nodo/coordenada/punto. |
cost | FLOAT |
|
agg_cost | FLOAT |
|