This program is a simulation of a day's traffic flow through a polling place. It is based on simple queueing theory
and data from research projects regarding polling places and elections. Each time you run the simulation, voters arrive
randomly within a pattern based on data collected at polling places. There is a randomness involved, just as in reality.
But as you will see, the randomness approximates the typical daily flow found at polling places, which should give you
an accurate range of possible wait times that might develop.
The basic design simulates a polling place with a number of check-in stations (or just one), where the first line will
form. Then there is a number of voting stations, for which the second line will form.
Optionally, the simulation will handle same-day registration stations. The assumption is that arriving voters will
be directed to a check-in station if already registered, or a registration station if not. Both of those lines will feed
into the voting station line as the check-in or registration tasks are completed.
For those using optical-scan ballots, we did not yet simulate a potential final queue for people waiting to
scan their completed ballots. That is an option we can handle if we hear there is a need for this.
You will quickly discover that waiting times are surprisingly sensitive to the average amount of time to check-in and the
average time to complete a ballot.
As you know, time to complete a ballot depends greatly on the length and make-up of the
ballot. The voting technology used also has a minor impact. We can only provide a starting point for ballot completion time;
you must provide a reasonably accurate estimate for each election for this simulation to give you somewhat accurate
estimates of potential waiting times in return.
Likewise, the average amount of time to check-in depends on the process used and the people staffing that step.
When setting this value, remember to not assume that every voter will check in smoothly, using a number for the
amount of time it ought to normally take. If one out of every ten voters takes a couple extra minutes to
check in because of some issue, that will affect your average check-in time.
Simulating All Your Precincts
When you upload a list of all your precincts (from an Excel spreadsheet or a similar source), along with turnout
estimates and resource deployment, you can run this simulation across all precincts at once to see which
have potential problems. A new table will appear at the bottom of the page with stats for each precinct, which can
then be sorted on any field and on which adjustments can be made. See the Load your own data section of
this help page for details.
Feedback, Suggestions, and Critiques
This simulation was written by Mark Pelczarski. Questions, comments, suggestions, and pleas for
help are welcome. E-mail Mark here.
The Five Key Inputs
Above the simulation graph you will see inputs for Expected Voters, Check-in Stations,
and Voting Stations. Below the graph are inputs for Average Minutes to Check in and
Average Minutes to Vote. These are the 5 values that will have the greatest effect on the
waiting times shown by the simulation.
Expected Voters is the number of voters expected to vote in person that day. Absentee and early
voters should not be included in this number. Although designed by default for election-day voting, potential
waiting times during early-vote days can also be simulated if you can estimate the turnout for the day in question.
The number of check-in stations and the number of voting stations are your inputs for the resources
you deploy. For our purposes, the way lines may be split for check-in stations won't matter much; the average
wait times will only differ when a polling place is relatively quiet and some check-in stations are open while others
have a short wait. During busy times when all check-in stations are in use, the average waiting time is not affected.
Minutes to Check in and Minutes to Vote are critical values for which you should supply
realistic values. It would be very worthwhile to take some sample times if you are able to do so prior to an
election, once the ballot is known. If you are able to research and document your own check-in and voting times,
it would be very useful if you could share your results (with a sample of your ballot for the voting time) so we
can perhaps refine this simulation with more predictive data.
What You See on the Graph
Each time you run the simulation, you will see the resulting average, maximum, and minimum wait times throughout
the day. The graph shows the time of day, from left to right. The height of the graph shows the waiting-time results.
The yellow area in the graph is the waiting time for the check-in stations. The violet area is the waiting time
for the voting stations. The total height of the graph at any time of day is the average total waiting time for
people who arrive at that time. (The solid line is the average; the dotted lines show the shortest and longest
waits. See the Settings section of this help document for more explanation.)
To see less yellow, add check-in stations or decrease the average check-in time. To see less violet, add voting
stations or decrease the average time to complete a ballot.
It's a Simulation
Instead of a straight mathematical computation which gives consistent results, this simulation gets a little
closer to reality by randomizing voter arrival within certain constraints each time you run it. If you click the
Run Simulation button again without changing any values, you will get slightly different results each time.
That's because of the random factor, and that's more like reality. Simply put, if just two people arrive 5 minutes
apart, neither will have to wait and the average wait time for those two people is zero. But if those same two
people arrive at exactly the same time (and there's just one check-in station), one of those two will wait,
and thus the "average" wait time is longer.
The dotted lines on the graph for the minimum and maximum wait times give you an idea of the range of possible
outcomes with the same data.
You can also set the times that the polls open and close. This will compress or spread out the arrivals, and thus
have some effect on the waiting times.
Below the graph, you can select an Arrival Pattern. These patterns were derived from arrival data sampled at
numerous polling places during several election cycles. (See the Settings section of this help document for
how you can view the arrival patterns on the graph.) Unless you use the "Saturday: steady" pattern, which perhaps
might describe a Saturday during early voting, the default "Composite" pattern gives a good indication of potential
wait times, although the time of day that waiting develops could vary with the arrival pattern of each particular
The Cannot check in value describes a percentage of voters who are unable to check in for some reason, and thus
do not move on to the voting queue.
The Simulate Walk-Offs checkbox adds a feature that "predicts" a possible number of voters who see that a line
of some length has formed and they choose to leave rather than wait. The longer the line gets, more potential voters
will walk off instead of wait. These projections are based on results of Marist polls that asked voters how long
they'd be willing to wait in line to vote prior to recent general elections. Since these numbers are based on what people said
vs. observations of what they actually did (which is probably impossible to accurately measure), the "Walk-off"
predictions should be taken in context: they will be indications that something might be terribly wrong, but
they should not be taken as accurate predictions of lost voters.
Looking at the Simulation Settings
If you want to dig deeper into how this simulation works, at the bottom of the page click on Show Simulation Settings
and more options will appear just below that. Here's where you can see a little more of the nitty-gritty of how
Number of Repetitions is how many times the simulation actually runs through a day randomly before giving you
its results. It simulates the same voting day with the same input data 20 different times (by default) with 20 random sets
of arrivals before computing the averages and telling you the maximum and minimum waits that it found. If you change "20" to "1"
and click the Run Simulation button over and over, you'll see just a single attempt at the simulation each time,
and the results will vary more. If you change it to "100", the computer might take a little longer running through
100 simulations of the same day, but your average will be more accurate and your minimum and maximum values will
The Show Range checkbox turns off and on those dotted gray lines that display the minimum and maximum results.
A less-cluttered graph is prettier; but it tells you less.
Lines are formed when a lot of people arrive around the same time of day. If they'd only cooperate and space themselves
out evenly throughout the day, our lives would be much simpler. But they don't.
Check Show Arrival Pattern to see a new gray line through the middle of your graph that displays the arrival
pattern used from the Arrival Pattern choice given above and discussed earlier. ("Composite" was the default.)
The right side of your graph shows a new set of numbers for that gray line. Those percentages are the percentage of
voters who show up during each 15-minute interval using this pattern. If you're looking at the "Composite" pattern,
you'll see that about 3% of the day's voters are expected to arrive around 5:30-5:45pm. Likewise, slightly more than
3% are likely to show up around 7:15am, whereas only 1.25% show up around 8:30am in this same pattern. This doesn't mean that
those are the exact percentages that will occur when you run the simulation. Those likelihoods inform the randomness, but
the arrivals are still random.
To get an even more accurate picture of what's going on, click Show Arrivals Used and set the
Number of Repetitions to "1", then click the Run Simulation button. A new green line appears that shows
the times that our simulated voters actually arrived. The graph of that green line looks a lot more like the data
that was collected while recording actual arrivals at polling places, which is to say that real people don't conveniently
follow our exact mathematical models. Click Run Simulation several more times
and watch how that green line changes. This is what we're actually feeding into the simulation to make our "wait time"
But notice also how the green line somewhat approximates the gray line that is the pattern we're using. That gray line
was derived from actual data that looked like all those green lines you just clicked through. Change
Number of Repetitions back to "20" and click Run Simulation again and you'll see that after 20 repetitions
the aggregate random arrivals approximate our pattern more closely.
And if all this random stuff bothers you, click Arrivals Follow Pattern and then even with only 1 repetition
you'll see that our simulated voters behave exactly like the pattern predicts.
Using your own data
If you create a table in an Excel spreadsheet (or similar application) with columns for precinct names,
turnout estimates, number of check-in stations, and number of voting stations, you can then save that spreadsheet
in a format that you can load right into the simulation and run then run the simulation across all precincts at once.
When you do so, a new table appears at the bottom of the simulation page with every precinct in your list
and predicted wait times and possible walk-offs for each. You can adjust the number of check-in stations and voting
stations for each and get immediate feedback about the potential results. You can then download the alterations and
feed them back into Excel or another program to remember your settings and adjustments.
Creating the data
We'll talk about the Excel spreadsheet application here, but any program that can create "tab-delimited text files"
or "CSV files" can be used.
The first row of your spreadsheet will be headings that MUST match the names we list here, because the simulation will
look for exactly those headings when it reads the file you load in. The order of the columns does not matter at all.
Only the headings are used for putting your data in the right place.
The only required heading and column is "Precinct". In this column you will list the names or designations you want to use
for each precinct you'll want to run in the simulation. Please avoid commas in those names, since commas will mess up
our use of the CSV file format.
All other columns are optional, although if omitted we'll add default values that you'll almost certainly want to
change, and it's probably faster for you to do that in your spreadsheet. The additional and optional column headings are:
"County", "Turnout", "Minutes to Vote", "Check-in Stations", "Voting Stations", "Registration", and "Registration Stations".
"County" is for grouping precincts by county when using this on a larger scale. However it can also be used to create
named subsets of your precincts if you have many and want to work with smaller sets. A "county" list will appear, and
when you select a "county" only the precincts within that county will be shown in the precinct list and in the table at
the bottom of the page.
"Turnout" is the number of in-person voters expected on the election day. You should not include absentee and early voters
in this number, nor should this be the total number of registered voters. However you may choose to use a "Registered Voters"
column in your spreadsheet (which will be ignored by the simulation) and put a computation in the "Turnout" column that
will compute some percentage of your registered voters that you estimate will vote in-person on election day. You can
also use "Turnout" to simulate arrivals on an early-voting day.
"Check-in Stations" and "Voting Stations" should be the number of each that you plan to deploy in each precinct. Again,
you might want to use other columns in your spreadsheet (that we'll ignore if the headings are not what we look for) and
then insert a calculation under these two columns. Some places calculate the number of voting booths for each precinct
using a formula based on the number of registered voters, and something like that could be appropriate here.
If you do not supply columns with headings for "Check-in Stations" and "Voting Stations", we'll use our own
calculation to suggest a starting point for what you might want to supply.
"Minutes to Vote" can be set for all your precincts directly in the application. However, if you know you have
different ballot lengths across your precincts, you might want to assign different times here for precincts. Please
enter your values in minutes and fractions thereof. For example, don't use "4:30" for "4 minutes and 30 seconds".
Instead, use "4.5".
Time to check-in and time to register should be relatively consistent across precincts, so those values should
be set directly in the simulation.
For those states that allow same-day registration, if you add a column titled "Registration", that will be the
number of voters (already included in "Turnout") that you will expect to show up on election day who need to
register. This will automatically put the simulation in same-day registration mode, adding a registration line in
addition to the normal check-in lines. The assumption is that voters going through same-day registration will
proceed directly to the voting line after registration and that those voters will never wait in the regular
check-in lines. Again, you might want to create your numbers in this column on a computation based on other columns,
such as "16% of my turnout on election day will need to register" (translated to Excel formulas, of course).
Use a column titled "Registration Stations" if you want to specify the number of registration stations in each
precinct. Otherwise we will use our own computation to suggest a number.
Saving your spreadsheet to use in the simulation
When you've completed your spreadsheet, save it once in regular Excel format if you've used formulas and you want
to be able to edit it with those same formulas. Then choose "Save As" followed by "Save As Type" and select
"Text (Tab delimited)". Alternately you can use "CSV (Comma delimited)", but only if you've managed to avoid using
commas in your data.
Load your data into the simulation
Near the top of the simulation there is a Load Precinct Data button. Click it. Choose the tab-delimited or
CSV file that you saved. Click Okay.
If all went correctly, you should now see new County and Precinct lists at the top of the simulation.
If you select a precinct from the list, the Expected Voters, Check-in Stations, and Voting Stations
values for that precinct should appear from the data you provided. Remember to set Minutes to Check-in and
Minutes to Vote, if you did not provide that in your spreadsheet.
Precinct data table
Scroll to the bottom of the simulation and you'll see a new choice, Edit Precinct Data. Click that, and a table will
appear below with a list of all your precincts, and columns for check-in stations, voting stations, wait time, and
walk-offs. Above the table is a button that says Compute Wait Times. Click that and the simulation will be run
for each precinct and the longest average wait time shown for each. At the top of the table you can click the Precinct,
Wait, or Walkoff column heading to sort the table by that column.
You can also edit the numbers in the Check-in and Voting station columns to recompute the longest average
wait time for that row with the new values. These changes will be remembered, and you can click the Download Current
Data button at the top of the simulation to save your changes back to a CSV file that will load right back into Excel.
Note that changes made to Check-in Stations and Voting Stations above the simulation graph (near the top
of the page) are exploratory only and are NOT recorded in the precinct table at the bottom. If you want to save new values
for check-in and voting stations, you should change the values in the table instead.