Skip to content

Instantly share code, notes, and snippets.

@danlark1
Created March 13, 2020 20:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save danlark1/12a9158cb342c6d87442980c3568c605 to your computer and use it in GitHub Desktop.
Save danlark1/12a9158cb342c6d87442980c3568c605 to your computer and use it in GitHub Desktop.
size_t CalcScore(const Problem& p, const std::vector<size_t>& order) {
MPSolver solver("solving_all_cases",
MPSolver::SCIP_MIXED_INTEGER_PROGRAMMING);
std::vector<MPVariable*> books_vars;
std::vector<std::vector<MPVariable*>> libraries_vars;
const double infinity = solver.infinity();
for (size_t i = 0; i < p.books_num; ++i) {
books_vars.push_back(solver.MakeBoolVar(absl::StrCat("x_", i)));
}
for (const size_t ind : order) {
auto& back = libraries_vars.emplace_back();
for (size_t i = 0; i < p.libraries[ind].books_indices.size(); ++i) {
back.push_back(solver.MakeBoolVar(absl::StrCat("y_", i, ind)));
}
}
size_t day = 0;
size_t iter = 0;
for (const size_t ind : order) {
day += p.libraries[ind].install_time;
MPConstraint* const libs_c = solver.MakeRowConstraint(-infinity, (p.days - day) * p.libraries[ind].day_capacity);
for (size_t i = 0; i < p.libraries[ind].books_indices.size(); ++i) {
libs_c->SetCoefficient(libraries_vars[iter][i], 1.0);
}
++iter;
}
std::vector<MPConstraint*> last_c;
for (size_t i = 0; i < p.books_num; ++i) {
last_c.push_back(solver.MakeRowConstraint(-infinity, 0));
last_c.back()->SetCoefficient(books_vars[i], 1.0);
}
iter = 0;
for (const size_t ind : order) {
for (size_t i = 0; i < p.libraries[ind].books_indices.size(); ++i) {
last_c[p.libraries[ind].books_indices[i]]->SetCoefficient(libraries_vars[iter][i], -1.0);
}
++iter;
}
MPObjective* const objective = solver.MutableObjective();
for (size_t i = 0; i < p.books_num; ++i) {
objective->SetCoefficient(books_vars[i], 1.0 * p.books[i]);
}
objective->SetMaximization();
solver.SetTimeLimit(absl::Seconds(120));
auto start = absl::Now();
const MPSolver::ResultStatus result_status = solver.Solve();
auto finish = absl::Now();
std::cerr << "Processed " << finish - start << std::endl;
if (result_status != MPSolver::OPTIMAL) {
std::cerr << "The problem does not have an optimal solution!" << std::endl;
}
std::vector<std::vector<bool>> mask;
iter = 0;
for (const size_t ind : order) {
auto& back = mask.emplace_back();
for (size_t i = 0; i < p.libraries[ind].books_indices.size(); ++i) {
back.push_back(libraries_vars[iter][i]->solution_value() == 1.0);
}
++iter;
}
std::cerr << "Expected objective: " << static_cast<size_t>(objective->Value()) << std::endl;
auto got = CalcScore(p, order, mask, print_out);
std::cerr << "Got: " << got << std::endl;
return got;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment