# Group tuples to satisfy constraints

This is a problem that involves matching students with various skills into groups so that there are as many groups as possible while ensuring that each group has certain skills present. I've reduced it to this:

1. Given a set of $N$ people with $S$ skills where $A_{n,s}$ is the quantity of skill $s$ that person $n$ has.
2. Group the $N$ people into as many groups as possible, such that there are no more than $G$ people in any group, and so that the sum of each skill in each group is at least $B_s$.

Constraints: $N, S, G < 100$ and $A_{n,s}, B_s < 10$

I haven't been able to come up with a better solution that a brute force so far. Would be very keep for some pointers as to what I should be searching for to find an algorithm for this class of problem.

• This problem reads very much like 3-dimensional matching would be a special case: en.wikipedia.org/wiki/3-dimensional_matching If so, then your problem is NP-hard and you won't have any luck finding an algorithm that's substantially better than brute-force. – Sebastian Oberhoff Apr 3 '18 at 4:08
• What's the context where you encountered this? Can you credit the source? Do you know how to use ILP? – D.W. Apr 3 '18 at 15:06
• @D.W. Encountered in a real life context involving rostering volunteer ambulance officers onto ambulance crews. I'm not familiar with any ILP implementations. – thomasfedb Apr 3 '18 at 16:08
• Unfortunately this is NP-hard even in the very restricted case where there is just 1 skill, and we are trying to decide if we can form 2 groups or only 1. (There is a simple reduction from the Partition Problem -- trying to partition a set of integers into two parts with the same sum.) – j_random_hacker Apr 4 '18 at 10:01
• @j_random_hacker I'm interested in how you reduced it to a problem that involves finding groups with equal sums. The problem only requires that the sum of skills is above a cutoff. – thomasfedb Apr 5 '18 at 6:50

In particular, introduce zero-or-one variables $x_{n,j}$, which is one if person $n$ is placed into group $j$, or zero otherwise. You can now express each of your requirements as a linear inequality, and then use an ILP solver to test for feasibility. Now do binary search (or simple iterative search) over the number of groups, to find the maximum number of groups for which you can find a feasible solution.