diff --git a/sa.cpp b/sa.cpp index f449813..c2cebf8 100644 --- a/sa.cpp +++ b/sa.cpp @@ -6,7 +6,6 @@ auto sa::solution::simulated_annealing(int capacity, const std::vectorsa::solution { sa::solution best(items, capacity); - best.randomize(); sa::solution prev = best; std::random_device rdevice; @@ -20,7 +19,7 @@ auto sa::solution::simulated_annealing(int capacity, const std::vector rand(eng)) { prev.swap(neighbor); } @@ -28,6 +27,7 @@ auto sa::solution::simulated_annealing(int capacity, const std::vector #include #include +#include namespace sa { @@ -50,8 +51,32 @@ class solution { iteration(itr) {} solution(const std::vector &items, int capacity): // Gera a solução inicial - items(items), gen(std::random_device()()), capacity(capacity), - fitness(calculate_boxes()), iteration(0) {} + gen(std::random_device()()), capacity(capacity), + iteration(0) { + std::multiset its; + for (auto i : items) { + its.insert(i); + } + + long long cap = capacity; + + while (!its.empty()) { + auto itr = its.upper_bound(cap); + if (itr == its.begin()) { + cap = capacity; + cap -= *its.begin(); + this->items.push_back(*its.begin()); + its.erase(its.begin()); + continue; + } + itr--; + cap -= *itr; + this->items.push_back(*itr); + its.erase(itr); + } + + fitness = calculate_boxes(); + } void setneighbor() { // Gera um vizinho da solução std::uniform_int_distribution<> dist(0, items.size() - 1);