Maximalizálni akarjuk az alábbi függvényt egy adott tartományban:
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 =
neighbor_values =
# Legjobb szomszéd kiválasztása
best_neighbor = neighbors
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
#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), f(neighbors)};
// 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;
// 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 = 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
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ő.