@ania, I think there is a faster way to solve the bin-tracking problem... i have an idea, in case you want to discuss it do reply...
On Dec 3, 3:28 am, Ania <anka.step...@gmail.com> wrote: > Hi, > > Here is my problem: > I have a list of items (only positive integers are allowed) and fixed > number of bins of identical capacity. I need to pack items (if > possible) so that elements in each bin sum up to given capacity. > > So far I implemented recursive algorithm but I try to convert my > recursive algorithm to an iterative one. However, my implementation > with explicit stack doesn't work as I expected. > > //items are sorted in decreasing order > > Recursive: > bool backtrack(vector<int>& items, vector<Bin>& bins, unsigned index, > unsigned bin_capacity) > { > if (bin_capacity - items.front() < 0) return false; > > if (index < items.size()) > { > //try to put an item into all opened bins > for(unsigned i = 0; i < bins.size(); ++i) > { > if (bins[i].sum() + items[index] + items.back() <= > bin_capacity || bin_capacity - bins[i].sum() == items[index]) > { > bins[i].add(items[index]); > return backtrack(items, bins, index + 1, > bin_capacity); > > } > } > //put an item without exceeding maximum number of bins > if (bins.size() < BINS) > { > Bin new_bin = Bin(); > bins.push_back(new_bin); > bins.back().add(items[index]); > > return backtrack(items, bins, index + 1, bin_capacity); > > } > } > else > { > //check if solution has been found > if (bins.size() == BINS ) > { > for (unsigned i = 0; i <bins.size(); ++i) > { > packed_items.push_back(bins[i]); > } > > return true; > } > } > return false; > > } > > Iterative( not working properly) > bool backtrack(vector<int>& items, vector<Bin>& bins, unsigned index, > unsigned bin_capacity) > { > stack<Node> stack; > Node node, child_node; > Bin new_bin; > //init the stack > node.bins.add(new_bin); > node.bins.back().add(items[item_index]); > stack.push(node); > item_index++; > > while(!stack.empty()) > { > node = stack.top(); > stack.pop(); > > if (item_index < items.size()) > { > if (node.bins.size() < BINS) > { > child_node = node; > Bin empty; > child_node.bins.add(empty); > child_node.bins.back().add(items[item_index]); > stack.push(child_node); > } > > int last_index = node.bins.size() - 1; > for (unsigned i = 0; i <= last_index; i++) > { > if (node.bins[last_index - i]->get_sum() + > items[item_index]+ items.back() <= bin_capacity || > bin_capacity - node.bins[last_index - i]->get_sum() == > items[item_index]) > { > child_node = node; > child_node.bins[last_index - > i]->push_back(items[item_index]); > > stack.push(child_node); > } > } > item_index++; > } > else > { > if (node.bins() == BINS) > { > //copy solution > bins = node.bins; > return true; > } > } > } > return false; > > } > > Any suggestions would be highly appreciated. -- You received this message because you are subscribed to the Google Groups "Algorithm Geeks" group. To post to this group, send email to algogeeks@googlegroups.com. To unsubscribe from this group, send email to algogeeks+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/algogeeks?hl=en.