-
Notifications
You must be signed in to change notification settings - Fork 0
/
SimuAnnealing.cpp
78 lines (70 loc) · 1.82 KB
/
SimuAnnealing.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
68
69
70
71
72
73
74
75
76
77
#include "SimuAnnealing.h"
#include "State.h"
#include <vector>
#include <iostream>
#include <math.h>
#include <random>
using namespace std;
SimuAnnealing::SimuAnnealing(int nb_transitions, double alpha, bool is_minimisation) :
nb_transitions_(nb_transitions), alpha_(alpha), is_minimisation_(is_minimisation)
{
cout << "Object Simu is being created" << endl;
}
bool SimuAnnealing::accept(const double& yi, const double& yj, const double& temperature) const {
if (!is_minimisation_) {
if (yj >= yi) {
return true;
}
double proba = exp((yj - yi)/temperature);
random_device rd;
mt19937 gen(rd());
bernoulli_distribution d(proba);
bool result = d(gen);
return result;
}
else {
if (yj <= yi) {
return true;
}
double proba = exp(-(yj - yi)/temperature);
random_device rd;
mt19937 gen(rd());
bernoulli_distribution d(proba);
bool result = d(gen);
return result;
}
}
double SimuAnnealing::heatUpLoop(double radius, int n_cities) {
double target_proba = 0.8;
double distance = 0.0;
State state(radius, n_cities);
for(int i=0; i < nb_transitions_; i++) {
double yi = state.evalDistance();
state.generateNeighbor();
double yj = state.evalDistance();
distance += abs(yj - yi);
}
double mean_distance = distance/nb_transitions_;
double temperature = - mean_distance/log(target_proba);
return temperature;
}
vector<double> SimuAnnealing::coolingLoop(const double& init_temp, State& state) {
double temperature = init_temp;
vector<double> values;
double yi = state.evalDistance();
while (temperature > 1e-4 * init_temp) {
for (int i=0;i < nb_transitions_; i++) {
state.generateNeighbor();
double yj = state.evalDistance();
if (this->accept(yi, yj, temperature)) {
yi = yj;
}
else {
state.comeBack();
}
}
temperature *= alpha_;
values.push_back(yi);
}
return values;
}