Algoritmia - estudiante

 
Vista:

estudiante

Publicado por Carlos Arias (2 intervenciones) el 21/05/2004 15:20:13
Epale a todos... necesito el codigo de un algoritmo que se llama recocido simulado en c, si alguien lo tiene y me lo puede facilitar seria bueno, ah y una pequeña explicacion tambien...
gracias, bye
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Implementación de recocido simulado en C para el problema del viajante de comercio (TSP)

Publicado por Alejandro (307 intervenciones) el 01/03/2024 19:44:38
Carlos, aquí tienes un ejemplo básico de un algoritmo de recocido simulado en C. Ten en cuenta que el recocido simulado es un algoritmo heurístico utilizado para la optimización global. En este ejemplo, implementaremos el recocido simulado para resolver el problema del viajante de comercio (TSP).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
#define N 5 // Número de ciudades
#define INF 999999999
 
typedef struct {
    int x, y;
} City;
 
double distance(City a, City b) {
    int dx = a.x - b.x;
    int dy = a.y - b.y;
    return sqrt(dx * dx + dy * dy);
}
 
double totalDistance(int path[], City cities[]) {
    double total = 0;
    for (int i = 0; i < N - 1; i++) {
        total += distance(cities[path[i]], cities[path[i + 1]]);
    }
    total += distance(cities[path[N - 1]], cities[path[0]]);
    return total;
}
 
void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}
 
double simulatedAnnealing(City cities[]) {
    int currentPath[N];
    int newPath[N];
    double currentDistance, newDistance, delta, acceptanceProbability;
    double temperature = 1000.0;
    double coolingRate = 0.995;
 
    // Inicializar la ruta actual de forma aleatoria
    for (int i = 0; i < N; i++) {
        currentPath[i] = i;
    }
 
    currentDistance = totalDistance(currentPath, cities);
 
    while (temperature > 1.0) {
        // Generar una nueva ruta permutando dos ciudades
        for (int i = 0; i < N; i++) {
            newPath[i] = currentPath[i];
        }
 
        int index1 = rand() % N;
        int index2 = rand() % N;
        swap(&newPath[index1], &newPath[index2]);
 
        newDistance = totalDistance(newPath, cities);
 
        // Calcular la diferencia entre las distancias
        delta = newDistance - currentDistance;
 
        // Decidir si se acepta la nueva solución
        if (delta < 0 || ((double)rand() / RAND_MAX) < exp(-delta / temperature)) {
            for (int i = 0; i < N; i++) {
                currentPath[i] = newPath[i];
            }
            currentDistance = newDistance;
        }
 
        // Reducir la temperatura
        temperature *= coolingRate;
    }
 
    return currentDistance;
}
 
int main() {
    City cities[N] = {{0, 0}, {1, 2}, {3, 1}, {5, 2}, {4, 0}};
    double result = simulatedAnnealing(cities);
 
    printf("Distancia mínima encontrada: %.2f\n", result);
 
    return 0;
}

Este código muestra una implementación básica del recocido simulado para resolver el problema del viajante de comercio (TSP). El algoritmo comienza con una ruta aleatoria y utiliza la probabilidad de aceptación para decidir si se debe aceptar una nueva solución, incluso si es peor que la actual. La temperatura disminuye gradualmente hasta que el sistema se enfría.

Ten en cuenta que esta es solo una implementación básica y podría necesitar ajustes según tus necesidades específicas. Además, el rendimiento del recocido simulado depende mucho de la configuración de parámetros como la temperatura inicial, la tasa de enfriamiento, etc.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar