New approach to problem.  All possible matchups are generated as before, in an array of subarrays, where each subarray is all of the matchups for one particpant in the tourney.  A nested array representing the rounds of the tournament is generated based on the number of particpants (n - 1 subarrays are added to the outer array).  Currently, the program iterates through each empty subarray (round) and shifts the first matchup off each of the matchups subarrays if none of that matchups names have already been used in the round.  All of that works.  Now logic is needed to change the first element of each set of matchups if not enough valid matchups are added to the tournament the first time through each set of matchups.
Problem solved for tournaments with an even number of teams (no byes necessary).  The algorithm now loops over the iteration of matchups, moving the first matchup to the end of the subarray if any of its particpants (names) are already being used in the current round of the tourney.
Add conditionals to adjust the number of round per tournament and the number of matches per round if there are an odd number of teams.  Needed to add one additional round, and one additional matchup to account for byes.
Add methods for adding a name to the end of a round (signifying a bye) if that name has not already received a bye (has not already been used by itself in the tournament).
Now byes are added before any matches are, allowing the used_match? method to verify that any match to be added to a round does not include the current bye name or a name in one of that rounds exisiting matches.