22 #ifndef UNFIT_NOTFORRELEASE_GENERATEINITIALGUESS_HPP_ 23 #define UNFIT_NOTFORRELEASE_GENERATEINITIALGUESS_HPP_ 37 const std::vector<double> &lb,
const std::vector<double> &ub,
38 int number_of_unknowns,
int trial,
int population_per_trial,
39 double cost_tol = 1e-4,
double geom_tol = 1e-2)
42 for (
auto i = 0; i < number_of_unknowns; ++i) {
43 opt.bounds.SetBounds(i, lb[i], ub[i]);
45 opt.options.SetPopulationSize(population_per_trial);
47 opt.options.SetCostTolerance(cost_tol);
48 opt.options.SetGeometricTolerance(geom_tol);
49 opt.options.SetRandomSeed(10*trial);
51 std::vector<double> coordinates(number_of_unknowns, 0.0);
52 if (!opt.GetIsPopulationBased()) {
56 std::mt19937 random_engine(opt.options.GetRandomSeed());
57 for (
auto i = 0; i < number_of_unknowns; ++i) {
58 auto dist = std::uniform_real_distribution<double>(lb[i], ub[i]);
59 coordinates[i] = dist(random_engine);
63 opt.FindMin(cost_func, coordinates);
65 auto residuals = cost_func(coordinates);
66 auto cost = std::inner_product(begin(residuals), end(residuals),
67 begin(residuals), 0.0);
68 coordinates.push_back(cost);
76 std::vector<std::vector<double>> GenerateInitialPopulation(
77 GenericCostFunction &cost_func,
const std::vector<double> &lb,
78 const std::vector<double> &ub,
int number_of_unknowns,
int number_of_trials,
79 int population_per_trial,
double cost_tol = 1e-4,
80 double geom_tol = 1e-2)
82 std::vector<std::vector<double>> population(number_of_trials);
89 std::vector<std::future<std::vector<double>>>population_futures;
90 for (
auto trial = 0; trial < number_of_trials; ++trial) {
91 population_futures.push_back(std::async(std::launch::async,
92 &RunOneTrial<T>, std::ref(cost_func), lb, ub, number_of_unknowns, trial,
93 population_per_trial, cost_tol, geom_tol));
95 for (
auto trial = 0; trial < number_of_trials; ++trial) {
96 population[trial] = population_futures[trial].get();
102 std::vector<std::vector<double>> GenerateInitialPopulation(
103 GenericCostFunction &cost_func,
const std::vector<double> &lb,
104 const std::vector<double> &ub,
int number_of_unknowns)
106 const int number_of_trials {16};
107 const int population_per_trial {16};
108 const double cost_tol {1e-4};
109 const double geom_tol {1e-2};
111 return GenerateInitialPopulation<T>(cost_func, lb, ub, number_of_unknowns,
112 number_of_trials, population_per_trial, cost_tol, geom_tol);
116 std::vector<double> GenerateInitialGuess(GenericCostFunction &cost_func,
117 const std::vector<double> &lb,
const std::vector<double> &ub,
118 int number_of_unknowns,
int number_of_trials,
int population_per_trial,
119 double cost_tol = 1e-4,
double geom_tol = 1e-2)
121 std::vector<std::vector<double>> population = GenerateInitialPopulation<T>(
122 cost_func, lb, ub, number_of_unknowns, number_of_trials,
123 population_per_trial, cost_tol, geom_tol);
125 std::sort(begin(population), end(population),
126 [](
const std::vector<double> &x,
const std::vector<double> &y) {
127 return y.back() > x.back();
130 population[0].pop_back();
131 return population[0];
135 std::vector<double> GenerateInitialGuess(GenericCostFunction &cost_func,
136 const std::vector<double> &lb,
const std::vector<double> &ub,
137 int number_of_unknowns)
139 const int number_of_trials {16};
140 const int population_per_trial {10*number_of_unknowns};
141 const double cost_tol {1e-4};
142 const double geom_tol {1e-2};
144 return GenerateInitialGuess<T>(cost_func, lb, ub, number_of_unknowns,
145 number_of_trials, population_per_trial, cost_tol, geom_tol);
Definition: Bounds.hpp:27
Definition: GenericCostFunction.hpp:36