Scheduling concurrent jobs for several machines (Differential Evolution).
#include <chrono>
#include <vector>
const int n_machines = 5;
const int n_jobs = 50;
std::vector<std::chrono::hours> job_duration(n_jobs);
{
double ret(0.0);
start.
apply_each([](
auto &v) { v = std::round(v); });
{
if (start[i] < 0.0)
ret += start[i];
const auto end(start[i] + job_duration[i].count());
if (end >= 24.0)
ret -= end - 24.0;
int occupied(1);
if (j != i
&& start[j] <= start[i]
&& start[j] + job_duration[j].count() > start[i])
++occupied;
if (occupied > n_machines)
ret -= occupied - n_machines;
}
return ret;
}
int main()
{
using namespace std::chrono_literals;
log::reporting_level = log::lINFO;
std::ranges::generate(job_duration,
[]
{
});
std::cout << "Total time required: "
<< std::accumulate(job_duration.begin(), job_duration.end(),
0h).count()
<< '\n';
prob.params.evolution.generations = 2000;
const auto res(
search.
run().best_individual());
for (unsigned i(0); i < n_jobs; ++i)
std::cout << i << ' ' << std::round(res[i]) << ' '
<< job_duration[i].count() << '\n';
std::cout << "Fitness: " << f(res) << std::endl;
}
search_stats< individual_t, fitness_t > run(unsigned=1, const model_measurements< fitness_t > &={})
Definition search.h:230
Definition de/individual.h:36
void apply_each(std::size_t, std::size_t, F &&)
Definition vector_individual.h:114
Definition de/problem.h:29
Definition de/search.h:28
std::size_t parameters() const noexcept
Definition vector_individual.h:173
T between(T min, T sup)
Definition random.h:57
std::size_t individuals
Definition parameters.h:54