szimulált lehűtés
Megjelenés
Főnév
szimulált lehűtés (tsz. szimulált lehűtéses)
- (informatika, mesterséges intelligencia, algoritmusok) A Simulated Annealing (SA) egy véletlenített optimalizációs algoritmus, amely komplex keresési problémák globális optimumának meghatározására szolgál. Az algoritmus a fizikai hőkezelés (annealing) folyamatán alapul, ahol egy anyagot magas hőmérsékletre hevítünk, majd lassan lehűtünk, hogy stabil kristályszerkezetet alakítsunk ki.
Fő ötlet
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.
Algoritmus működése
1. Inicializálás
- Kezdő megoldás ((x_0)) kiválasztása.
- Kezdő hőmérséklet ((T_0)) beállítása.
2. Iteráció
- Generáljunk egy szomszédos megoldást ((x_{new})) a jelenlegi megoldásból ((x_{current})).
- Számítsuk ki az energia változást: [ E = f(x_{new}) - f(x_{current}) ] ahol (f) a célfüggvény.
- Ha a megoldás jobb ((E < 0)), akkor fogadjuk el az új megoldást.
- Ha az új megoldás rosszabb ((E > 0)), akkor véletlenszerűen fogadjuk el az alábbi valószínűség szerint: [ P = e^{-E / T} ] ahol (T) a jelenlegi hőmérséklet.
3. Hőmérséklet csökkentése
- Csökkentsük a hőmérsékletet a hűtési ütemterv ((T_{k+1} = T_k)) alapján, ahol () egy (0 < < 1) faktor.
4. Megállási feltétel
- Az algoritmus addig folytatja az iterációkat, amíg a hőmérséklet egy előre meghatározott minimális érték alá nem csökken, vagy egy meghatározott iterációszámot el nem ér.
Pszeudokód
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
Python implementáció
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)
C++ implementáció
#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ó [-1, 1]
// 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)
Előnyök
- Globális optimum keresése:
- Az algoritmus képes elkerülni a lokális optimumokat.
- Egyszerűség:
- Könnyen implementálható, és nem igényel deriváltakat vagy más matematikai eszközöket.
- Rugalmasság:
- Alkalmazható különböző típusú optimalizációs problémákra.
Hátrányok
- Hosszú futási idő:
- A lassú hűtési ütem miatt az algoritmus nagy iterációszámot igényelhet.
- Paraméterérzékenység:
- A kezdő hőmérséklet ((T_0)) és a hűtési ütem (()) beállítása kritikus a teljesítmény szempontjából.
- Véletlenszerűség:
- Az eredmény a véletlenszám-generátortól függ.
Alkalmazások
- Utazóügynök probléma:
- Komplex diszkrét optimalizációs problémák megoldása.
- Gépészeti tervezés:
- Optimális elrendezések és konfigurációk keresése.
- Képfeldolgozás:
- Képek szegmentációja és illesztése.
- Adathalmaz elemzés:
- Klaszterezési problémák.
Összegzés
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.
- szimulált lehűtés - Szótár.net (en-hu)
- szimulált lehűtés - Sztaki (en-hu)
- szimulált lehűtés - Merriam–Webster
- szimulált lehűtés - Cambridge
- szimulált lehűtés - WordNet
- szimulált lehűtés - Яндекс (en-ru)
- szimulált lehűtés - Google (en-hu)
- szimulált lehűtés - Wikidata
- szimulált lehűtés - Wikipédia (angol)