From f9fdd2ec5ce47e7e18afc161be2c9bdd11bab063 Mon Sep 17 00:00:00 2001 From: surdykaw Date: Fri, 17 Jul 2026 19:25:08 +0200 Subject: [PATCH 1/7] Add --with-conflicts option to the main program; Add with_conflicts parameter to the Instance constructor --- src/lib/instance.cpp | 3 ++- src/lib/instance.hpp | 3 ++- src/main_vectorpack.cpp | 8 +++++++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/lib/instance.cpp b/src/lib/instance.cpp index 669347d..f27dd76 100644 --- a/src/lib/instance.cpp +++ b/src/lib/instance.cpp @@ -13,7 +13,8 @@ auto RANDOM_SEED = 23; // For deterministic shuffles Instance::Instance(const std::string instance_name, const std::string& filename, - const bool shuffle_items): + const bool shuffle_items, + const bool with_conflicts): name(instance_name), items_shuffled(shuffle_items) { diff --git a/src/lib/instance.hpp b/src/lib/instance.hpp index b5212b9..6f9aa90 100644 --- a/src/lib/instance.hpp +++ b/src/lib/instance.hpp @@ -11,7 +11,8 @@ class Instance public: Instance(const std::string instance_name, const std::string& filename, - const bool shuffle_items = true); + const bool shuffle_items = true, + const bool with_conflicts = false); virtual ~Instance(); diff --git a/src/main_vectorpack.cpp b/src/main_vectorpack.cpp index 90cbb55..128b6b5 100644 --- a/src/main_vectorpack.cpp +++ b/src/main_vectorpack.cpp @@ -57,6 +57,8 @@ int main(int argc, char** argv) bool offset_item_ids = false; bool shuffle_items = true; + bool with_conflicts = false; + // Parsing options from CLI greatly inspired by // https://cplusplus.com/articles/DEN36Up4/ for (int i = 3; i < argc; ++i) @@ -93,6 +95,10 @@ int main(int argc, char** argv) { shuffle_items = false; } + else if (arg == "--with-conflicts") + { + with_conflicts = true; + } else { std::cerr << "Unknow option: " << arg << std::endl; @@ -101,7 +107,7 @@ int main(int argc, char** argv) } // End of parsing options - Instance inst(instance_name, instance_file, shuffle_items); + Instance inst(instance_name, instance_file, shuffle_items, with_conflicts); //time_point start; //time_point stop; From 6a894a295700bc470f8d7ad4260853ea5d5a73b0 Mon Sep 17 00:00:00 2001 From: surdykaw Date: Fri, 17 Jul 2026 23:19:59 +0200 Subject: [PATCH 2/7] Add adjacency_list vector in Instance class to keep the conflicts lists; Add required getters --- src/lib/instance.cpp | 9 +++++++++ src/lib/instance.hpp | 5 +++++ 2 files changed, 14 insertions(+) diff --git a/src/lib/instance.cpp b/src/lib/instance.cpp index f27dd76..3999b50 100644 --- a/src/lib/instance.cpp +++ b/src/lib/instance.cpp @@ -121,6 +121,15 @@ const bool Instance::getItemsShuffled() const return items_shuffled; } +const bool Instance::getWithConflicts() const +{ + return with_conflicts; +} + +const std::vector>& Instance::getAdjacencyList() const +{ + return adjacency_list; +} SizeList vectorpack::retrieveCapacityList(std::string resource_str) { diff --git a/src/lib/instance.hpp b/src/lib/instance.hpp index 6f9aa90..2542309 100644 --- a/src/lib/instance.hpp +++ b/src/lib/instance.hpp @@ -22,12 +22,17 @@ class Instance const SizeList& getBinCapacities() const; const ItemList& getItems() const; const bool getItemsShuffled() const; + const bool getWithConflicts() const; + const std::vector>& getAdjacencyList() const; + private: const std::string name; // The instance name const bool items_shuffled; // Whether the items were shuffled int nb_items; // The number of items int dimensions; // The number of dimensions + bool with_conflicts; // Whether to take conflict constraints into consideration + std::vector> adjacency_list; // Adjacency lists for explicit conflicts of BPPC instances SizeList capacity_list;// The list of bin capacities ItemList item_list; // The list of Items of this instance }; From 0b2dd451c6d56ecaa737f501b02a702901e2ab1d Mon Sep 17 00:00:00 2001 From: surdykaw Date: Fri, 17 Jul 2026 23:27:57 +0200 Subject: [PATCH 3/7] Make retrieveSizeLists function a friend of Instance class and Redefine it to retrieve conflict list when with_conflicts is true --- src/lib/instance.cpp | 36 +++++++++++++++++++++++++----------- src/lib/instance.hpp | 7 ++++--- 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/src/lib/instance.cpp b/src/lib/instance.cpp index 3999b50..ab18e36 100644 --- a/src/lib/instance.cpp +++ b/src/lib/instance.cpp @@ -54,7 +54,7 @@ Instance::Instance(const std::string instance_name, getline(ifile, line); SizeList sizes; FloatList norm_sizes; - retrieveSizeLists(line, this->capacity_list, sizes, norm_sizes); + retrieveSizeLists(this, line, sizes, norm_sizes, internal_id, with_conflicts); if (sizes.size() != this->dimensions) { @@ -146,23 +146,37 @@ SizeList vectorpack::retrieveCapacityList(std::string resource_str) return vect; } -void vectorpack::retrieveSizeLists(std::string resource_str, SizeList& capacity_list, - SizeList& sizes, FloatList& norm_sizes) +void vectorpack::retrieveSizeLists(Instance* instance, std::string resource_str, + SizeList& sizes, FloatList& norm_sizes, int item_id, bool with_conflicts) { int val; std::string str_val; std::istringstream splitStream(resource_str); - int d = (int)capacity_list.size(); + int d = (int)instance->capacity_list.size(); sizes.reserve(d); norm_sizes.reserve(d); - int i = 0; - while(std::getline(splitStream, str_val, ' ') && (i < d)) + int value; + // Read sizes + for (int i = 0; i < d; i++) { + splitStream >> value; + + sizes.push_back(value); + norm_sizes.push_back((float)value / (float)instance->capacity_list[i]); + } + + // Omit bi + splitStream >> value; + + // Read list of conflicts if with_conflicts is true + if (with_conflicts) { - val = std::stoi(str_val); - sizes.push_back(val); - norm_sizes.push_back((float)val / (float)capacity_list[i]); - i++; + int conflict_id; + while (splitStream >> conflict_id) + { + instance->adjacency_list.at(item_id).push_back(conflict_id); + instance->adjacency_list.at(conflict_id).push_back(item_id); // For conflicts symmetry + } } -} +} \ No newline at end of file diff --git a/src/lib/instance.hpp b/src/lib/instance.hpp index 2542309..83b7a71 100644 --- a/src/lib/instance.hpp +++ b/src/lib/instance.hpp @@ -24,7 +24,8 @@ class Instance const bool getItemsShuffled() const; const bool getWithConflicts() const; const std::vector>& getAdjacencyList() const; - + friend void retrieveSizeLists(Instance* instance, std::string resource_str, SizeList& sizes, + FloatList& norm_sizes, int item_id, bool with_conflicts); private: const std::string name; // The instance name const bool items_shuffled; // Whether the items were shuffled @@ -38,8 +39,8 @@ class Instance }; SizeList retrieveCapacityList(std::string resource_str); -void retrieveSizeLists(std::string resource_str, SizeList& capacity_list, - SizeList& sizes, FloatList& norm_sizes); +void retrieveSizeLists(Instance* instance, std::string resource_str, SizeList& sizes, + FloatList& norm_sizes, int item_id, bool with_conflicts); } // namespace vectorpack #endif // VECTORPACK_INSTANCE_HPP From b6358ea4d9de9733e92883d6c359f87c03da470d Mon Sep 17 00:00:00 2001 From: surdykaw Date: Fri, 17 Jul 2026 23:32:57 +0200 Subject: [PATCH 4/7] Add doesItemConflict method to BaseAlgo and Redefine checkItemToBin to use doesItemConflict --- src/algos/base_algo.cpp | 17 ++++++++++++++++- src/algos/base_algo.hpp | 1 + 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/algos/base_algo.cpp b/src/algos/base_algo.cpp index f4675e8..3663a58 100644 --- a/src/algos/base_algo.cpp +++ b/src/algos/base_algo.cpp @@ -138,7 +138,22 @@ Bin* BaseAlgo::createNewBin() bool BaseAlgo::checkItemToBin(Item* item, Bin* bin) const { - return (bin->doesItemFit(item->getSizes())); + if (!instance.getWithConflicts()) + return bin->doesItemFit(item->getSizes()); + else + return (bin->doesItemFit(item->getSizes()) + && !doesItemConflict(item, bin->getAllocList())); +} + +bool BaseAlgo::doesItemConflict(Item* item, const AllocList& allocated_items) const +{ + const auto& conflicts = instance.getAdjacencyList().at(item->getId()); + + for (int conflict_id : conflicts) + if (std::find(allocated_items.begin(), allocated_items.end(), conflict_id) != allocated_items.end()) + return true; + + return false; } void BaseAlgo::addItemToBin(Item* item, Bin* bin) diff --git a/src/algos/base_algo.hpp b/src/algos/base_algo.hpp index a191006..a44f2af 100644 --- a/src/algos/base_algo.hpp +++ b/src/algos/base_algo.hpp @@ -34,6 +34,7 @@ class BaseAlgo protected: virtual Bin* createNewBin(); // Open a new empty bin virtual bool checkItemToBin(Item* item, Bin* bin) const; + virtual bool doesItemConflict(Item* item, const AllocList& allocated_items) const; virtual void addItemToBin(Item* item, Bin* bin); protected: From a3a11aaf25b1094a15786db9256401c61c3dfab2 Mon Sep 17 00:00:00 2001 From: surdykaw Date: Fri, 17 Jul 2026 23:38:04 +0200 Subject: [PATCH 5/7] Update show_usage helper --- src/main_vectorpack.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main_vectorpack.cpp b/src/main_vectorpack.cpp index 128b6b5..a102e78 100644 --- a/src/main_vectorpack.cpp +++ b/src/main_vectorpack.cpp @@ -36,6 +36,8 @@ void show_usage(std::string prog_name) << "\t--order-bins-output: Outputs bins in their order of creation\n" << "\t--offset-item-ids: Makes item identifiers start at 1 instead of 0 in the output\n" << "\t--no-shuffle: Disables shuffling of items during loading of the instance\n" + << "\t--with-conflicts: Takes into account explicit conflicts between items (for BPPC instances)\n" + << "\t-h, --help: Shows this help message\n" << std::endl; } @@ -101,7 +103,7 @@ int main(int argc, char** argv) } else { - std::cerr << "Unknow option: " << arg << std::endl; + std::cerr << "Unknown option: " << arg << std::endl; return 1; } } From a05fb23784e31e349af147a0ae0f477c136c8a58 Mon Sep 17 00:00:00 2001 From: surdykaw Date: Sat, 18 Jul 2026 00:03:35 +0200 Subject: [PATCH 6/7] Some fixes --- src/lib/instance.cpp | 8 ++++++-- src/lib/instance.hpp | 13 +++++++------ 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/lib/instance.cpp b/src/lib/instance.cpp index ab18e36..994f7ed 100644 --- a/src/lib/instance.cpp +++ b/src/lib/instance.cpp @@ -14,9 +14,10 @@ auto RANDOM_SEED = 23; // For deterministic shuffles Instance::Instance(const std::string instance_name, const std::string& filename, const bool shuffle_items, - const bool with_conflicts): + bool with_conflicts): name(instance_name), - items_shuffled(shuffle_items) + items_shuffled(shuffle_items), + with_conflicts(with_conflicts) { ifstream ifile(filename.c_str()); if(!ifile.is_open()) @@ -47,6 +48,9 @@ Instance::Instance(const std::string instance_name, // Retrieve the item list item_list.reserve(this->nb_items); + + // Resize the adjacency vector + adjacency_list.resize(nb_items); // For each row create one Item for(int internal_id = 0; internal_id < this->nb_items; internal_id++) diff --git a/src/lib/instance.hpp b/src/lib/instance.hpp index 83b7a71..a7b1220 100644 --- a/src/lib/instance.hpp +++ b/src/lib/instance.hpp @@ -12,7 +12,7 @@ class Instance Instance(const std::string instance_name, const std::string& filename, const bool shuffle_items = true, - const bool with_conflicts = false); + bool with_conflicts = false); virtual ~Instance(); @@ -24,14 +24,15 @@ class Instance const bool getItemsShuffled() const; const bool getWithConflicts() const; const std::vector>& getAdjacencyList() const; - friend void retrieveSizeLists(Instance* instance, std::string resource_str, SizeList& sizes, - FloatList& norm_sizes, int item_id, bool with_conflicts); + friend void retrieveSizeLists(Instance* instance, std::string resource_str, + SizeList& sizes, FloatList& norm_sizes, int item_id, bool with_conflicts); + private: const std::string name; // The instance name const bool items_shuffled; // Whether the items were shuffled int nb_items; // The number of items int dimensions; // The number of dimensions - bool with_conflicts; // Whether to take conflict constraints into consideration + bool with_conflicts; std::vector> adjacency_list; // Adjacency lists for explicit conflicts of BPPC instances SizeList capacity_list;// The list of bin capacities @@ -39,8 +40,8 @@ class Instance }; SizeList retrieveCapacityList(std::string resource_str); -void retrieveSizeLists(Instance* instance, std::string resource_str, SizeList& sizes, - FloatList& norm_sizes, int item_id, bool with_conflicts); +void retrieveSizeLists(Instance* instance, std::string resource_str, + SizeList& sizes, FloatList& norm_sizes, int item_id, bool with_conflicts); } // namespace vectorpack #endif // VECTORPACK_INSTANCE_HPP From 3b8dc63c1a824d6c1505889ca7e726ab7f381af9 Mon Sep 17 00:00:00 2001 From: Mommessc <6922939+Mommessc@users.noreply.github.com> Date: Tue, 21 Jul 2026 12:22:18 +0200 Subject: [PATCH 7/7] Some more fixes Detect item size vector mismatch Init adjacency list size only if with_conflicts option is set --- src/lib/instance.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/lib/instance.cpp b/src/lib/instance.cpp index 994f7ed..6c030cf 100644 --- a/src/lib/instance.cpp +++ b/src/lib/instance.cpp @@ -50,7 +50,10 @@ Instance::Instance(const std::string instance_name, item_list.reserve(this->nb_items); // Resize the adjacency vector - adjacency_list.resize(nb_items); + if (with_conflicts) + { + adjacency_list.resize(nb_items); + } // For each row create one Item for(int internal_id = 0; internal_id < this->nb_items; internal_id++) @@ -163,14 +166,14 @@ void vectorpack::retrieveSizeLists(Instance* instance, std::string resource_str, int value; // Read sizes - for (int i = 0; i < d; i++) { + for (int i = 0; (i < d) and (splitStream.good()); i++) { splitStream >> value; sizes.push_back(value); norm_sizes.push_back((float)value / (float)instance->capacity_list[i]); } - // Omit bi + // Omit b_i value (the multiplicity value for CSP problems) splitStream >> value; // Read list of conflicts if with_conflicts is true @@ -183,4 +186,4 @@ void vectorpack::retrieveSizeLists(Instance* instance, std::string resource_str, instance->adjacency_list.at(conflict_id).push_back(item_id); // For conflicts symmetry } } -} \ No newline at end of file +}