-
Notifications
You must be signed in to change notification settings - Fork 364
/
Hill_climbing.cpp
67 lines (52 loc) · 2.12 KB
/
Hill_climbing.cpp
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
#include <iostream>
using namespace std;
#include <cstdlib>
#include <ctime>
#include <cmath>
// Define the purpose function.
double purpose_function(double x) {
// This function returns the value of the purpose function at the given point x.
return -std::pow(x, 2) + 5;
}
// Define the search space boundaries.
double lower_limit = -10;
double upper_limit = 10;
// Define the step size for each iteration.
double step = 0.1;
// Define the maximum number of iterations.
int max_iter = 100;
// Define a function to generate a random number between two values.
double random_number(double lower, double upper) {
// This function returns a random number between the given lower and upper bounds.
return ((double) rand() / RAND_MAX) * (upper - lower) + lower;
}
// Define the Hill Climbing algorithm.
void Hill_climbing(double lower_bound, double upper_bound, double step, int max_iter) {
// This function implements the Hill Climbing algorithm for finding the maximum of a function.
// Initialize the current best solution.
double current_answer = random_number(lower_bound, upper_bound);
double current_val = purpose_function(current_answer);
// Perform the iterations.
for (int j = 0; j < max_iter; j++) {
// Generate a random neighbor.
double neighbor = current_answer + random_number(-step, step);
neighbor = std::fmax(std::fmin(neighbor, upper_bound), lower_bound); // Ensure the neighbor is within the boundaries
// Calculate the objective value of the neighbor.
double neighbor_val = purpose_function(neighbor);
// Update the current answer if the neighbor is better.
if (neighbor_val > current_val) {
current_answer = neighbor;
current_val = neighbor_val;
}
}
// Print the best solution found.
cout << "Best solution: " << current_answer << endl;
cout << "Best value: " << current_val << endl;
}
int main() {
// Set the seed for random number generation.
std::srand(std::time(NULL));
// Run the Hill Climbing algorithm.
Hill_climbing(lower_limit, upper_limit, step, max_iter);
return 0;
}