I know, I know! It’s been a very long time — I tell myself its because I only speak when I have something to say. Whatever gets you by right?
Anyway, over the past few weeks (very much off and on, more off than on) I’ve been working on an algorithm for building a schedule of teams for a league manager. What started out as something that I thought should have been very simple turned out to be much more complicated that I’d originally thought. I remember thinking “2 hours tops” — ever have one of those moments when you realize that you clearly weren’t thinking when you opened your big fat mouth?
Sure, some of you could probably write this in your sleep, but I did some googling, asked around a bit etc, and as it turns out, its not as easy as you might think. (Just google for league scheduling algorithm — better yet — let me google that for you). I think you’ll find that there are more lines of code than one would think and a number of people attempting to roll their own that have come running for help.
I found several good examples, but with many of them, the code wasn’t very reader-friendly. I found myself down so many dead ends and just about the time I thought “this is it, I’ve got it” I’d fall flat on my face again.
I walked away. (I did it on paper which turned out to pretty easy and how I came up with an algorithm that I was (and still am) sure I could use). However it bothered the living daylights out of me that I couldn’t solve the problem. I eventually left my afore mentioned algorithm behind and though I believe it’d be way more efficient and someday plan to figure out how to get it working, in the interest of getting something done — one of my mantras — I moved forward with an approach that I was making progress with. At long last, I had a schedule builder that I can use for the bocce league that I’ve been made captain of recently.
For those of you looking for code — I’m not going to show it for numerous reasons:
- Part of me still believes this should have been much simpler and frankly I’m embarrassed
- This sounds like it could be someone’s homework assignment and I’m not about to be giving any answers
- I may wind up using it in some actual software I’m working on
Overall, it comes down to be remembering to go back to the basics:
- Start small, solve only small problems. If you feel its a big problem, break it down into its smallest chunks and solve each chunk as its own problem.
- Use pseudo-code — my oh my when did I ever stop pseudo-coding things? So very helpful to break down the problem domain. (Note to self, is there a possible software solution here….hmmmm)
- Comment the living crap out of your code. When you walk away for a bit or get interrupted, you’ll be thankful. Many people say good code comments itself. I say “nay nay.” When you are solving an issue you’ve never solved before and had to google a few things, you wind up writing obscure bits of code or syntax that you’ll no doubt forget about and forget what purpose it served or what functionality it provided. Comments are still a very good thing. Anyone telling you different is plain wrong.
- Don’t be afraid to start over or delete code.
- Don’t be afraid to write something procedurally, at least at first. My solution was very much done procedurally. It was not OO or functional. After all, an algorithm is a recipe. A recipe is very procedural. Writing something procedural to solve a problem helped me a great deal in this case and provided me with a clearer understanding of the problem at hand and its solution.
Again, this is probably a very simple problem for some of you. For some reason, the solution eluded me for much longer that I’d like to admit. There is still one strange kink that I have to wrap a try/except block around and thats on my list to work out, (as well as providing support for bye-weeks) but at last its refreshing to see a schedule actually being built.
I’m really curious to see if anyone else has worked on this problem, or if anyone else would like to try working it out for themselves in their language of choice and them come back and provide their insight/feedback etc. I don’t expect you to show code since I didn’t even do that myself, but I’d love to hear your opinion on how easy/hard you found this to be. In the end, I fully expect to be an idiot here and its something very simple that just eluded me and if thats the case, I’m fine with it — sorta. But I’d love to find out if anyone else underestimated the issue. So if you wanna give it a try, here are the rules I had to work with:
- X number of teams over N number of weeks.
- In my league, each team plays each other only once. (This was the sticking point here, we had 8 teams, they wanted an 8-week season which means there has to be a bye-week, or you just play a 7-week season. Since they wanted 8 weeks, I have to add bye support in there. I’m still working on that. That being said, if you have 16 teams, you need at least a 15-week season, or 16 weeks and everyone has one bye week. Or you can have 8 teams, play each other twice for 14 weeks with two bye’s, etc which is something else I haven’t worked out yet but plan on doing).
There are a ton of edge cases, so let’s stick with the following: 8 teams, 7-weeks, everyone plays each-other once. Man…even saying it again makes it sound so simple but yet I found it so much more difficult that I expected. Wasn’t the hardest code I’ve ever had to come up with by a long shot, but was much more painful that I thought it should have been. Any takers?