public void bobo(int maxVenuesPerBundleNb, int bundleNb) {
		candidateBundles = new ArrayList<Bundle<Venue>>();

		// pivots is initialised with the local venues ordered by decreasing 
		// opop.
		List<Venue> pivots = new ArrayList<Venue>(localVenues.values());
		Collections.sort(pivots, new Comparator<Venue>() {
		    public int compare(Venue venue1, Venue venue2) {
		        return -Double.compare(opop(venue1), opop(venue2));
		    }
		});

		// processPivot indicates if a pivot (represented by its ID) has to be
		// processed or not.
		HashMap<String, Boolean> processPivot = new HashMap<String, Boolean>();
		for (Venue pivot : pivots) {
			// At the beginning, pivots are all considered for the processing.
			processPivot.put(pivot.getId(), true);
		}

		// Construction of candidateBundles by iterating on the pivots.
		Iterator<Venue> pivotIterator = pivots.iterator();
		while (pivotIterator.hasNext() && candidateBundles.size() < bundleNb) {
			Venue pivot = pivotIterator.next();
			String pivotId = pivot.getId();

			if (processPivot.get(pivotId)) {
				// The current pivot has to be processed.

				// A bundle is created around pivot using the other venues.
				localVenues.remove(pivotId);
				Bundle<Venue> bundle = pickBundle(pivot, maxVenuesPerBundleNb);
				
				// The venues chosen for the bundle are removed from venues and
				// will not be processed as future pivots.
				List<Venue> bundleVenues = bundle.getItems();
				for (Venue bundleVenue : bundleVenues) {
					localVenues.remove(bundleVenue.getId());
					processPivot.put(bundleVenue.getId(), false);
				}

				// bundle is added to the candidate bundles.
				candidateBundles.add(bundle);
			}
		}
	}