Jump to content

The Regular Season is Upon Us

SimNFL Teams prepare and strategize for their final preseason matchup before the regular season starts next week.

Conference Finals Showdown

Seattle & Golden State clash for the west; meanwhile in the east, Atlanta and New York are fighting for the right to play in the SimNBA finals. Who will win?

Join Here

Need a team?

Firstly... welcome to the SimFBA! If you are new to the site, and need a team, make sure you head over to the new users section and view the available teams list. You will also be able to fill out your job application there! See you on the field, Coach!

Read more

SimCBB Offseason In Progress

Here is some concept art on American Samoa College's new basketball arena

Join Here

Scheduling and Events!


Recommended Posts

Hi! 

One of the key components of running a baseball team is playing other baseball teams and charging admittance and broadcasting rights for people interested in watching. 

Well you can't do that without scheduling the games ahead of time!  Not only that, but there's all kinds of other league business that has to go on while that's happening.

So today we're going to talk about scheduling in simMLB. 

Scheduling

So if you've been in a fantasy football league, or run a simNFL or simFBA team while trying to book OOC games, you may well be familiar with the struggles of trying to line up the opponents you're interested in playing with and the ability to play then in an open week.

Well boy howdy does MLB suck a fat egg when it comes to making schedules that make a lick of sense. Much like medical resident hours being set by a coke fiend from 100 years ago, the baseball schedule is based on the concept pioneered by circus sideshow acts and travelling dance bands: it's all over the damn place.

This made sense when the primary income was from gate receipts - you want to make sure you dip into every market, but you don't want to stay too terribly long and wear out your welcome. As leagues merged and the expansion era began, this all got wonky, and particularly so when Bud Selig killed the AL/NL autonomy and the hampered the novelty of interleague play. Rob Manfred then promptly took it out back and put it out of it's misery. 

So mercifully, in 2024, the MLB is moving to a more reasonable schedule where all teams play each other at least once. 

MLB Schedule Rules: 

  • Divisional Teams play 13 Games, Alternating 7 at home and 6 away between the 4 other teams in division.
  • Intraleague Teams play 6 games against 6 teams and 7 games against the other 4.
  • Interleague Teams play 3 games against 14 teams in the other league that aren't their 'geo-rival'
  • Teams play 2 home and home series with their 'geo-rival' from another league.

Geo-Rivals in Spoiler Tag Below:

Spoiler

Angels vs. Dodgers
Astros vs. Rockies
Athletics vs. Giants
Blue Jays vs. Phillies
Guardians vs. Reds
Mariners vs. Padres
Orioles vs. Nationals
Rangers vs. Diamondbacks
Rays vs. Marlins
Red Sox vs. Braves
Royals vs. Cardinals
Tigers vs. Pirates
Twins vs. Brewers
Yankees vs. Mets
White Sox vs. Cubs

This totals 52 series and 162 games. 

Now the question is: How do you possibly translate that to simMLB without losing your damn mind?

What's particularly tricky here is that the issue is that even if you abstract the games into 'series', the increments of games in each series set are: 7, 6, 4, and 3. The least common divisor of all of those is N/A.  However! If you break each series into components of 3 and 4 game series (7=4+3, 6=3+3, etc.)  then you can actually divide the season of 162 games into 52 series of 3, 4, and 2 games (home and home special geo-rivalry series only) each.

This alone is still a little wonky, as lining up series by week could lead to some teams having 4 matchups and then 2 and then 3, while their opponent might have 2 before the 4 they share, and then 4 afterwards.  So lining up matchups game-by-game is likely to be completely infeasible. 

Luckily, if we 'bucket' each series in a container of 4 'days' and fill the bucket with 1 game per day and then a bye for any empty days, then you can essentially look at swapping around 4 day containers for series - which means you're only having to match up the weeks, and not start dates of series and such - which is probably exponentially more difficult.

image.png.1d2af12886d2d047e5f844312033488f.png

So the simMLB season is made up of blocks of 4 'days' that will contain anywhere between 2 to 4 games in each block. There are 52 blocks to match the 52 series in an MLB season.

Pacing and Parsing the Schedule

52 series can be divvied up all kinds of ways, but 52/5 is 10.4, 52/4 is 13, and 52/3 is 17.3, and so we're going to aim for the happy middle there as far as season length and play 4 series per week for a season length of 13 weeks of games played.

That doesn't mean a season lasts 13 weeks, heck, half of the season is taken up (happily) by all kinds of other goings on, between Spring Training, All-Star Weekend, and the Playoffs, a season should ideally last 26 weeks in total, allowing for 2 seasons  per calendar year.

Regular Season Games: 4 series per week for 13 weeks, with one break near the middle for all-star week.

Playoffs: With the reduced workload to handle coach lineup input, 1 game per calendar day will be run during the playoffs.

Offseason: Free Agency will be buffered by a week on each side of zero league activity, at least as far as simming games. This should allow time for handling roster moves and other administrative needs for the following season.

Draft: The MLB draft will happen asynchronously over the course of the back half of the season. Because players drafted (generally) don't appear in anything higher than rookie ball until at least the following season, we don't have the pressure the NBA/NFL sims have as far as getting a draft processed in 24-48 hours - which is good because the MLB draft lasts 20 rounds! Details on draft execution to follow in another diary.

Spring Training: Spring training will be a short 8 series season with more lax restrictions on lineups/user input, likely against 5 other teams in a double round robin format (probably matching intraleague slot partners together for 5 groups of 6).

Graphic! (Same thing as above in spreadsheet form)
image.png.57f15a1a887c978304407727c610cc3c.png


What to Expect on Timing
While the season is designed to be run in 26 week increments, it is extremely likely that we'll skip the 'winter' season and start the 2025 season in 2025 in order to allow space for bug handling and moving things into something more automated as far as handling rosters/lineups/games/league administration etc.  

This may be the interface, or it may be something else entirely, we'll have to see what needs and wants we have from users after the first season and what we can accomplish in the mean time.

Automated Schedule Generation

As @Piercewise1 can testify in his work on the NFL schedule, knowing what you're supposed to be seeing doesn't make it less arduous to actually schedule - as there's very little in terms of resources to help with the problem, as sorting out scheduled, especially non-equitable ones, gets exponentially more difficult for each additional team in a league.

To that point, I actually managed to do something I haven't seen anywhere else online and create a program that generates a schedule based on the asinine tradition-filled rules the MLB uses for their matchups.

As I'm kind of hyped about figuring it out, and because I think there are folks in here that are also interested in creating or managing their own league and eventual schedule generation for other sims, I figured I'd take a walk through how it works.

Step 1
First, the program takes in an input. In order to handle all the different permutations asked for, the MLB team file actually includes some additional notes of detail beyond just the regular team attributes - this greatly helps in handling  the edge cases and balancing home/away rotations. 

image.png.e4e3b0212d51ab075b677e67af5cac69.png

Each of those rotation values helps to ensure that teams are playing the right home/away matchups against their partners in the division/interleague/etc

Step 2
Next, the program takes in each line of this piece of data and runs it through a function that adds values to a list based on the rotation and division information. 

image.png.752f9fc79bf22554c29c6ba0f6d98ea8.png

What it is generating is a string that is unique to that particular series - adding home/away, team abbreviation, and length of series. 

These are then returned as a list.

image.png.ba8698b1e0ac6d9265dd5bdd8d42f4c1.png

The return looks something like: 

Quote

[@CWS3, #PIT4, @CHC2,...]

Because the formulas and additional information for creating the matchups is correct, it means that the teams that need a matchup to be 3 home games and 4 away games are guaranteed to have their 'partner' team have the right matching string IDs for that matchup. 

Step 3
This will output 52 values for each team which is stored in a list assigned to each team. Then, since the program has an ID for each series, all it needs to do is pull a string from the first team's list (I randomized and shuffled while doing it to help even out average run time, as we'll see below)  and then find the opponent team and yank the corresponding string out from their list of strings.

Step 4
Then that pair of strings is saved to the list of 'weekly games' and the two teams are removed from the weekly list of teams that need to be scheduled (30 values, each team listed once) no matter what and remove the specific game string from the dictionary that's holding all team values if the week of games was successfully created.

image.png.55300e82fc8f994a86b7798466921a48.png

Since the loop is iterating over that same dictionary that is having the two teams removed (copy of the dictionary, to be specific - for durability reasons), you end up making sure you don't double schedule anyone as the program finished in team/2 runs through the loop.............. sometimes.

The issue with trying to schedule games is of course that you can have a team in week 49 that needs to play the Cubs twice to end the season, but the Cubs end up booked against the other team they need instead of you!

For the longest time I couldn't find a solution to this issue - how can you calculate this problem, and solve it ahead of time with stored values? Maybe some kind of map of indexes for each week that already works and then teams are applied on top of that? 

Step 5
Well, turns out the best way to solve this problem is to tell the loop to kick rocks and start the week all over again.

image.png.20e838db2468816c6e54af32512284b0.png 

So basically the program just slams teams together until they all fit in the toybox and if it takes 100 attempts to find the right orientation, then that's what it takes - just like my interns, I don't pay the computer a wage, so no sweat off my back if it takes it 20x as long.

Step 6
Then you take the weekly list of games, which has been appended each successful loop, and write it to file and you're done!

One issue with running this program is that if you always start with the first team in your dictionary of teams, and if you always start with the same team in the list of potential matchups, then you always run into the same congestion in the same part of the program - and the try/except trick to bodge a solution together will just be an eternal loop. So the teams are shuffled each week to increase the likelihood that teams with small numbers of teams in their 'schedulable' list are early in the process and more likely to find their unscheduled partner successfully.

Output
image.png.8808bb6c35a793cb6e2221573b29e77e.png

This Diary's Poll

All this talk of scheduling leaves a couple things in the air. 

1. What do folks want out of spring training? Because players don't actually go party in South America during the offseason, then we don't really mechanically need a spring training to get players back in shape.

2. The draft in the MLB is really long and I'm guessing ahead of trying that getting everyone together and engaged for 20 rounds of 20 teams would be prohibitively difficult. However, I'm curious about some other options to bring some pomp and circumstance

3. Right now, I have the games set to run in a row from Tuesday, Wednesday, Thursday, Friday. My thinking there would be that with series simming once per day in the middle of the week, it gives folks more time to fiddle with rosters and execute trades  Saturday - Monday. That said, y'all may prefer spacing it out with Tuesday/Thursday/Saturday/ Sunday or doubling up and doing two series each on Tuesday and Friday. Would love to get a sense of what y'all would like and what fits with your availability/access.

https://forms.gle/3xoJ1vTJhU82xFbT9

Last Diary's Poll Results

Folks overwhelmingly preferred a non-flat revenue model for the sim, so that's what we'll go with moving forward! I mentioned that I'd like to see at least 2/3rds of users prefer an inequal model before opting for it, and we ended up with 3/4ths voting for that, with 2/3rds of those users voting for hybrid. 

I think that's clear enough to say that the hybrid model is the preferred route and I'll anticipate setting that up for this first season. As with all things in the community - if it ends up going horribly the first year, there's always room to change it, of course.

image.png.1b0e57ffc27c82675f3e8569a8a81e6a.png

Thanks,
alexfall862

  • Like 5
Link to comment
Share on other sites

A couple questions:

* Are injuries and stamina considerations (AKA if I Cal Ripken someone they play worse over time they're worn down as more games pile up)?

* From a roster/lineup decision standpoint, does the weekly schedule matter? In other words, would batching/not batching games give us time to adjust during the week, or are those decisions locked in at the beginning of the week regardless of how the games are run?

  • Like 1
Link to comment
Share on other sites

5 hours ago, Jieret said:

A couple questions:

* Are injuries and stamina considerations (AKA if I Cal Ripken someone they play worse over time they're worn down as more games pile up)?

* From a roster/lineup decision standpoint, does the weekly schedule matter? In other words, would batching/not batching games give us time to adjust during the week, or are those decisions locked in at the beginning of the week regardless of how the games are run?

As of right now, that mechanic between games is set up for all players, but the impact/tuning is only set up for pitchers to handle the motivation behind pacing appearances. If a season was run today position players could theoretically play 162 games just like their 1st game of the season. I'm working on setting that up right now, so some kind of position player game to game stamina will likely exist.

The hope with the pacing of games is that (if we go with a non-do-it-all-at-once approach) is that you would have time to adjust lineups between series.

It is unlikely that we'll set things to have between games inside of series, just from an admin (and opponent] sanity standpoint as some kind of snipping seems likely with swapping starting pitchers in/out.

  • Like 1
Link to comment
Share on other sites

With the rivalries, the Twins brewers is  a weird choice. but I guess understandable as the twins' rivals are within their division

Edited by Minnow
Link to comment
Share on other sites

1 hour ago, Minnow said:

With the rivalries, the Twins brewers is  a weird choice. but understandable as the twins rivals are within their division

Don't hate on me, hate on Manfred for that one.

  • Like 1
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...