Table Talk Tuning

Table Talk Tuning

4 min read
Part of the papers collection. Introductions to papers I have worked on, with some context for the research question and links to the paper and supporting material. See all 9 posts in the collection

Martin Butler and I needed to arrange the tables for a real wedding. Our ModRef 2026 paper No More Awkward Silences with Table Talk Tuning describes the MiniZinc model we built for that problem.

A seating plan can satisfy every capacity and grouping request and still leave someone with little to talk about. We ran into that problem while working on the real plan. The model therefore includes conversational fit in the assignment instead of leaving it for a final manual check.

The input records the available tables, their capacities, groups that should sit together or apart, and each guest’s interest in a set of conversation topics. The model assigns guests to tables; the exact seat order around each table is left for a later step.

The MiniZinc model#

The main artefact is a portable MiniZinc model of the complete problem. Its central decision is deliberately simple: one variable records the table assigned to each guest. A global cardinality constraint connects those assignments to table occupancy, while direct constraints handle groups that must sit together or apart.

The table-assignment variables and structural constraints
% Table assignment for each guest
array[Guests] of var Tables: table_of;
% Number of guests at each table
array[Tables] of var 0..max(table_capacities): occupancy;
constraint global_cardinality_closed(
table_of,
[table | table in Tables],
occupancy
);
constraint forall (table in Tables) (
occupancy[table] <= table_capacities[table]
);
constraint forall (group in same_table) (
forall (g1, g2 in group where g1 < g2) (
table_of[g1] = table_of[g2]
)
);
constraint forall (group in different_tables) (
forall (g1, g2 in group where g1 < g2) (
table_of[g1] != table_of[g2]
)
);

The hard constraints still leave many feasible plans. The model first prefers fewer empty seats, then less slack at the emptiest table and a lower total imbalance under its simple gender-balance measure. After that, it considers the weakest and total conversational scores. To compute those last two terms, it needs to decide whether a topic has enough support at a table.

Finding a supported topic for each guest#

For each guest, the model looks for a topic they care about that also has the support of a strict majority at their table. The objective first protects the guest with the weakest conversational connection, then improves the total interest across all guests.

The complete interest table from the paper provides the input for the running example. The first five guests are currently assigned to table 19. Farah, Niko, and Sana sit elsewhere, which helps show that these are individual interest scores rather than fixed guest clusters.

Guest interests in the running example

The highlighted row gives the strict-majority topic floor for the five guests at table 19.

GuestTableJazzHikingFoodGardenTravelGames
MinaTable 19935412
TheoTable 19865421
LeilaTable 19754312
OskarTable 19149221
PetraTable 19221811
Topic floorTable 19745411
FarahTable X623289
NikoTable Y234276
SanaTable Z332297
Jazz, food, and garden topic floors for five guests at table 19, showing the three guests that establish each majority-supported score

The figure pulls out the three topics that work best for at least one person at table 19. At a table of five, the topic floor is the third-highest guest score, which is the highest level supported by a strict majority. Mina, Theo, and Leila get 7 from jazz. Oskar instead gets 5 from food, while Petra gets 4 from gardening. One topic does not have to work for everybody. The model looks for a supported topic from each guest’s perspective.

In the MiniZinc model, base_interest contains the majority-supported score for each table and topic. The score available to a guest is capped by their own interest in that topic. Taking the maximum then gives each guest their best supported topic.

The best supported topic for each guest
array[Guests] of var int: best_table_interest = [
let {
array[Topics] of var int: table_interest = [
min(
base_interest[table_of[guest], topic],
guests[guest].interest[topic]
)
| topic in Topics
]
} in
max(table_interest)
| guest in Guests
];
var int: min_interest = min(best_table_interest);
var int: total_interest = sum(best_table_interest);

Five priorities, one objective#

Ordinary FlatZinc back ends accept one optimisation objective, but Table Talk Tuning has five priorities. The model combines them with mixed-radix weights. Each weight is large enough that an improvement at its level outweighs every possible change at all lower-priority levels. The single scalar objective therefore preserves the intended order.

The lexicographically ordered objective
var int: goal =
total_slack * total_slack_weight
+ max_slack * max_slack_weight
+ total_imbalance * imbalance_weight
+ min_interest_penalty * min_interest_weight
+ total_interest_penalty * total_interest_weight;
solve minimize goal;

We checked whether the conversation terms changed the seating by removing them, then evaluating both returned plans on the conversation measures. In 35 of the 45 synthetic cases, both versions returned a feasible seating within the 60-second limit. Among those paired cases, the full objective produced a better table-talk score in 28 and tied in seven. It was never worse on the conversation measures. Most of the difference came from total interest; minimum interest usually stayed fixed.

The paper also includes synthetic instances from 10 to 150 guests and a native Gecode implementation for comparing the MiniZinc model’s scalar objective with direct lexicographic and sequential optimisation. The complete portable MiniZinc model is available with this post.

The useful part of the model, for us, is that the conversation terms improve the seating without displacing the structural requests. The priorities make that tradeoff explicit, and the same setup can be adapted to other table-assignment problems. The paper describes the complete model and evaluation.