private static Allocation takeLeastNOFBalanced(String consumer,
			List<AllocationInfo> infos,
			AllocationInfo requestInfo, Map<String, Double> balances) {
		
		//picks allocations that match requirements
		List<AllocationInfo> matchedAllocations = new LinkedList<AllocationInfo>(infos);
		if (matchedAllocations.isEmpty()) {
			return null;
		}
		
		//adds request info
		List<AllocationInfo> allAllocationsWithWinner = new LinkedList<AllocationInfo>(infos);
		if (requestInfo != null) {
			allAllocationsWithWinner.add(requestInfo);
		}
		
		//picks minimal prejudice removal
		AllocationInfo allocationToTake = AllocationHelper.getLeastNOFBalanced(matchedAllocations, 
				allAllocationsWithWinner, requestInfo, balances);;
		if (isEquallyBalanced(requestInfo, allocationToTake, balances)) {
			return null;
		}
		
		Double leastPrejudice = AllocationHelper.getPrejudice(allocationToTake, requestInfo, allAllocationsWithWinner, balances);
		
		double currentPrejudice = AllocationHelper.getPrejudice(null, null, allAllocationsWithWinner, balances);
		
		if (leastPrejudice > currentPrejudice || 
				(leastPrejudice == currentPrejudice && 
						AllocationHelper.getPeerBalance(consumer, balances) < 
						AllocationHelper.getPeerBalance(allocationToTake.getConsumer(), balances))) {
			return null;
		}
		
		//picks newer allocable
		return AllocationHelper.takeNewerAllocation(allocationToTake);
	}