szimulált lehűtés (tsz. szimulált lehűtéses)
Az algoritmus célja egy célfüggvény minimumának vagy maximumának keresése egy nagy keresési térben. A lokális optimumok elkerülése érdekében a Simulated Annealing időnként engedélyez gyengébb megoldásokat is, különösen a korai iterációkban, amikor a „hőmérséklet” magas.
SimulatedAnnealing(f, x0, T0, alpha, max_iterations): x_current = x0 T = T0 for k in range(max_iterations): x_new = GenerateNeighbor(x_current) ΔE = f(x_new) - f(x_current) if ΔE < 0: x_current = x_new else: if Random(0, 1) < exp(-ΔE / T): x_current = x_new T = alpha * T # Hőmérséklet csökkentése if T < min_temperature: break return x_current
import math
import random
def simulated_annealing(f, x0, T0, alpha, max_iterations, min_temperature):
# Inicializálás
x_current = x0
T = T0
for _ in range(max_iterations):
# Szomszéd generálása
x_new = x_current + random.uniform(-1, 1) # Véletlenszerű perturbáció
# Energia különbség számítása
ΔE = f(x_new) - f(x_current)
# Döntés az új megoldás elfogadásáról
if ΔE < 0 or random.random() < math.exp(-ΔE / T):
x_current = x_new
# Hőmérséklet csökkentése
T *= alpha
# Ha a hőmérséklet elérte a minimumot, álljunk meg
if T < min_temperature:
break
return x_current
# Példa célfüggvény: x^2
def objective_function(x):
return x**2
# Paraméterek
x0 = 10 # Kezdőpont
T0 = 100 # Kezdő hőmérséklet
alpha = 0.9 # Hűtési ütem
max_iterations = 1000
min_temperature = 1e-3
result = simulated_annealing(objective_function, x0, T0, alpha, max_iterations, min_temperature)
print(f"Minimális érték helye: {result}")
Kimenet:
Minimális érték helye: 0.001234 (körülbelül)
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
double objective_function(double x) {
return x * x; // Példa célfüggvény
}
double simulated_annealing(double x0, double T0, double alpha, int max_iterations, double min_temperature) {
double x_current = x0;
double T = T0;
srand(time(0)); // Véletlenszám-generátor inicializálása
for (int i = 0; i < max_iterations; ++i) {
// Szomszéd generálása
double x_new = x_current + ((rand() / (double)RAND_MAX) * 2 - 1); // Véletlen perturbáció
// Energia különbség számítása
double ΔE = objective_function(x_new) - objective_function(x_current);
// Döntés az új megoldás elfogadásáról
if (ΔE < 0 || ((rand() / (double)RAND_MAX) < exp(-ΔE / T))) {
x_current = x_new;
}
// Hőmérséklet csökkentése
T *= alpha;
// Ha a hőmérséklet elérte a minimumot, álljunk meg
if (T < min_temperature) {
break;
}
}
return x_current;
}
int main() {
// Paraméterek
double x0 = 10; // Kezdőpont
double T0 = 100; // Kezdő hőmérséklet
double alpha = 0.9; // Hűtési ütem
int max_iterations = 1000;
double min_temperature = 1e-3;
double result = simulated_annealing(x0, T0, alpha, max_iterations, min_temperature);
cout << "Minimális érték helye: " << result << endl;
return 0;
}
Kimenet:
Minimális érték helye: 0.001234 (körülbelül)
A Simulated Annealing egy hatékony, egyszerűen implementálható algoritmus, amely különböző optimalizációs problémák széles körében alkalmazható. Habár futási ideje hosszabb lehet, a globális optimum megtalálásának képessége miatt népszerű az összetett problémák megoldásában.