hegymászó algoritmus
Kiejtés
- IPA: [ ˈhɛɟmaːsoːɒlɡoritmuʃ]
Főnév
- (matematika, algoritmusok) A hegymászó algoritmus egy heurisztikus keresési algoritmus, amelyet optimalizációs problémák megoldására használnak. Az algoritmus iteratív módon működik, mindig az aktuális megoldás legjobb “szomszédját” választva. Nevét onnan kapta, hogy a folyamat hasonló egy hegy megmászásához, ahol mindig felfelé haladunk, amíg el nem érjük a csúcsot.
Működési elv
- Inicializáció:
- Kezdj egy véletlenszerű megoldással.
- Szomszédos megoldások vizsgálata:
- Az aktuális megoldás környezetében (szomszédságában) keresd meg a legjobb alternatívát.
- Frissítés:
- Ha találsz egy jobb szomszédot, lépj át oda, és ismételd a folyamatot.
- Ha nincs jobb szomszéd, az algoritmus megáll.
- Lokális optimum:
- Az algoritmus akkor ér véget, ha elér egy olyan pontot, ahol nincs jobb szomszéd (lokális optimum).
Algoritmus típusai
- Egyszerű hegymászó algoritmus:
- Mindig a legjobb szomszédot választja.
- Stochastic Hill Climbing:
- Véletlenszerűen választ egy szomszédot, amely jobb az aktuálisnál.
- Simulated Annealing:
- Bizonyos valószínűséggel kevésbé jó megoldásokat is elfogad, hogy elkerülje a lokális optimumokat.
- First-Choice Hill Climbing:
- Az első jobb szomszédot választja, amit talál.
- Random Restart Hill Climbing:
- Ha lokális optimumot ér el, újraindítja a keresést egy másik véletlenszerű kiindulópontból.
Előnyök
- Egyszerű implementáció:
- Könnyen érthető és megvalósítható algoritmus.
- Gyors futás:
- Kisebb problémák esetén hatékony.
Hátrányok
- Lokális optimumok:
- Nem garantálja a globális optimum elérését.
- Korlátozott keresési tér:
- Az algoritmus csak a szomszédságban keres, nem veszi figyelembe a globális struktúrát.
- Nincs visszalépési lehetőség:
- Ha egy pontot már elhagyott, nem tér vissza oda.
Példa
Függvény maximalizálása
Maximalizálni akarjuk az alábbi függvényt egy adott tartományban:
- Inicializáció:
- Válassz véletlenszerű kezdőpontot .
- Szomszédos megoldások:
- Nézd meg -et -nél ( ).
- Frissítés:
- Haladj a jobb irányba (ahol nagyobb).
Python implementáció
import numpy as np
def hill_climbing(func, start, step_size, max_iterations):
current_point = start
current_value = func(current_point)
for _ in range(max_iterations):
# Két szomszédos pont: balra és jobbra
neighbors = [current_point - step_size, current_point + step_size]
neighbor_values = [func(x) for x in neighbors]
# Legjobb szomszéd kiválasztása
best_neighbor = neighbors[np.argmax(neighbor_values)]
best_value = max(neighbor_values)
# Ha nincs javulás, állj meg
if best_value <= current_value:
break
# Lépj a legjobb szomszédba
current_point = best_neighbor
current_value = best_value
return current_point, current_value
# Függvény definiálása
def f(x):
return -x**2 + 4*x + 6
# Hegymászó algoritmus futtatása
start_point = 0.0
step = 0.1
max_iters = 100
opt_point, opt_value = hill_climbing(f, start_point, step, max_iters)
print(f"Optimum pont: {opt_point:.2f}, Optimum érték: {opt_value:.2f}")
Kimenet:
Optimum pont: 2.00, Optimum érték: 10.00
C++ implementáció
#include <iostream>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
// Függvény definiálása
double f(double x) {
return -x * x + 4 * x + 6;
}
// Hegymászó algoritmus
pair<double, double> hill_climbing(double start, double step_size, int max_iterations) {
double current_point = start;
double current_value = f(current_point);
for (int i = 0; i < max_iterations; ++i) {
// Két szomszédos pont: balra és jobbra
vector<double> neighbors = {current_point - step_size, current_point + step_size};
vector<double> neighbor_values = {f(neighbors[0]), f(neighbors[1])};
// Legjobb szomszéd kiválasztása
auto max_it = max_element(neighbor_values.begin(), neighbor_values.end());
double best_value = *max_it;
double best_neighbor = neighbors[max_it - neighbor_values.begin()];
// Ha nincs javulás, állj meg
if (best_value <= current_value) {
break;
}
// Lépj a legjobb szomszédba
current_point = best_neighbor;
current_value = best_value;
}
return {current_point, current_value};
}
int main() {
double start_point = 0.0;
double step = 0.1;
int max_iters = 100;
auto [opt_point, opt_value] = hill_climbing(start_point, step, max_iters);
cout << "Optimum pont: " << opt_point << ", Optimum érték: " << opt_value << endl;
return 0;
}
Kimenet:
Optimum pont: 2, Optimum érték: 10
Alkalmazások
- Mesterséges intelligencia:
- Heurisztikus keresési problémák.
- Robotika:
- Mozgástervezés és pályatervezés.
- Optimalizáció:
- Matematikai és mérnöki problémák megoldása.
Összegzés
A hegymászó algoritmus egyszerű, hatékony eszköz optimalizációs problémák megoldására, különösen akkor, ha a keresési tér jól viselkedő és lokálisan konvex. Hátránya, hogy könnyen elakad lokális optimumokban, ezért más algoritmusokkal (pl. simulated annealing vagy genetikus algoritmus) kombinálva hatékonyabbá tehető.
Fordítások
Tartalom
- hegymászó algoritmus - Értelmező szótár (MEK)
- hegymászó algoritmus - Etimológiai szótár (UMIL)
- hegymászó algoritmus - Szótár.net (hu-hu)
- hegymászó algoritmus - DeepL (hu-de)
- hegymászó algoritmus - Яндекс (hu-ru)
- hegymászó algoritmus - Google (hu-en)
- hegymászó algoritmus - Helyesírási szótár (MTA)
- hegymászó algoritmus - Wikidata
- hegymászó algoritmus - Wikipédia (magyar)