Programming Generate World Cup pools using Mixed Integer Programming

Tuthur

Haha CEO
is a Site Content Manageris a Top Social Media Contributoris a Forum Moderatoris a Community Contributoris a Top Tiering Contributoris a Top Contributoris a Top Smogon Media Contributor
Hello, I've been made aware that World Cup pools were done manually, as there is as far as I know no tool that has been developped for their generation. As a reminder, World Cup pools generation (usually) follows the following rules:
  1. Every team must face at least once every other team.
  2. Every team can't face more than twice every other team.
  3. If three teams face together in the same pool, the same three teams can't all face in another pool.
  4. Every pool is full.
  5. Two players of the same team can't be in the same pool.
  6. A starter can't play in two different pools.
Theia told me that rule 2 and 3 can be hard to implement manually for bigger tournaments. For instance, in DWCoP, the India vs US West matchup appeared three times (pools 4, 5, and 20). I'm not making this statement to throw shades at Theia or any other hosts who went through the tidious process of designing pools for such tournaments; but rather to point out how complicated it is to make sure these three rules are always respected, despite spending hours working on it. Automating this process would lead to better pools (i.e. more respectful of the constraints) and save hours of work to the hosts.

While I am too lazy to prove this problem is NP-complete; it looks like one. That's why I wanted to tackle it using my favorite method to solve NP-complete problems: Mixed Integer Programming (MIP). The next section will detail the MIP model used in this program. If you are uneducated about MIP or just want to read about to use the final program, you can skip this part. The model should be quite straightforward, but feel free to ask questions if you have any.
Data:
integer: SIZE = the size of the pool
integer: TEAM = the number of teams
integer: STARTER = the number of starters per pool
integer: POOL = STARTER * TEAM / SIZE

Variables:
For all p integer in [0, POOL-1], for all t integer in [0, TEAM-1], boolean: solo(p, t) = 1 if team of index t plays in pool of index p; 0 otherwise

Intermediate variables (determinist from the above variables):
For all p integer in [0, POOL-1], for all t1 integer in [0, TEAM-2], for all t2 integer in [1, TEAM-1], such that t1 < t2, boolean: duo(p, t1, t2) = 1 if teams of index t1 and t2 face each others in pool of index p; 0 otherwise.
Constraints forcing its value: 2 * duo(p, t1, t2) >= solo(p, t1) + solo(p, t2) - 1

For all p integer in [0, POOL-1], for all t1 integer in [0, TEAM-3], for all t2 integer in [1, TEAM-2], , for all t3 integer in [2, TEAM-1], such that t1 < t2 < t3, boolean: trio(p, t1, t2, t3) = 1 if teams of index t1, t2, and t3 face each others in pool of index p; 0 otherwise.
Constraints forcing its value: 3 * trio(p, t1, t2, t3) >= solo(p, t1) + solo(p, t2) + solo(p, t3) - 2
(note: "3 * trio(p, t1, t2, t3) >= duo(p, t1, t2) + duo(p, t1, t2) + duo(p, t2, t3) - 2" could work too)

Constraints:
Rule 1: For all t1 integer in [0, TEAM-2], for all t2 integer in [1, TEAM-1], such that t1 < t2,
sum(p in [0, POOL-1])(duo(t1, t2, p)) >= 1

Rule 2: For all t1 integer in [0, TEAM-2], for all t2 integer in [1, TEAM-1], such that t1 < t2,
sum(p in [0, POOL-1])(duo(t1, t2, p)) <= 2

Rule 3: For all t1 integer in [0, TEAM-3], for all t2 integer in [1, TEAM-2], for all t3 integer in [2, TEAM-1], such that t1 < t2 < t3,
sum(p in [0, POOL-1])(trio(t1, t2, t3, p)) <= 1

Rule 4 + 5: For all p in [0, POOL-1],
sum(t in [0, TEAM-1])(solo(t, p)) == SIZE

Rule 5 + 6: For all t in [0, TEAM-1],
sum(p in [0, POOL-1])(solo(t, p)) == STARTER

Now onto the program itself. The only widely accessible (read free and performing) MIP solver to my knowledge is Google's OR-TOOLS. I am not experienced at all with UI, let alone graphical ones, so if you want to use this program you'd have to manually run the Python files in the ZIP file and also download the Google's OR-TOOLS library. The file "templateMaker.py" handles the whole MIP model, you should only touch it if you want to edit the MIP model / toy with it. The important file is "playerRandomization.py" and the one that you need to execute to generate your pools. In order to use it, you have to edit the line 49 to change the parameters of the call of the main function. The first parameter is the name of a text file containing the list of starters per country (example attached) and the second is the number of players per pool. Execute the script and it should print in your console the list of players per pool, as well as the execution time (the later can be commented out).

The example given here lets me generate a bracket that fulfill every constraints for DOUWC (13 teams, 8 starters per team, 4 players per pool) just under one hour with my 4 years old laptop. I was also able to generate ZUWC like (12 teams, 6 starters per team, 4 players per pool) in around 20 seconds.
Europe,Canada,France,US East
Europe,France,China,Spain
Europe,US West,Italy,India
Europe,Canada,US West,Latin America
Europe,US East,US Central,Spain
Europe,US Central,Brazil,India
Europe,China,Italy,APAC
Europe,Brazil,APAC,Latin America
Canada,France,Brazil,APAC
Canada,Spain,India,Latin America
Canada,US Central,US West,China
Canada,US Central,Italy,APAC
Canada,Italy,Brazil,Spain
Canada,US East,China,India
France,China,APAC,India
France,US East,US West,Brazil
France,US West,Italy,Latin America
France,US Central,Italy,Spain
US East,China,Italy,Latin America
US East,Italy,Brazil,India
US East,US Central,US West,APAC
US East,Spain,APAC,Latin America
US West,China,Brazil,Spain
US Central,China,Brazil,Latin America
France,US Central,India,Latin America
US West,Spain,APAC,India
There are probably some typos, sorry.
['Hugo', 'Hys', 'CaoJie', 'sirjelloton']
['JRL', 'Nephtyrix', 'NakanoNino', 'LicenciadoPan']
['FlyingBeagle', 'eragon11145', 'Ferrari450', 'tyo']
['Lily', 'GrandmasCookin', 'z0mOG', 'Zerotti']
['Tenzai', 'robjr', 'Spurrific', 'Yddeon']
['Fran', 'Croven', 'Staraptor', 'InkVGC']
['SMB', 'xqiht', 'entrocefalo', 'Zeal']
['MichaelderBeste2', 'Seraphz', 'Kaif', 'Ann']
['Mishimono', 'Cyndakill-SH', 'Beraldo', 'Exotic64']
['sempra', 'Kresku', 'SHIMA', 'luisin']
['Mizuhime', 'laptops', 'Lemurro', 'latiasatoshi']
['Wille', 'qsns', 'Toxigen', 'Genesis77']
['GenOne', 'waffle2O2O', 'LpZ', 'Talkze']
['RelicanthPrimal', 'zoe', 'MetapodVGCChannel', 'AIRedzone']
['Givrix', 'ChandelureVGC', 'YoBuddy', 'shadekirby321']
['gataen', 'Actuarily', 'fespy', 'havocknight']
['Herv', 'jonas', 'Amaranth', 'AkaruKokuyo']
['ratpacker', 'bage1', 'LoSconosciuto', 'RDL93']
['Arcticblast', 'hybone', 'Fafromani', 'Enzonana.']
['Iceberg77', 'MADARAAAA', 'RiloBR', 'Nido-Rus']
['panda!', 'DawAwesomeDude1', 'KeanuGridingArc', 'Feyy']
['zee', 'Shiritu', 'trace', 'Mashing']
['IwantAtagotositonme', 'tianlengmeihou', 'Ninja', 'TheAndrw']
['MajorBowman', 'Metallica126', 'AshKetchumGamer', 'ohtheguilt']
['John1240', 'Paraplegic', 'Loudwinner', 'GasaiYunoSan']
['EternalSnowman', 'SusejVGC', 'raf', 'DJBreloominati']

There is a lot of room for improvement in this script, even beside the lack of a practical UI. The execution time is quite long due to the high amount of variables, despite the vast majority of them being deterministic of only a small set of them (solo(p, t)). The problem also has many symetry axes, while I broke some with forcing some teams on the first pool and also forcing some of the first teams into the first pools, I am convinced more could be found.
Another problem is that before yesterday I had never used OR-TOOLS and there are probaly ways to optimize how the model is described to the solver. My main worry is the lack of an objective function; on the one hand I'm happy because we could easily add one and that would allow for some pseudo seeding in World Cups, on the other hand, I'm concerned whether there wouldn't be more effective ways to find any solution fulfilling the constraints as opposed to use one that is designed to find the best solution based on a specific objective function.
I do also have very little knowledge on how the program would handle limit cases. At this point, I've only tested the script on two feasible cases, but what if there is no solution? Draft World Cup and WCoP have more teams than DOUWC, if there is no solution for these cases, then the algorithm won't return any solution. It is annoying to have wasted time and resource for no result, and there are not so many solutions I can imagine to solve this problem.
The first solution that crossed my mind would consist of commenting out the trio variables, as they are the most numerous and rule 3 isn't nearly as impactful as the other rules. It is quite frustrating because you've no control on how many time the rule 3 is broken.
The second solution is less extreme and would be to use a Lagrangian relaxation, i.e. turn the rule 3 into an objective function. I haven't digged up on it yet, but this seems like the most promising solution to find an effective solution that doesn't break the rule 3 that often.

Also first time working on this kind of personal projects, be kind please.

Edit: see update, performance is much better than described in op

Edit2: not editing the op for history reasons, but some changes were implemented there
 

Attachments

Last edited:
Really cool project, great work! :blobthumbsup:

I know little about exactly what MIP solvers do "under the hood" but I've dabbled in MIP albeit with another solver (in my case I had both continuous & integer variables, and an objective function). So I'll try to share some thoughts, hopefully you find something useful here:
  1. I think the performance is already great for the use case! But I can relate to wanting to improve performance, it's a fun process :)
  2. Our solver had various options that impacted solver performance, so perhaps check if the Python API allows for any interesting solver options! For instance, presolving helped a lot for our use case.
  3. Regarding "optimizing how the model is described to the solver", I know that our solver allowed for double-bounded constraint definitions. Perhaps it could be worth merging rules 1 & 2 into one double bounded constraint? No idea if that actually improves anything or if the solver just converts them back into separate constraints but could be worth trying out :)
  4. Some solvers distinguish between integer variables and boolean variables so could be worth defining some of the 0-1 variables as boolean, again no idea if that provides any useful hints to the solver but could be worth trying!
  5. I agree that reconsidering how to approach rule 3 would be worthwhile! It would be interesting to hear more about why rule 3 is defined in that way from a "tour planning perspective". Depending on the "why", it could perhaps be possible to rephrase rule 3 to more easily achieve the underlying "why". Though I understand that this is not trivial at all and easier said than done hehe
This was an awesome read, again nice work :)
 
Last edited:

Tuthur

Haha CEO
is a Site Content Manageris a Top Social Media Contributoris a Forum Moderatoris a Community Contributoris a Top Tiering Contributoris a Top Contributoris a Top Smogon Media Contributor
Really cool project, great work! :blobthumbsup:

I know little about exactly what MIP solvers do "under the hood" but I've dabbled in MIP albeit with another solver (in my case I had both continuous & integer variables, and an objective function). So I'll try to share some thoughts, hopefully you find something useful here:
  1. I think the performance is already great for the use case! But I can relate to wanting to improve performance, it's a fun process :)
  2. Our solver had various options that impacted solver performance, so perhaps check if the Python API allows for any interesting solver options! For instance, presolving helped a lot for our use case.
  3. Regarding "optimizing how the model is described to the solver", I know that our solver allowed for double-bounded constraint definitions. Perhaps it could be worth merging rules 1 & 2 into one double bounded constraint? No idea if that actually improves anything or if the solver just converts them back into separate constraints but could be worth trying out :)
  4. Some solvers distinguish between integer variables and boolean variables so could be worth defining some of the 0-1 variables as boolean, again no idea if that provides any useful hints to the solver but could be worth trying!
  5. I agree that reconsidering how to approach rule 3 would be worthwhile! It would be interesting to hear more about why rule 3 is defined in that way from a "tour planning perspective". Depending on the "why", it could perhaps be possible to rephrase rule 3 to more easily achieve the underlying "why". Though I understand that this is not trivial at all and easier said than done hehe
This was an awesome read, again nice work :)
Thank you for the feedback. I looked quickly on the internet for 3. and 4., seeing if there were OR-TOOLs based programs that would use such features, but I couldn't find any. For points 4 and 5, I might dig them up in future.
As for point 1...
WCoP (20 teams, 8 starters, 4 players per pool)
1712088876441.png

DOUWC (13 teams, 8 starters, 4 players per pool)
1712088895831.png
WCoP
['Vileman', 'yovan33321', 'Quartosa', 'Highv0ltag3']
['Lazulli', 'Samqian', 'Niko', 'Ado']
['Mako', 'INSULT', 'Tamahome', 'Dasmer']
['AstilCodex', 'Luigi', 'Kaif', 'Piyush25']
['Mendeez', 'Lily', 'avarice', 'Spectear']
['Jhonx~', 'Zoyotte', 'Giannis Antetokommo-o', 'Kebab mlml']
['Mister McLovin', 'Stareal', 'Vaboh', 'Skypenguin']
['Raptor', '1 True Lycan', 'MANNAT', 'Separation']
['Lokifan', 'March Fires', 'sunsets', 'procorphish']
['Hats', 'DonSalvatore', 'crying', 'cscl']
['Yves Stone', 'FatFighter2', 'dRudi.exe', 'RaJ.Shoot']
['Inder', 'McMeghan', 'B1Kharma', 'SoulWind']
['zS', 'DugZa', 'ZDen', 'So Noisy']
['Amir', 'Finchinator', 'Ash KetchumGamer', 'KanzakiHAria']
['Fairy Peak', 'GXE', 'false', 'Fogbound Lake']
['RedEmption', 'Punny', 'Dj Breloominati', 'M Dragon']
['Unamed', 'KillaLeston', 'Uxilon', 'Century Express']
['Stellar Flares', 'blunder', 'etern', 'Igniizard']
['Eeveeto', 'shiloh', 'kythr', 'elodin']
['mimilimi', 'ZoroDark', 'mncmt', 'Iza']
['Rubyblood', 'Lusa', 'Jytcampbell', 'Fakee']
['MichaelderBeste2', 'MSnt', 'Allen-xia', 'Malekith']
['mushamu', 'Leo', 'pj', 'Garay Oak']
['mind gaming', 'Luirromen', 'Soumav', 'Trosko']
['Kyo', 'Eoward', 'Aurella', 'Floss']
['Skarph', 'QWILY', 'Fc', 'myjava']
['le LLiolae', 'Hayburner', 'TheUzigunner', 'baibaiats']
['ayevon', 'Raiza', 'Oshim', 'guangguang']
['Yelodash', 'Eternal Spirit', 'watashi', 'freezai']
['Chloe', 'oldspicemike', 'Ewin', 'AtraX Madara']
['Nat', 'Joeshh', 'Sylveon used calm mind', 'RggV']
['Star', 'z0mOG', 'Pais', 'One Last Kiss']
['Trogba Trogba', 'damien the genius', 'Vert', 'Wanony']
['pdt', 'ninjadog', 'El Quixana', 'Tace']
['Kushalos', 'njnp', 'ABR', 'Fusien']
['Xrn', 'xavgb', 'Ciro Napoli', 'Chaos23333']
['Ruft', 'Ahsan-219', 'Aberforth', 'Mushfiq']
['TPP', 'lax', 'Scarlet Stars', 'Luispeikou']
['TheFranklin', 'Ox the Fox', 'Sylvi', 'Squirtle Nornor']
['Carkoala', '3d', 'dahli', 'Feen']

DOUWC
['Cao Jie', 'LoSconosciuto', 'Kresku', 'I want Atago to sit on me']
['Givrix', 'tianlengmeihou', 'Mashing', 'Fran']
['gataen', 'fespy', 'Ash KetchumGamer', 'Hys']
['Herv', 'tyo', 'MajorBowman', 'SMB']
['John1240', 'Ferrari450', 'ChandelureVGC', 'Arcticblast']
['Nephtyrix', 'Ninja', 'Enzonana.', 'YoBuddy']
['entrocefalo', 'Loudwinner', 'LpZ', 'Spurrific']
['Amaranth', 'Licenciado Pan', 'shadekirby321', 'MetapodVGCChannel']
['MADARAAAA', 'robjr', 'RiloBR', 'Genesis77']
['Fafromani', 'jonas', 'Ann', 'MichaelderBeste2']
['Toxigen', 'qsns', 'oh the guilt', 'RelicanthPrimal']
['waffle2O2O', 'Lily', 'Mizuhime', 'Feyy']
['TheAndrw', 'z0mOG', 'sir jelloton', 'Hugo']
['Yddeon', 'SHIMA', 'Zerotti', 'GenOne']
['Shiritu', 'Nakano Nino', 'sempra', 'Exotic64']
['RDL93', 'Staraptor', 'bage1', 'JRL']
['eragon11145', 'zoe', 'DawAwesomeDude1', 'Wille']
['EternalSnowman', 'InkVGC', 'luisin', 'Kaif']
['xqiht', 'zee', 'Paraplegic', 'GasaiYunoSan']
['KeanuGridingArc', 'Metallica126', 'laptops', 'raf']
['Lemurro', 'DJ Breloominati', 'hybone', 'Beraldo']
['SusejVGC', 'Actuarily', 'havocknight', 'Akaru Kokuyo']
['Nido-Rus', 'Iceberg77', 'Tenzai', 'trace']
['latiasatoshi', 'Seraphz', 'Flying Beagle', 'Mishimono']
Calculation time : 819.3010892868042 seconds
I couldn't stop thinking about how to break symetries and massively improved the performance by enforcing the values of some variables. I want to develop a bit on how symetry axes help solving this kind of problems because even if you don't understand how MIP works, you can find symetry axes and considerably speed up the process. Without diving in too many details and the geometric aspect of this problem, you can intuit what a symetry axis is for this sort of problems. Let's take a small example with 3 teams (ABC), 2 starters, and 2 pools AB - AC - BC and AC - AB - BC are two solutions of this problem. They are obviously the same solution for our problem as the pools order doesn't matter. Likewise AB - AC - BC and BA - BC - AC are two different solutions, but swapping two teams also doesn't matter as teams are randomly assigned anyway. Finding symetry axes consists in finding rules that prevent such cases. Afterwards, rules can be enforced to break these symetry axes.
The important thing to remember about symetry axes and adding rules to ax them is that you only remove redundant solutions. No unique solution is getting cut, and it basically reduces the search space.
Here are the rules I used to remove symetry axes, for simplicity I will give them with the WCoP example (20 teams, 8 starters, 4 players per pool). Numbers will represent pools, capitalized letters teams, x undetermined teams in a pool, also letters between brackets will mean they are banned:
  • Force the first pool to be the first teams in order. 0: ABCD
  • The first pools all have team A. 1: Axxx, 2: Axxx, 3: Axxx, 4: Axxx, 5: Axxx, 6: Axxx, 7: Axxx
  • Same with the following pools and teams, just substracting two pools each time because they can overlap with previous teams:
    • 8: Bxxx, 9: Bxxx, 10: Bxxx, 11: Bxxx, 12: Bxxx, 13: Bxxx
    • 14: Cxxx, 15: Cxxx, 16: Cxxx, 17: Cxxx
    • 18: Dxxx, 19: Dxxx
  • For the first pools (except for the first one, i put one of the teams that haven't been placed at this point): 1: AExx, 2: AFxx, 3: AGxx, 4: AHxx, 5: AIxx, 6: AJxx, 7: AKxx
  • Ban first team in other pools: (8-40): xxxx (A)
  • Ban first teams in first pools that follow it:
    • 14: Cxxx (AB), 15: Cxxx (AB), 16: Cxxx (AB), 17: Cxxx (AB)
    • 18: Dxxx (ABC), 19: Dxxx (ABC)
  • Ban first teams in last pools:
    • (37-38): xxxx (AB)
    • (33-36): xxxx (ABC)
    • (20-32): xxxx (ABCD)
With the WCoP pools generating in under 5 minutes and DWCoP in under 15 minutes (seemingly harder to prevent repeats with 13 teams than with 20), I am eventually satisfied with the performance. I might try to improve it further in the future, but this now low priority for me.

tldr: some maths let me improve the model and make the process much faster

edit: fixed a symetry axis
 
Last edited:
Excellent post!

As I read it (and please correct me if I'm wrong) this is only applicable to tournaments with only a single format. That is, players are not bound to a particular "slot". This is applicable to some world cups but not all, and indeed the upcoming WCoP will have different tiers.

With different tiers, you need to partition the teams [number of slots] times into [n_teams / pool_size] pools. A constraint programming solution would be more difficult there because an ideal assignment is definitely not always possible. I made a tool for this using completely different methods that's been used for a couple of tournaments already, which I'm planning to make its own post about soonish. When asked to create a schedule for a single-format tour I adapted that approach, but your MIP solution is clearly outperforming it!

As for complexity, it's clearly in NP, but at least for the multi-tier case, I'm 99% sure it's an open problem whether it's NP-complete. I'm hoping to show this in my planned post when I finally have some time for it.
 

Tuthur

Haha CEO
is a Site Content Manageris a Top Social Media Contributoris a Forum Moderatoris a Community Contributoris a Top Tiering Contributoris a Top Contributoris a Top Smogon Media Contributor
Excellent post!

As I read it (and please correct me if I'm wrong) this is only applicable to tournaments with only a single format. That is, players are not bound to a particular "slot". This is applicable to some world cups but not all, and indeed the upcoming WCoP will have different tiers.

With different tiers, you need to partition the teams [number of slots] times into [n_teams / pool_size] pools. A constraint programming solution would be more difficult there because an ideal assignment is definitely not always possible. I made a tool for this using completely different methods that's been used for a couple of tournaments already, which I'm planning to make its own post about soonish. When asked to create a schedule for a single-format tour I adapted that approach, but your MIP solution is clearly outperforming it!

As for complexity, it's clearly in NP, but at least for the multi-tier case, I'm 99% sure it's an open problem whether it's NP-complete. I'm hoping to show this in my planned post when I finally have some time for it.
I completely forgot about multitiers WC, including for WCoP. I don't know how easily I can adapt my code for it, I'll try to figure some solutions out, but as you said it might not be always feasible. Partioning can't be done from multiple generations as it would break the number of matchups constraints (hard to fight every team with only one uu slot), so I would definitely need to rework it in some way.
I wouldn't be so positive about MIP outclassing CP. Most of the symetrical axes I broke could only be broken due to featuring only one tier. I've talked about this problem with some of my coworkers who are more experienced than I am with OR and they also thought CP would be more effective due to the lack of objective function. I'm not very versed at CP and was almost done with the MIP, so I ended up using this one instead.
Looking forward reading your post on CP, I dont have the intuition for it, but it is always a blast reading CP models and comparing their effectiveness to other models.
 

Tuthur

Haha CEO
is a Site Content Manageris a Top Social Media Contributoris a Forum Moderatoris a Community Contributoris a Top Tiering Contributoris a Top Contributoris a Top Smogon Media Contributor
Made a quite consistent update,
First, there a problem in the model, as the duo variable wasn't majorised. It caused certain team matchups to be ignored, but this was fixed with a very simple constraint in: 2 * duo(p, t1, t2) <= solo(p, t1) + solo(p, t2). Unfortunately, this makes the whole process slower. I opted to remove the 3-subset constraint as a result, as in practice it was always implemented or very close to, but would considerably reduce the solving time.
Second, the result will now be returned in a text file instead of the console, directly generating the OP.
Code:
[SPOILER="Groups"]
SV ZU #1
@Tuthur / @FlamingoPokeman / @Mihowk / @damien the genius
SV ZU #2
@zS / @Dorron / @sleid / @jawabarat
SV ZU #3
@Lizardu / @feen / @Indulge in dreams / @gorex
SV ZU #4
@Maybca / @Monai / @123_mejor / @TMM
SV ZU #5
@yovan3321 / @taka / @burstbean / @HSOWA
SV ZU #6
@Arcobaleno / @Beraldo / @5gen / @Bag of Trixx
SV ZU #7
@LustfulLice / @Portobello / @PrinceOfAllTacos / @sinnabyss
SV ZU #8
@sasha / @RyuSnow / @seroo / @plznostep
SV ZU #9
@tko / @PociekMociek / @LpZ / @Sakura&Seele
SV ZU #10
@BigFatMantis / @Baoba / @Drud / @Mirbro
SV ZU #11
@Hachimaki / @The Strap / @havocknight / @Rasche
SV ZU #12
@Ciro napoli / @Fran / @Wadley / @Trogba Trogba
SV ZU #13
@MONNA LUSA / @Oblivion Wing / @Javi / @Forest Guardian
SV ZU #14
@fish anemometer / @Ina fable / @cen344uu / @Fragments
SV ZU #15
@Big Chungus irl / @asa / @mncmt / @TheFranklin
SV ZU #16
@diegoyuhhi / @Danny / @baibaiats / @BloodAce
SV ZU #17
@DugZa / @OranBerryBlissey10 / @a fruitshop owner / @risin_glory
SV ZU #18
@skierdude10 / @Medeia / @Nashrock / @Baddy
[/SPOILER]

[SPOILER="Individual Matchups "]
SV ZU #1:
Tuthur vs FlamingoPokeman
Tuthur vs Mihowk
Tuthur vs damien the genius
FlamingoPokeman vs Mihowk
FlamingoPokeman vs damien the genius
Mihowk vs damien the genius

SV ZU #2:
zS vs Dorron
zS vs sleid
zS vs jawabarat
Dorron vs sleid
Dorron vs jawabarat
sleid vs jawabarat

SV ZU #3:
Lizardu vs feen
Lizardu vs Indulge in dreams
Lizardu vs gorex
feen vs Indulge in dreams
feen vs gorex
Indulge in dreams vs gorex

SV ZU #4:
Maybca vs Monai
Maybca vs 123_mejor
Maybca vs TMM
Monai vs 123_mejor
Monai vs TMM
123_mejor vs TMM

SV ZU #5:
yovan3321 vs taka
yovan3321 vs burstbean
yovan3321 vs HSOWA
taka vs burstbean
taka vs HSOWA
burstbean vs HSOWA

SV ZU #6:
Arcobaleno vs Beraldo
Arcobaleno vs 5gen
Arcobaleno vs Bag of Trixx
Beraldo vs 5gen
Beraldo vs Bag of Trixx
5gen vs Bag of Trixx

SV ZU #7:
LustfulLice vs Portobello
LustfulLice vs PrinceOfAllTacos
LustfulLice vs sinnabyss
Portobello vs PrinceOfAllTacos
Portobello vs sinnabyss
PrinceOfAllTacos vs sinnabyss

SV ZU #8:
sasha vs RyuSnow
sasha vs seroo
sasha vs plznostep
RyuSnow vs seroo
RyuSnow vs plznostep
seroo vs plznostep

SV ZU #9:
tko vs PociekMociek
tko vs LpZ
tko vs Sakura&Seele
PociekMociek vs LpZ
PociekMociek vs Sakura&Seele
LpZ vs Sakura&Seele

SV ZU #10:
BigFatMantis vs Baoba
BigFatMantis vs Drud
BigFatMantis vs Mirbro
Baoba vs Drud
Baoba vs Mirbro
Drud vs Mirbro

SV ZU #11:
Hachimaki vs The Strap
Hachimaki vs havocknight
Hachimaki vs Rasche
The Strap vs havocknight
The Strap vs Rasche
havocknight vs Rasche

SV ZU #12:
Ciro napoli vs Fran
Ciro napoli vs Wadley
Ciro napoli vs Trogba Trogba
Fran vs Wadley
Fran vs Trogba Trogba
Wadley vs Trogba Trogba

SV ZU #13:
MONNA LUSA vs Oblivion Wing
MONNA LUSA vs Javi
MONNA LUSA vs Forest Guardian
Oblivion Wing vs Javi
Oblivion Wing vs Forest Guardian
Javi vs Forest Guardian

SV ZU #14:
fish anemometer vs Ina fable
fish anemometer vs cen344uu
fish anemometer vs Fragments
Ina fable vs cen344uu
Ina fable vs Fragments
cen344uu vs Fragments

SV ZU #15:
Big Chungus irl vs asa
Big Chungus irl vs mncmt
Big Chungus irl vs TheFranklin
asa vs mncmt
asa vs TheFranklin
mncmt vs TheFranklin

SV ZU #16:
diegoyuhhi vs Danny
diegoyuhhi vs baibaiats
diegoyuhhi vs BloodAce
Danny vs baibaiats
Danny vs BloodAce
baibaiats vs BloodAce

SV ZU #17:
DugZa vs OranBerryBlissey10
DugZa vs a fruitshop owner
DugZa vs risin_glory
OranBerryBlissey10 vs a fruitshop owner
OranBerryBlissey10 vs risin_glory
a fruitshop owner vs risin_glory

SV ZU #18:
skierdude10 vs Medeia
skierdude10 vs Nashrock
skierdude10 vs Baddy
Medeia vs Nashrock
Medeia vs Baddy
Nashrock vs Baddy
[/SPOILER]
Third I implemented a new multi-tiers algorithm using a slight variation of my algorithm, which required to just change the last constraint to something pool (i.e. tier) specific. This also required to change the number of times team face each other, I used some threshold suggested by Chains of Markov, and that i'll let them developp when they post their own version of the algorithm.
Code:
[SPOILER="Groups"]
SV OU #1
@United Kingdom (SV OU 2) / @Europe (SV OU 3) / @Spain (SV OU 4) / @Brazil (SV OU 2)
SV OU #2
@Italy (SV OU 5) / @Asia (SV OU 3) / @Germany (SV OU 4) / @Bangladesh (SV OU 3)
SV OU #3
@Belgium (SV OU 4) / @France (SV OU 4) / @Germany (SV OU 2) / @US Midwest (SV OU 2)
SV OU #4
@Italy (SV OU 2) / @US Northeast (SV OU 5) / @United Kingdom (SV OU 3) / @Greece (SV OU 1)
SV OU #5
@US South (SV OU 2) / @Canada (SV OU 2) / @US Northeast (SV OU 3) / @LatAm (SV OU 3)
SV OU #6
@Asia (SV OU 1) / @France (SV OU 2) / @US West (SV OU 5) / @Brazil (SV OU 3)
SV OU #7
@Canada (SV OU 5) / @Asia (SV OU 4) / @United Kingdom (SV OU 4) / @LatAm (SV OU 2)
SV OU #8
@Canada (SV OU 4) / @Spain (SV OU 1) / @India (SV OU 4) / @Brazil (SV OU 5)
SV OU #9
@Italy (SV OU 3) / @France (SV OU 3) / @China (SV OU 3) / @Europe (SV OU 1)
SV OU #10
@Italy (SV OU 4) / @Canada (SV OU 1) / @India (SV OU 2) / @US West (SV OU 3)
SV OU #11
@Spain (SV OU 2) / @India (SV OU 3) / @Germany (SV OU 5) / @Greece (SV OU 2)
SV OU #12
@US South (SV OU 4) / @China (SV OU 2) / @Bangladesh (SV OU 5) / @Greece (SV OU 5)
SV OU #13
@Italy (SV OU 1) / @US South (SV OU 1) / @Asia (SV OU 2) / @Oceania (SV OU 3)
SV OU #14
@Asia (SV OU 5) / @Belgium (SV OU 2) / @United Kingdom (SV OU 5) / @China (SV OU 5)
SV OU #15
@US Northeast (SV OU 1) / @Brazil (SV OU 4) / @Bangladesh (SV OU 4) / @US Midwest (SV OU 3)
SV OU #16
@Belgium (SV OU 5) / @Europe (SV OU 4) / @US West (SV OU 1) / @Brazil (SV OU 1)
SV OU #17
@US South (SV OU 5) / @India (SV OU 1) / @US West (SV OU 2) / @Oceania (SV OU 1)
SV OU #18
@United Kingdom (SV OU 1) / @Europe (SV OU 2) / @Oceania (SV OU 2) / @US Midwest (SV OU 5)
SV OU #19
@US South (SV OU 3) / @China (SV OU 4) / @Spain (SV OU 5) / @LatAm (SV OU 1)
SV OU #20
@Belgium (SV OU 1) / @Spain (SV OU 3) / @Greece (SV OU 3) / @US Midwest (SV OU 4)
SV OU #21
@Canada (SV OU 3) / @US Northeast (SV OU 2) / @Belgium (SV OU 3) / @Bangladesh (SV OU 2)
SV OU #22
@US West (SV OU 4) / @LatAm (SV OU 4) / @Germany (SV OU 1) / @Oceania (SV OU 4)
SV OU #23
@US Northeast (SV OU 4) / @France (SV OU 1) / @Europe (SV OU 5) / @LatAm (SV OU 5)
SV OU #24
@France (SV OU 5) / @Bangladesh (SV OU 1) / @Greece (SV OU 4) / @Oceania (SV OU 5)
SV OU #25
@China (SV OU 1) / @India (SV OU 5) / @Germany (SV OU 3) / @US Midwest (SV OU 1)
 SS OU #1
@Italy (SS OU) / @Spain (SS OU) / @US West (SS OU) / @Bangladesh (SS OU)
 SS OU #2
@US South (SS OU) / @Belgium (SS OU) / @United Kingdom (SS OU) / @France (SS OU)
 SS OU #3
@Canada (SS OU) / @Europe (SS OU) / @Greece (SS OU) / @Oceania (SS OU)
 SS OU #4
@Asia (SS OU) / @India (SS OU) / @LatAm (SS OU) / @US Midwest (SS OU)
 SS OU #5
@US Northeast (SS OU) / @China (SS OU) / @Brazil (SS OU) / @Germany (SS OU)
 SM OU #1
@Italy (SM OU) / @Belgium (SM OU) / @Spain (SM OU) / @Oceania (SM OU)
 SM OU #2
@US Northeast (SM OU) / @United Kingdom (SM OU) / @US West (SM OU) / @Germany (SM OU)
 SM OU #3
@US South (SM OU) / @France (SM OU) / @Brazil (SM OU) / @Greece (SM OU)
 SM OU #4
@Canada (SM OU) / @Asia (SM OU) / @China (SM OU) / @US Midwest (SM OU)
 SM OU #5
@Europe (SM OU) / @India (SM OU) / @LatAm (SM OU) / @Bangladesh (SM OU)
 ORAS OU #1
@Canada (ORAS OU) / @France (ORAS OU) / @Spain (ORAS OU) / @Germany (ORAS OU)
 ORAS OU #2
@Asia (ORAS OU) / @US Northeast (ORAS OU) / @Europe (ORAS OU) / @India (ORAS OU)
 ORAS OU #3
@US South (ORAS OU) / @US West (ORAS OU) / @Bangladesh (ORAS OU) / @US Midwest (ORAS OU)
 ORAS OU #4
@Italy (ORAS OU) / @Belgium (ORAS OU) / @LatAm (ORAS OU) / @Greece (ORAS OU)
 ORAS OU #5
@United Kingdom (ORAS OU) / @China (ORAS OU) / @Brazil (ORAS OU) / @Oceania (ORAS OU)
 SV Ubers #1
@US South (SV Ubers) / @Belgium (SV Ubers) / @Europe (SV Ubers) / @Germany (SV Ubers)
 SV Ubers #2
@United Kingdom (SV Ubers) / @France (SV Ubers) / @India (SV Ubers) / @Bangladesh (SV Ubers)
 SV Ubers #3
@Canada (SV Ubers) / @China (SV Ubers) / @US West (SV Ubers) / @Greece (SV Ubers)
 SV Ubers #4
@Asia (SV Ubers) / @US Northeast (SV Ubers) / @Spain (SV Ubers) / @Oceania (SV Ubers)
 SV Ubers #5
@Italy (SV Ubers) / @LatAm (SV Ubers) / @Brazil (SV Ubers) / @US Midwest (SV Ubers)
 SV UU #1
@France (SV UU) / @China (SV UU) / @Spain (SV UU) / @LatAm (SV UU)
 SV UU #2
@US Northeast (SV UU) / @Belgium (SV UU) / @India (SV UU) / @Oceania (SV UU)
 SV UU #3
@Asia (SV UU) / @Europe (SV UU) / @US West (SV UU) / @Greece (SV UU)
 SV UU #4
@Canada (SV UU) / @Brazil (SV UU) / @Germany (SV UU) / @Bangladesh (SV UU)
 SV UU #5
@Italy (SV UU) / @US South (SV UU) / @United Kingdom (SV UU) / @US Midwest (SV UU)
[/SPOILER]

[SPOILER="Individual Matchups "]
SV OU #1:
United Kingdom (SV OU 2) vs Europe (SV OU 3)
United Kingdom (SV OU 2) vs Spain (SV OU 4)
United Kingdom (SV OU 2) vs Brazil (SV OU 2)
Europe (SV OU 3) vs Spain (SV OU 4)
Europe (SV OU 3) vs Brazil (SV OU 2)
Spain (SV OU 4) vs Brazil (SV OU 2)

SV OU #2:
Italy (SV OU 5) vs Asia (SV OU 3)
Italy (SV OU 5) vs Germany (SV OU 4)
Italy (SV OU 5) vs Bangladesh (SV OU 3)
Asia (SV OU 3) vs Germany (SV OU 4)
Asia (SV OU 3) vs Bangladesh (SV OU 3)
Germany (SV OU 4) vs Bangladesh (SV OU 3)

SV OU #3:
Belgium (SV OU 4) vs France (SV OU 4)
Belgium (SV OU 4) vs Germany (SV OU 2)
Belgium (SV OU 4) vs US Midwest (SV OU 2)
France (SV OU 4) vs Germany (SV OU 2)
France (SV OU 4) vs US Midwest (SV OU 2)
Germany (SV OU 2) vs US Midwest (SV OU 2)

SV OU #4:
Italy (SV OU 2) vs US Northeast (SV OU 5)
Italy (SV OU 2) vs United Kingdom (SV OU 3)
Italy (SV OU 2) vs Greece (SV OU 1)
US Northeast (SV OU 5) vs United Kingdom (SV OU 3)
US Northeast (SV OU 5) vs Greece (SV OU 1)
United Kingdom (SV OU 3) vs Greece (SV OU 1)

SV OU #5:
US South (SV OU 2) vs Canada (SV OU 2)
US South (SV OU 2) vs US Northeast (SV OU 3)
US South (SV OU 2) vs LatAm (SV OU 3)
Canada (SV OU 2) vs US Northeast (SV OU 3)
Canada (SV OU 2) vs LatAm (SV OU 3)
US Northeast (SV OU 3) vs LatAm (SV OU 3)

SV OU #6:
Asia (SV OU 1) vs France (SV OU 2)
Asia (SV OU 1) vs US West (SV OU 5)
Asia (SV OU 1) vs Brazil (SV OU 3)
France (SV OU 2) vs US West (SV OU 5)
France (SV OU 2) vs Brazil (SV OU 3)
US West (SV OU 5) vs Brazil (SV OU 3)

SV OU #7:
Canada (SV OU 5) vs Asia (SV OU 4)
Canada (SV OU 5) vs United Kingdom (SV OU 4)
Canada (SV OU 5) vs LatAm (SV OU 2)
Asia (SV OU 4) vs United Kingdom (SV OU 4)
Asia (SV OU 4) vs LatAm (SV OU 2)
United Kingdom (SV OU 4) vs LatAm (SV OU 2)

SV OU #8:
Canada (SV OU 4) vs Spain (SV OU 1)
Canada (SV OU 4) vs India (SV OU 4)
Canada (SV OU 4) vs Brazil (SV OU 5)
Spain (SV OU 1) vs India (SV OU 4)
Spain (SV OU 1) vs Brazil (SV OU 5)
India (SV OU 4) vs Brazil (SV OU 5)

SV OU #9:
Italy (SV OU 3) vs France (SV OU 3)
Italy (SV OU 3) vs China (SV OU 3)
Italy (SV OU 3) vs Europe (SV OU 1)
France (SV OU 3) vs China (SV OU 3)
France (SV OU 3) vs Europe (SV OU 1)
China (SV OU 3) vs Europe (SV OU 1)

SV OU #10:
Italy (SV OU 4) vs Canada (SV OU 1)
Italy (SV OU 4) vs India (SV OU 2)
Italy (SV OU 4) vs US West (SV OU 3)
Canada (SV OU 1) vs India (SV OU 2)
Canada (SV OU 1) vs US West (SV OU 3)
India (SV OU 2) vs US West (SV OU 3)

SV OU #11:
Spain (SV OU 2) vs India (SV OU 3)
Spain (SV OU 2) vs Germany (SV OU 5)
Spain (SV OU 2) vs Greece (SV OU 2)
India (SV OU 3) vs Germany (SV OU 5)
India (SV OU 3) vs Greece (SV OU 2)
Germany (SV OU 5) vs Greece (SV OU 2)

SV OU #12:
US South (SV OU 4) vs China (SV OU 2)
US South (SV OU 4) vs Bangladesh (SV OU 5)
US South (SV OU 4) vs Greece (SV OU 5)
China (SV OU 2) vs Bangladesh (SV OU 5)
China (SV OU 2) vs Greece (SV OU 5)
Bangladesh (SV OU 5) vs Greece (SV OU 5)

SV OU #13:
Italy (SV OU 1) vs US South (SV OU 1)
Italy (SV OU 1) vs Asia (SV OU 2)
Italy (SV OU 1) vs Oceania (SV OU 3)
US South (SV OU 1) vs Asia (SV OU 2)
US South (SV OU 1) vs Oceania (SV OU 3)
Asia (SV OU 2) vs Oceania (SV OU 3)

SV OU #14:
Asia (SV OU 5) vs Belgium (SV OU 2)
Asia (SV OU 5) vs United Kingdom (SV OU 5)
Asia (SV OU 5) vs China (SV OU 5)
Belgium (SV OU 2) vs United Kingdom (SV OU 5)
Belgium (SV OU 2) vs China (SV OU 5)
United Kingdom (SV OU 5) vs China (SV OU 5)

SV OU #15:
US Northeast (SV OU 1) vs Brazil (SV OU 4)
US Northeast (SV OU 1) vs Bangladesh (SV OU 4)
US Northeast (SV OU 1) vs US Midwest (SV OU 3)
Brazil (SV OU 4) vs Bangladesh (SV OU 4)
Brazil (SV OU 4) vs US Midwest (SV OU 3)
Bangladesh (SV OU 4) vs US Midwest (SV OU 3)

SV OU #16:
Belgium (SV OU 5) vs Europe (SV OU 4)
Belgium (SV OU 5) vs US West (SV OU 1)
Belgium (SV OU 5) vs Brazil (SV OU 1)
Europe (SV OU 4) vs US West (SV OU 1)
Europe (SV OU 4) vs Brazil (SV OU 1)
US West (SV OU 1) vs Brazil (SV OU 1)

SV OU #17:
US South (SV OU 5) vs India (SV OU 1)
US South (SV OU 5) vs US West (SV OU 2)
US South (SV OU 5) vs Oceania (SV OU 1)
India (SV OU 1) vs US West (SV OU 2)
India (SV OU 1) vs Oceania (SV OU 1)
US West (SV OU 2) vs Oceania (SV OU 1)

SV OU #18:
United Kingdom (SV OU 1) vs Europe (SV OU 2)
United Kingdom (SV OU 1) vs Oceania (SV OU 2)
United Kingdom (SV OU 1) vs US Midwest (SV OU 5)
Europe (SV OU 2) vs Oceania (SV OU 2)
Europe (SV OU 2) vs US Midwest (SV OU 5)
Oceania (SV OU 2) vs US Midwest (SV OU 5)

SV OU #19:
US South (SV OU 3) vs China (SV OU 4)
US South (SV OU 3) vs Spain (SV OU 5)
US South (SV OU 3) vs LatAm (SV OU 1)
China (SV OU 4) vs Spain (SV OU 5)
China (SV OU 4) vs LatAm (SV OU 1)
Spain (SV OU 5) vs LatAm (SV OU 1)

SV OU #20:
Belgium (SV OU 1) vs Spain (SV OU 3)
Belgium (SV OU 1) vs Greece (SV OU 3)
Belgium (SV OU 1) vs US Midwest (SV OU 4)
Spain (SV OU 3) vs Greece (SV OU 3)
Spain (SV OU 3) vs US Midwest (SV OU 4)
Greece (SV OU 3) vs US Midwest (SV OU 4)

SV OU #21:
Canada (SV OU 3) vs US Northeast (SV OU 2)
Canada (SV OU 3) vs Belgium (SV OU 3)
Canada (SV OU 3) vs Bangladesh (SV OU 2)
US Northeast (SV OU 2) vs Belgium (SV OU 3)
US Northeast (SV OU 2) vs Bangladesh (SV OU 2)
Belgium (SV OU 3) vs Bangladesh (SV OU 2)

SV OU #22:
US West (SV OU 4) vs LatAm (SV OU 4)
US West (SV OU 4) vs Germany (SV OU 1)
US West (SV OU 4) vs Oceania (SV OU 4)
LatAm (SV OU 4) vs Germany (SV OU 1)
LatAm (SV OU 4) vs Oceania (SV OU 4)
Germany (SV OU 1) vs Oceania (SV OU 4)

SV OU #23:
US Northeast (SV OU 4) vs France (SV OU 1)
US Northeast (SV OU 4) vs Europe (SV OU 5)
US Northeast (SV OU 4) vs LatAm (SV OU 5)
France (SV OU 1) vs Europe (SV OU 5)
France (SV OU 1) vs LatAm (SV OU 5)
Europe (SV OU 5) vs LatAm (SV OU 5)

SV OU #24:
France (SV OU 5) vs Bangladesh (SV OU 1)
France (SV OU 5) vs Greece (SV OU 4)
France (SV OU 5) vs Oceania (SV OU 5)
Bangladesh (SV OU 1) vs Greece (SV OU 4)
Bangladesh (SV OU 1) vs Oceania (SV OU 5)
Greece (SV OU 4) vs Oceania (SV OU 5)

SV OU #25:
China (SV OU 1) vs India (SV OU 5)
China (SV OU 1) vs Germany (SV OU 3)
China (SV OU 1) vs US Midwest (SV OU 1)
India (SV OU 5) vs Germany (SV OU 3)
India (SV OU 5) vs US Midwest (SV OU 1)
Germany (SV OU 3) vs US Midwest (SV OU 1)

SS OU #1:
Italy (SS OU) vs Spain (SS OU)
Italy (SS OU) vs US West (SS OU)
Italy (SS OU) vs Bangladesh (SS OU)
Spain (SS OU) vs US West (SS OU)
Spain (SS OU) vs Bangladesh (SS OU)
US West (SS OU) vs Bangladesh (SS OU)

SS OU #2:
US South (SS OU) vs Belgium (SS OU)
US South (SS OU) vs United Kingdom (SS OU)
US South (SS OU) vs France (SS OU)
Belgium (SS OU) vs United Kingdom (SS OU)
Belgium (SS OU) vs France (SS OU)
United Kingdom (SS OU) vs France (SS OU)

SS OU #3:
Canada (SS OU) vs Europe (SS OU)
Canada (SS OU) vs Greece (SS OU)
Canada (SS OU) vs Oceania (SS OU)
Europe (SS OU) vs Greece (SS OU)
Europe (SS OU) vs Oceania (SS OU)
Greece (SS OU) vs Oceania (SS OU)

SS OU #4:
Asia (SS OU) vs India (SS OU)
Asia (SS OU) vs LatAm (SS OU)
Asia (SS OU) vs US Midwest (SS OU)
India (SS OU) vs LatAm (SS OU)
India (SS OU) vs US Midwest (SS OU)
LatAm (SS OU) vs US Midwest (SS OU)

SS OU #5:
US Northeast (SS OU) vs China (SS OU)
US Northeast (SS OU) vs Brazil (SS OU)
US Northeast (SS OU) vs Germany (SS OU)
China (SS OU) vs Brazil (SS OU)
China (SS OU) vs Germany (SS OU)
Brazil (SS OU) vs Germany (SS OU)

SM OU #1:
Italy (SM OU) vs Belgium (SM OU)
Italy (SM OU) vs Spain (SM OU)
Italy (SM OU) vs Oceania (SM OU)
Belgium (SM OU) vs Spain (SM OU)
Belgium (SM OU) vs Oceania (SM OU)
Spain (SM OU) vs Oceania (SM OU)

SM OU #2:
US Northeast (SM OU) vs United Kingdom (SM OU)
US Northeast (SM OU) vs US West (SM OU)
US Northeast (SM OU) vs Germany (SM OU)
United Kingdom (SM OU) vs US West (SM OU)
United Kingdom (SM OU) vs Germany (SM OU)
US West (SM OU) vs Germany (SM OU)

SM OU #3:
US South (SM OU) vs France (SM OU)
US South (SM OU) vs Brazil (SM OU)
US South (SM OU) vs Greece (SM OU)
France (SM OU) vs Brazil (SM OU)
France (SM OU) vs Greece (SM OU)
Brazil (SM OU) vs Greece (SM OU)

SM OU #4:
Canada (SM OU) vs Asia (SM OU)
Canada (SM OU) vs China (SM OU)
Canada (SM OU) vs US Midwest (SM OU)
Asia (SM OU) vs China (SM OU)
Asia (SM OU) vs US Midwest (SM OU)
China (SM OU) vs US Midwest (SM OU)

SM OU #5:
Europe (SM OU) vs India (SM OU)
Europe (SM OU) vs LatAm (SM OU)
Europe (SM OU) vs Bangladesh (SM OU)
India (SM OU) vs LatAm (SM OU)
India (SM OU) vs Bangladesh (SM OU)
LatAm (SM OU) vs Bangladesh (SM OU)

ORAS OU #1:
Canada (ORAS OU) vs France (ORAS OU)
Canada (ORAS OU) vs Spain (ORAS OU)
Canada (ORAS OU) vs Germany (ORAS OU)
France (ORAS OU) vs Spain (ORAS OU)
France (ORAS OU) vs Germany (ORAS OU)
Spain (ORAS OU) vs Germany (ORAS OU)

ORAS OU #2:
Asia (ORAS OU) vs US Northeast (ORAS OU)
Asia (ORAS OU) vs Europe (ORAS OU)
Asia (ORAS OU) vs India (ORAS OU)
US Northeast (ORAS OU) vs Europe (ORAS OU)
US Northeast (ORAS OU) vs India (ORAS OU)
Europe (ORAS OU) vs India (ORAS OU)

ORAS OU #3:
US South (ORAS OU) vs US West (ORAS OU)
US South (ORAS OU) vs Bangladesh (ORAS OU)
US South (ORAS OU) vs US Midwest (ORAS OU)
US West (ORAS OU) vs Bangladesh (ORAS OU)
US West (ORAS OU) vs US Midwest (ORAS OU)
Bangladesh (ORAS OU) vs US Midwest (ORAS OU)

ORAS OU #4:
Italy (ORAS OU) vs Belgium (ORAS OU)
Italy (ORAS OU) vs LatAm (ORAS OU)
Italy (ORAS OU) vs Greece (ORAS OU)
Belgium (ORAS OU) vs LatAm (ORAS OU)
Belgium (ORAS OU) vs Greece (ORAS OU)
LatAm (ORAS OU) vs Greece (ORAS OU)

ORAS OU #5:
United Kingdom (ORAS OU) vs China (ORAS OU)
United Kingdom (ORAS OU) vs Brazil (ORAS OU)
United Kingdom (ORAS OU) vs Oceania (ORAS OU)
China (ORAS OU) vs Brazil (ORAS OU)
China (ORAS OU) vs Oceania (ORAS OU)
Brazil (ORAS OU) vs Oceania (ORAS OU)

SV Ubers #1:
US South (SV Ubers) vs Belgium (SV Ubers)
US South (SV Ubers) vs Europe (SV Ubers)
US South (SV Ubers) vs Germany (SV Ubers)
Belgium (SV Ubers) vs Europe (SV Ubers)
Belgium (SV Ubers) vs Germany (SV Ubers)
Europe (SV Ubers) vs Germany (SV Ubers)

SV Ubers #2:
United Kingdom (SV Ubers) vs France (SV Ubers)
United Kingdom (SV Ubers) vs India (SV Ubers)
United Kingdom (SV Ubers) vs Bangladesh (SV Ubers)
France (SV Ubers) vs India (SV Ubers)
France (SV Ubers) vs Bangladesh (SV Ubers)
India (SV Ubers) vs Bangladesh (SV Ubers)

SV Ubers #3:
Canada (SV Ubers) vs China (SV Ubers)
Canada (SV Ubers) vs US West (SV Ubers)
Canada (SV Ubers) vs Greece (SV Ubers)
China (SV Ubers) vs US West (SV Ubers)
China (SV Ubers) vs Greece (SV Ubers)
US West (SV Ubers) vs Greece (SV Ubers)

SV Ubers #4:
Asia (SV Ubers) vs US Northeast (SV Ubers)
Asia (SV Ubers) vs Spain (SV Ubers)
Asia (SV Ubers) vs Oceania (SV Ubers)
US Northeast (SV Ubers) vs Spain (SV Ubers)
US Northeast (SV Ubers) vs Oceania (SV Ubers)
Spain (SV Ubers) vs Oceania (SV Ubers)

SV Ubers #5:
Italy (SV Ubers) vs LatAm (SV Ubers)
Italy (SV Ubers) vs Brazil (SV Ubers)
Italy (SV Ubers) vs US Midwest (SV Ubers)
LatAm (SV Ubers) vs Brazil (SV Ubers)
LatAm (SV Ubers) vs US Midwest (SV Ubers)
Brazil (SV Ubers) vs US Midwest (SV Ubers)

SV UU #1:
France (SV UU) vs China (SV UU)
France (SV UU) vs Spain (SV UU)
France (SV UU) vs LatAm (SV UU)
China (SV UU) vs Spain (SV UU)
China (SV UU) vs LatAm (SV UU)
Spain (SV UU) vs LatAm (SV UU)

SV UU #2:
US Northeast (SV UU) vs Belgium (SV UU)
US Northeast (SV UU) vs India (SV UU)
US Northeast (SV UU) vs Oceania (SV UU)
Belgium (SV UU) vs India (SV UU)
Belgium (SV UU) vs Oceania (SV UU)
India (SV UU) vs Oceania (SV UU)

SV UU #3:
Asia (SV UU) vs Europe (SV UU)
Asia (SV UU) vs US West (SV UU)
Asia (SV UU) vs Greece (SV UU)
Europe (SV UU) vs US West (SV UU)
Europe (SV UU) vs Greece (SV UU)
US West (SV UU) vs Greece (SV UU)

SV UU #4:
Canada (SV UU) vs Brazil (SV UU)
Canada (SV UU) vs Germany (SV UU)
Canada (SV UU) vs Bangladesh (SV UU)
Brazil (SV UU) vs Germany (SV UU)
Brazil (SV UU) vs Bangladesh (SV UU)
Germany (SV UU) vs Bangladesh (SV UU)

SV UU #5:
Italy (SV UU) vs US South (SV UU)
Italy (SV UU) vs United Kingdom (SV UU)
Italy (SV UU) vs US Midwest (SV UU)
US South (SV UU) vs United Kingdom (SV UU)
US South (SV UU) vs US Midwest (SV UU)
United Kingdom (SV UU) vs US Midwest (SV UU)
[/SPOILER]
 

Users Who Are Viewing This Thread (Users: 1, Guests: 0)

Top