I've been working on a tool to optimize seating charts for assigned seat events, such as weddings. I'm hoping this site will save people enough time and stress, to charge for the service for larger events.
At the moment, there's no login required, and the service saves no data.
Why?
* Save time, rearranging people automatically
* Help with politics of large gatherings
* Try moving people and quickly seeing how everything shakes out
Currently, it will try to optimize for:
* Keeping groups together as much as possible
* Use fewer total tables
* Keep people either together or apart, as indicated
Current Capabilities:
* Import guest list/table capacity information from Excel file (there's a template)
* Generate fake guest list to play around
* Dragging people to different tables and reoptimize
* Selecting sets of people who you want to keep together or apart
* Locking people to certain tables
* Edit history
On roadmap:
* Prioritizing people to seat at "better tables" (VIPs, close family, etc)
* Rearranging tables visually
What do you all think? Is this valuable? How's the UX?I haven't come up with a great name for it yet, so naming it "Better Seater" for now.
All feedback and suggestions welcome and appreciated! Let me know what would be useful for you!
However,
1. This is only an asymptotic argument. For "small" size, these problems can be tackled. People routinely solve this type of problem (namely: mixed-integer optimization problems), with up to hundreds of thousands of variables, to proven optimality, in a matter of minutes (see [1]). In this case, it looks like an assignment problem in which the number of variables would be (number of invitees) times (number of tables), so for up to 1000 invitees and 100 tables, there is a chance the problem can be solved optimally.
2. The O.P. is most likely looking heuristically for good solutions, not optimal ones. And I can't really blame them for that. Do we really care about optimality here?
You can keep trying harder from the state, just click again on the Optimize buttons.
I admit, I haven't optimized the optimizer yet.
But as the NP-hardness of that problem goes: Say you have 400 guests on 50 tables and you probably expect multiple solutions, you're looking at maybe 20K variables in a SAT encoding. That's an industrial scale SAT problem but very much not untractable.
The question is, whether we would usually expect a number of solutions in the thousands or whether we expect just a handful. I'd guess its the former, as many people on the "cheap tables" are really interchangeable and not subject to many constraints. So usually you'd looking at just a handful of tables and guests that are difficult to place. That begs the question whether the problem OP's trying to solve is really a problem people have difficulties solving (or isn't easily solved by adding a table or two).
In practice, the "optimal" solution depends on what you're optimizing for. In my case, it was maximizing the number of dogs that could board on any given night. This involved looking for open paths - since dogs can be moved around daily if necessary. Then rule out any based on the constraints: Prevent enemy conflict, limit to max occupancy, etc. After that, the preference is for boarding them in a kennel with a friend if possible, however there are trade-offs here in whether this creates too many extra moves... e.g. if a friend is coming in for one night of a dog's 7-night stay, we don't prefer to move. So the third priority, which occasionally overrides the second priority, is minimizing the number of moves which add work for employees. To do that, we look for the longest stretch open at each move branch, ranking them by number of friends descending, barring any with enemies.
As you can imagine, this was way too complicated and branching, so the system prunes the option tree at each necessary move down to a few dozen possibilities and continues down each of those paths, then ranks all the paths for the user to choose from.
In other words, a lot of the decisions for optimizing it (in the non-mathematical sense) were about limiting its output to a manageable number of reasonably good choices. Enemies create a hard limit on the number of spots available. Friends are optional (but good for business).
Yes.
>and basically unsolvable for more than a couple preferences?
Our PerfectTablePlan table planner can optimize seating for thousands of guests with thousands of preference constraints (between individuals and groups) on a standard desktop PC/Mac. It uses a genetic algorithm to quickly produce a 'good enough' (but not guaranteed to be optimal) solution. For seating plans it isn't really clear what the optimum is anyway. It is more important that than Bob sits next to Jill or not next to Jack or not next to an empty seats? Debatable.
1. Versions matter - she'd often make a draft and want to tell me "ok tell me if you like this better than the previous version". Id just compare the cells above to the cells below.
2. We organized people based on common interests - these people are very into music, these are very into home renovations, these people work in tech...etc. Tagging people with "attributes" and letting the system try optimize for as much overlap as possible would have been amazing.
3. Warn me of duplicates - sometimes in the copy paste madeness, we'd double up someone.
4. Import - We almost missed someone due to me skipping a line in the initial transription of their name into the spreadsheet.
5. At the end of the day guests need to find their seat. I made a QR code that linked to a website where people could type their name to find their table (https://andrewmcgrath.info/wedding) we didn't want to use a big board, it was 1 more thing to make (the website was a 2 hr project i did the day before) and the QR codes were just print outs we put in dollar store photo frames at the entrance, the bar and at the end of the day...we got great feedback over this. With the guest lists, you could easily automate making someone this website.
Good luck!
So yeah all to say, you’re right and it’s very unique for each gathering and its audience as to which approach you should take.
With the exception of people who would throw hands at each other, this actually doesn't seem like an awful idea.
I agree with versions mattering. At the top, there's every version right now. Probably needs better UX.
Yea, I agree with adding attributes. I wasn't sure if most people would understand that UX. But it's on the roadmap, in lieu of groups.
Yep, dupes are definitely a thing. There's lots of places where everyone has the same names, though, so it could get annoying. Think Bali (5 names cycled), Korea (everyone's last name is similar). I haven't worked on this UX yet.
Great idea with the QR code generator! I'll have to look into this feature.
Interesting point about duplicates and names. We had a lot of Andrew's (including me) but we didn't have any identical matches if we included last names (which fortunatly everyone had). I guess as long as you can acknowledge them and have the warnings go away that would be enough.
Checkout the UX of the auto-complete for that website i made. My goal was so it would basically find your table as quick as possible, and the website is designed only for phones as i assumed the number of guests that brought a laptop would be somewhat limited :P
I considered turning that website into it's own little startup, but frankly, the idea of running a business with no repeat customers (or...with a duration between purchases so low that i'd basically be acquiring them every time) was not very attractive to me. Then again, everything else i've worked on in between has been worthless, so i might as well have haha!
At the weddings I've been at (usually 100-150 guests), there would be families and relatives of the groom and bride, then their school friends, church friends, university friends, etc. - anything up to a dozen different groups of people who know each other but not the other guests. So a seating plan allows these friends to enjoy the party together. It doesn't prohibit them from getting to know the other guests, but offers a bit of a safe space with people the hosts know they will get along with.
(Additionally, in many cases, these groups of friends may not have seen each other for several years, e.g. since their school days, and appreciate the opportunity to catch up.)
The trick is to combine guidance with a relaxed atmosphere where it's fine to ignore it. Your dress code might say "black tie", but it's great if someone turns up in jeans because that's what makes them comfortable.
Hope that makes sense!
[1]And even within countries. I believe it varies from state to state in the US.
It was a generalized banquet hall/dinner/wedding seating chart.
The one that I was looking to write involved the following specs:
- friends and +1s sit together
- guests could sign up as a "group" (Tom's group) and sit together
- cluster people from the same area, or not even close to the same area
- some guests need to be prioritized as close to the front of the room/stage/guest(s)-of-honor
These were very difficult specs to satisfy and not getting it right was not an option since folks were paying $50 a plate with ~600 guests. The solution has always been to do it by hand.
Also, thanks for the specs. I was thinking of some of those things, but really glad to hear how you thought about it!
I haven't clustered people together yet in terms of physical location, because I don't have a way to express table locations yet in the UI. Trying to keep it "just simple enough". But I know it's important for many people.
If you have any more insights, I would love to hear it!
Hey, maybe a use case for Dwave? j/k.
You can probably write a basic planner in under an hour with all the constraints you can think of. You can just continue to fiddle with the constraints and weights until you are happy without having to worry about duplicates or errors.
I’ve used it to solve cost optimization problems for companies I’ve worked with and it works really well.
Someone did an wedding seating planning implementation 10 years ago: https://github.com/juanignaciosl/wedding-tables-planner but that's going to be very stale (still DRL files etc). It's probably better to start from the school-timetabling use-case in timefold-quickstarts and adjust that to your needs.
Looking at the website and seeing Tables numbered less than ten by default, I realized this targets people who invite their best friends and relatives and strictly choose who they want to see at their events.
One of my friend’s father was that uncle. I once asked him how he knows everything and can organize everything. He writes a lot and writes them down and refers to those writing when he thinks. If I asked him something, he is thinking about his notes in the back of his mind. Once, he gave me directions to go and send out over 50 paper invitation cards. My journey was precise and in perfect sequence, including the cow traps to avoid, the gates I might encounter, and the homes with dogs (so I call out before entering). This is in the 90s, with no phone, while I ride a bicycle to deliver those invites with no marked address on roads I had never traveled, in an Indian rural town.
Thanks for giving the tool a try!
https://www.perfecttableplan.com/
Anyway, we used it to get _most_ of the way there, but ultimately reverted to hand crafting stuff at the end. For us there were many constraints that were vague feelings, only coming to light when we had a plan in front of us, and if you end up doing many rounds of tweaks you lose any real efficiency gain from using software.
I agree that it takes some iteration, and that's why the UI is meant to help tweaking, and testing new ideas. You can lock people in place and keep tweaking, and go back in your work.
Btw, how many people attended your wedding when you used Perfect Table Plan?
Still spent too much on everything, should have just blown off the fancy ceremony and drove to Vegas :)
* 120 guests: 49 couples and 22 singles
* To be seated at 11-ish tables of 8, 10, 12 people each (by combining 4- and 6-person tables)
* Couples must be seated at the same table
* Plan only needs to say which guests sit at which tables - individual placement at the table will be decided just-in-time by the people putting the name cards down on the day
* It's hard for me to give labels to the guests to give you an idea of who can form a nice table and who can't. It's like, complicated, but I know a good table when I see one.
I made a spreadsheet-based app [1] where I first entered couples and singles into rows and then left blank rows as table separators. On the blank rows I put a "table capacity" number (8, 10 or 12), and on the guest rows I put a formula to compute "remaining table capacity", using conditional formatting to highlight tables where there are too many guests and tables where there are still seats available. By dragging rows around I can quickly rearrange the plan, and the spreadsheet doesn't do much except tell me where the plan is currently "broken" due to overfull tables.
If I compare my requirements with the Better Seater interface, what I'm missing is a way to keep couples together always - I don't want to make a new "group" name for each couple and I don't want to drag twice to move a couple. I haven't tried it with 120 guests, but I'm curious what sort of guestlist size you're aiming for.
[1] https://docs.google.com/spreadsheets/d/1ciib95VBI1YE9KFfPZAp...
With the spreadsheet, you can just put couples as single guest (+1 = 2 party size). So you can put a whole family as (Person+3) or something. See the template.
The "couple" was really the wedding couple as example.
I'm optimizing for probably 100+ guests.
Hope that makes sense!
Prioritization of parties is on the roadmap, related to table ranking. Were you thinking of prioritization in a different manner?
How were you thinking about "someone getting left out"?
Thanks for the thoughts!
So many (imagined) social conditions here. Like A likes B, but B hates A. C and D should meet. E and F are a couple, but F and G broke up in college so it's awkward. H and I are divorced but still on good terms so it's OK. etc.
How do you do that on a circular table? Or are you suggesting some sort of handness aparatheid, with all the lefties on one table?
Similar to hermitcrab's comment, I'm not sure about the right/left handed-ness. As I'm currently at table level, rather than seat level, I think it's something that can be figured out at the table level later.
Thanks for the feedback!
But other stakeholders, cough cough in laws cough, quickly demanded direct allocation.
But that's just my situation, I'm sure for younger folk or weddings where the couple has stronger say would be a good tool to have!
There were just too many constraints for it to be feasible as a web app in our case. Examples of some of those constraints that make it difficult:
* different table sizes, each with a min. and max. seats
* every table has a "head of table", which has to face the bridal couple
* we preferred couples/genders were mixed at every table, not sitting next to each other
* people who must/should/definitely shouldn't sit at the same table
* distances between people mattered: certain groups should be closer/further away from each other
* distances to the main table mattered
* the exact location of the table mattered (for example, older people should have more room/closer to the toilet/away from the dance floor)
It might seem like overengineering to some :) But in the end, it didn't take us too much time to make the layout: we just printed out all the names, and laid them out physically. Then we used that physical layout at the entrance to show people where they are seated. Most of the work was actually cutting out the names, finding them in the pile, physically placing them, ... So I guess if someone just made a beautiful drag-and-drop UI and let the user do the optimization work, and ignore implementing all the "smart stuff", that would work for many people. I guess you could even monetize it by allowing people to print out the layouts in a beautiful way (engraved in wood or whatever) and have it shipped.
(edit: damn it's annoying that HN doesn't support fully markdown for bullet point lists)
This already has different table sizes.
There's already a way to mark who should/not sit together
For location, I'm thinking of adding a draggable UI to put tables in relative places. But at first, I don't want to make this too complex for people to use.
Also, thinking of adding attributes to both groups and tables to get people to what they need (bathrooms, dance floor etc).
There's definitely already lots of apps/sites that let people do the pretty stuff, but they seem really manual at the moment.
Let me know if you have any more thoughts! Thanks for looking!
I definitely think you need to work on the UX if you want want to make on it
Some ideas:
- Let me drag out guests to tables and then optimize around what I've done so far. It looks like optimize wipes the slate clean each time.
- You might consider letting people pick how many seats should be at each table with a +- tolerance.
- People really like seeing seat numbers, whether globally or local to a table.
- If you clean up the UI a bit this could also be something people print out for a reference chart at events.
Automatic seating has been one of the more common feature requests of my own seating chart app, seatpuzzle.com, but I haven't quite gotten around to modeling the right parameters and prioritized a different set of things instead.
FYI you can lock people to the tables and it optimizes around it already. Just click on the lock icon.
Interesting idea on the tolerances.
Right now I'm not putting in specific seat numbers yet. You just mean number them for UX purposes?
How's seatpuzzle.com doing? Looks like a cool app!
One question/comment. As you already know, finding the absolute mathematically, optimal solution is hard, if not impossible in a reasonable amount of time, but people don’t care, they just want good enough. Found with classroom placements is that people can put in all the information, get an answer that is very close to optimal (mathematically), And then take one look at it, and know something is off, because you can’t actually model every aspect of the real world. so what I started doing giving good solutions that are pretty different from each other. Teachers can usually take a look for 30 seconds or less and decide that one of them is better than the other. Do you have the ability to do this on your tool? To randomly shuffle and optimize from there?
If you click on the Optimize, it's already a shuffling. I could add shuffling from there, but it really won't affect optimization too much, as the underlying state is similar.
I can definitely add randomization for fun, but I'm not sure how many people will use it yet. Trying to keep buttons to a minimum at first.
Have a link to your tool?
The other thing not intuitive is that I was dragging people over to the tables instead of using the 'optimize' button. Which kinda defeats the point. But I figured that out eventually.
I will say, my family lacks drama so it's not so much I need to keep certain people away from each other as I just want to figure out who might want to talk the most to who.
Sorry for the lack of docs. Try the "Import Guestlist" button. There's a template there as an example.
There's no UI right now for adjusting the guest list. You can only import from the template, saved as an Excel file.
If there's any features you need, please feel free to write either here or to my email.
Person notorious to get drunk was out of sight of the bar.
Person with medical problem close to the toilets.
Young nephew prone to pick candy from jar was diagonally seated to a candy jar, because the whole family loves to see al the strange ploys he came up with to 'randomly' pass the jar and take a candy. Yes we love him :-)
We also seated groups according to preferred language as a secondary constraint, so we had Dutch/French/German/English corners of the room.
I'll definitely have to think about how to incorporate such things in a simple to use manner.
How many people are attending? Please feel free to use this tool if it happens to work for you. Would love to hear if you actually do use this.
But get some rest, and enjoy tomorrow!
Also, for now, you can lock certain people to certain tables and then Optimize again.
I appreciate the feedback!