Scheduling concurrent jobs for several machines (Differential Evolution).
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 f(std::vector<double> start)
{
double ret(0.0);
for (auto &s : start)
s = std::round(s);
for (unsigned i(0); i < start.size(); ++i)
{
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);
for (unsigned j(0); j < start.size(); ++j)
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()
{
std::generate(job_duration.begin(), job_duration.end(),
[]
{
return std::chrono::hours(random::between(1, 4));
});
std::cout << "Total time required: "
<< std::accumulate(job_duration.begin(), job_duration.end(),
std::chrono::hours(0)).count()
<< '\n';
de_problem prob(n_jobs, {-0.5, 23.5});
prob.env.individuals = 250;
prob.env.generations = 2000;
de_search<decltype(f)> search(prob, f);
const auto res(search.run().best.solution);
for (unsigned i(0); i < n_jobs; ++i)
std::cout << i << ' ' << std::round(res[i]) << ' '
<< job_duration[i].count() << '\n';
}
The main namespace for the project.