Classwork 3
Five Fishing Setups: Catch, Dock Prices, and Fish Left for Next Year
Bring one internet-connected device. Your instructor will give you a boat code, fishing-group number, and group size. Use the same information every year. Submit only after the instructor announces the current fishing setup and year.
Your job
The same boats fish in separate ponds and in a shared bay under different rules.
You run a small fishing boat that sells its catch to local restaurants at your group’s local dock.
Your instructor will give you a boat code from A01 through A32. The code represents your boat—do not enter your name. You will join one fishing group of 3–5 boats and stay with that group for all ten choices.
The boat with the lowest number in each group is the stock keeper. For example, if a group contains A04, A08, A12, and A19, A04 records the group’s announced dock price and fish left for the next year. If that student is absent, the next-lowest number takes the role.
You will make ten choices that count toward the prize: two fishing years in each of five fishing setups. Fish grow in the same way and the dock uses the same price rule every time. What changes is who receives the value of fish left for the future and how the shared-bay rule works.
This is a classroom game, not a research study. The projected results use boat codes rather than names.
Rules used in every fishing setup
- Stay in the same fishing group of 3–5 boats.
- Each fishing setup lasts two years.
- Every fishing setup begins with 9 fish per boat.
- With 3 boats, the group’s starting fish stock is 27 fish.
- With 4 boats, the group’s starting fish stock is 36 fish.
- With 5 boats, the group’s starting fish stock is 45 fish.
- In Your Own Pond, each boat begins with 9 fish in its own pond; the group total is still 27, 36, or 45 fish.
- Before each year, nature adds 2 fish per boat. More boats mean that the group was assigned a proportionally larger body of water; boats do not make fish grow.
- Choose a catch from 0 through 5 fish without showing it to other boats.
- The dock reveals the price after every boat in the group submits.
- Fish left after Year 2 earn future-season bonus points.
- Do not discuss your catch while students are making a yearly choice.
- Everyone plays the same fishing setup and year at the same time.
- Before Setup 3, each group chooses one maximum of 1, 2, or 3 fish per boat. The same maximum applies in Setups 3–5; a tie or no decision means 2 fish.
The dock market
The boats make separate catch choices. Together, those choices determine how many fish the group brings to its local dock. The dock price depends on average catch per boat:
\text{dock price}=10-\text{average catch per boat in your group}.
| Average catch per boat | Dock price per fish |
|---|---|
| 0 | 10 points |
| 1 | 9 points |
| 2 | 8 points |
| 3 | 7 points |
| 4 | 6 points |
| 5 | 5 points |
The boats are the sellers, and their total group catch is the quantity supplied. Restaurants are the buyers. The dock-price rule represents the restaurants’ demand curve. After the boats choose how many fish to bring, the dock reads the price from that fixed demand curve. At that price, the restaurants’ quantity demanded equals the group’s catch. More catch therefore moves the market down the same demand curve; it does not mean that the cost of catching fish has changed.
The catch-cost schedule below represents the boats’ marginal cost. Because boats choose their catches before the dock reveals the price—and their choices also affect future fish—the result need not be the competitive outcome where marginal benefit equals marginal cost.
Each fishing group represents a different local market, so groups may receive different prices when their average catches differ. Groups with the same average catch receive the same price. After each year, the instructor will show each group’s catch and ask you to predict the direction of its price change before revealing the price.
How the number of fish changes
When a group fishes one body of water, let F_t be the fish at the beginning of year t, before new fish are added. Let n be the number of boats and H_t be the number of fish they catch together. The next year’s fish are
F_{t+1}=F_t+2n-H_t.
Four boats begin a year with 36 fish. Nature adds 8 and the boats catch 12, leaving
36+8-12=32
fish for the next year.
Points and real-dollar prizes
The next fish is increasingly costly to catch. The first fish costs 1 point, the second adds 2 more points, the third adds 3 more, and so on.
| Your catch | Your catch cost | Your catch points for the year |
|---|---|---|
| 0 | 0 points | 0 |
| 1 | 1 point | \text{dock price}-1 |
| 2 | 3 points | 2\times\text{dock price}-3 |
| 3 | 6 points | 3\times\text{dock price}-6 |
| 4 | 10 points | 4\times\text{dock price}-10 |
| 5 | 15 points | 5\times\text{dock price}-15 |
Four boats bring 12 fish to the dock, so average catch is 12/4=3 fish per boat. The price is 10-3=7 points per fish. A boat that caught 3 fish earns 3(7)-6=15 catch points that year.
Your game points equal your catch points from all ten choices, minus any inspection penalties, plus your future-season bonuses from the five fishing setups.
Because the activity ended before every group completed all ten choices, the instructor will draw two boat codes using the number of distinct submissions as weights. Each boat can earn at most one unit of weight for each setup and year, so submitting the same setup-year more than once does not increase its weight. The two codes are sampled without replacement. For each selected code,
\text{payment}=\max\left(\$0,\ \min\left(\$10,\ \frac{\text{total game points}}{30}\text{ dollars}\right)\right).
For example, 210 points pays $7.00; 300 points or more pays the $10 maximum.
A boat with more distinct setup-year submissions has a larger chance of being selected. The reproducible draw and the adapted payoff calculation appear near the end of this page.
How these results are constructed
For each boat, fishing setup, and year, the analysis uses that boat’s last submission by server sequence. It does so whether the final row says accepted or not accepted and regardless of the validation message. The winner draw below also ignores validation messages; its weight counts each distinct boat–setup–year combination only once.
The raw file contains 221 attempts from 26 boats in 6 groups. Selecting one last row per boat-setup-year leaves 162 choices. Of these, 33 final rows were marked not accepted, but they remain in this descriptive analysis as requested. All selected final rows contain a usable group size and catch. Boat codes are matched to their group from Setup 1, Year 1. 1 later row reports a different group number; its final catch is retained but assigned to that boat’s opening group.
For the prize calculation, average catch uses only the boats with a usable last submission in that group-year. If one boat submits a catch of 3 while the other boats have no row, average catch is 3 and the dock price is 10-3=7. If all four boats submit catches of 3, 0, 0, and 0, average catch is 3/4 and the dock price is 10-3/4=9.25. A missing boat is excluded rather than counted as a zero-catch boat.
Across the five setups, 22 of 60 possible group-years contain a last submission from every expected boat. All usable last choices appear in the debrief catch charts. The prize calculation can use an incomplete group-year, while the fish-stock statistics below still require a complete preceding group-year.
The five fishing setups
1. Your Own Pond
- You manage a separate pond that begins with 9 fish.
- Only your catch changes your pond, and nature adds 2 fish to it each year.
- After Year 2, every fish left in your pond is worth 4 points to you.
If f_{i,t} is the fish in your pond at the beginning of the year and h_{i,t} is your catch, then
f_{i,t+1}=f_{i,t}+2-h_{i,t}.
Year 1 starts at 9. For Year 2, the response sheet uses your own accepted Year 1 catch. You do not enter or calculate this number during the game.
Debrief
Catch choices across the five setups
Across all final recorded choices, the Year 1 mean ranges from 2.43 fish in 3. Shared Bay, Group Limit, No Checks to 3.12 fish in 2. Shared Bay, No Catch Limit. In Year 2, it ranges from 2.00 fish in 4. Shared Bay, Group Limit, Random Checks to 2.60 fish in 1. Your Own Pond. Mean catch is lower in Year 2 in all four shared-water setups; the separate-pond mean is the exception and rises slightly.
The slope chart shows the overall direction, while a paired calculation gives the cleaner comparison because it uses the same boats in both years. The strongest paired decrease appears in the Shared Bay with no catch limit: mean catch falls from 3.22 to 2.43, and 15 of 23 paired boats reduce their catch. The other shared-water setups also have lower paired means in Year 2. These declines are consistent with a possible concern about depletion when first-year catch exceeded the natural growth of 2 fish per boat, but they do not prove that depletion caused the changes.
Only 4 boats in Setting 4 and 3 boats in Setting 5 have a last choice in both years. Moreover, all 6 Year 2 rows in Setting 4 and all 6 Year 2 rows in Setting 5 were marked not accepted. The analysis retains them because it follows the requested last-submission rule. Small, changing samples and the fixed order of the setups mean these patterns are descriptive rather than causal class comparisons.
Catch descriptive statistics by setup and year
Each observation is one boat’s final usable catch for a setup and year. The table retains those choices regardless of the validation message, consistent with the charts above.
| Setting | Year | Choices | Mean | SD | Median | IQR | Range |
|---|---|---|---|---|---|---|---|
| 1. Your Own Pond | Year 1 | 26 | 2.46 | 0.76 | 2 | 2.00–3.00 | 1–4 |
| 1. Your Own Pond | Year 2 | 20 | 2.60 | 0.75 | 3 | 2.00–3.00 | 1–4 |
| 2. Shared Bay, No Catch Limit | Year 1 | 25 | 3.12 | 0.93 | 3 | 3.00–4.00 | 1–5 |
| 2. Shared Bay, No Catch Limit | Year 2 | 24 | 2.46 | 0.83 | 2 | 2.00–3.00 | 1–4 |
| 3. Shared Bay, Group Limit, No Checks | Year 1 | 23 | 2.43 | 0.99 | 2 | 2.00–3.00 | 0–5 |
| 3. Shared Bay, Group Limit, No Checks | Year 2 | 17 | 2.35 | 0.79 | 2 | 2.00–3.00 | 1–4 |
| 4. Shared Bay, Group Limit, Random Checks | Year 1 | 12 | 2.92 | 0.90 | 3 | 2.00–3.00 | 2–5 |
| 4. Shared Bay, Group Limit, Random Checks | Year 2 | 6 | 2.00 | 1.10 | 2 | 2.00–2.75 | 0–3 |
| 5. Shared Bay, Limit Enforced at the Dock | Year 1 | 3 | 2.67 | 0.58 | 3 | 2.50–3.00 | 2–3 |
| 5. Shared Bay, Limit Enforced at the Dock | Year 2 | 6 | 2.00 | 1.10 | 2 | 2.00–2.75 | 0–3 |
Fish stock entering Year 2
The table describes the fish stock entering Year 2, before nature adds that year’s 2 fish per boat. For Your Own Pond, each observation is an individual pond. For the shared-water setups, the stock is known only when all boats submitted in Year 1, so each observation is a complete group and the table reports stock per boat. A value below the 9-fish reset benchmark means the Year 1 catch exceeded that year’s natural growth.
| Setting | Unit | Observations | Boats represented | Mean stock per boat | SD | Median | IQR | Range |
|---|---|---|---|---|---|---|---|---|
| 1. Your Own Pond | Individual ponds | 26 | 26 | 8.54 | 0.76 | 9.00 | 8.00–9.00 | 7.00–10.00 |
| 2. Shared Bay, No Catch Limit | Complete groups | 5 | 22 | 7.87 | 0.65 | 8.00 | 7.80–8.25 | 6.80–8.50 |
| 3. Shared Bay, Group Limit, No Checks | Complete groups | 3 | 13 | 8.50 | 0.50 | 8.50 | 8.25–8.75 | 8.00–9.00 |
| 4. Shared Bay, Group Limit, Random Checks | Complete groups | 1 | 4 | 8.25 | — | 8.25 | 8.25–8.25 | 8.25–8.25 |
| 5. Shared Bay, Limit Enforced at the Dock | Complete groups | 0 | 0 | — | — | — | — | — |
1. Which setup had the greatest catch and most fish left?
Among all final recorded choices, 2. Shared Bay, No Catch Limit has the highest mean catch at 2.80 fish per boat. For the comparable stock measure available here—fish entering Year 2—1. Your Own Pond has the highest mean at 8.54 fish per boat, narrowly above 3. Shared Bay, Group Limit, No Checks at 8.50. The stock ranking is incomplete because shared-water stocks require a complete Year 1 group, and Setting 5 has no such group.
2. How did sharing the bay change catch choices?
Sharing the bay appears to have strengthened the incentive to catch fish early: the mean across available choices is 2.80 fish in the no-limit shared bay, compared with 2.52 in individual ponds. In an individual pond, every fish left benefits the same boat later; in a shared bay, a boat that leaves a fish cannot be sure another boat will not catch it. Because the same sequence was used for everyone and participation changed, this is a descriptive comparison rather than proof that sharing alone caused the difference.
3. Did the agreement matter without checks?
The group agreement coincides with a lower mean catch: 2.40 fish in 3. Shared Bay, Group Limit, No Checks, compared with 2.80 in the shared bay without a limit. It was not followed perfectly—4 final choices exceeded the recorded group maximum—and the later setup has fewer complete records. The evidence suggests that an agreement may help, but it does not isolate the agreement’s effect.
4. Did the possibility of monitoring matter?
The recorded choices do not show a clear effect from possible monitoring: mean catch is 2.61 fish when each dock had a 50% chance of being monitored, compared with 2.40 under the same agreement without monitoring. This comparison is especially uncertain because only 4 boats have choices in both years in Setting 4, and all 6 Year 2 rows were marked not accepted. A larger, complete sample would be needed to determine whether possible monitoring changed behavior.
5. How did full enforcement compare?
The final recorded choices have the lowest overall mean under 5. Shared Bay, Limit Enforced at the Dock: 2.22 fish, compared with 2.40 under an unchecked agreement and 2.61 with random checks. That direction is consistent with enforcement limiting catch, but the evidence is weak: Setting 5 contains only 9 final rows, 8 of them were marked not accepted, and no group-year is complete.
Reproducible weighted prize draw
For the shortened activity, a boat’s draw weight is the number of distinct setup–year submissions in the response file. Validation messages do not affect the weight, and repeated submissions for the same setup and year count only once. The two boats are sampled without replacement using the fixed seed 20260911.
The payoff calculation uses the final submission from each boat in each setup and year. Every usable submission contributes catch points. For each group-year, the dock price uses the average catch among the boats that submitted; boats without a submission are excluded rather than assigned a zero catch. A future-fish bonus is added when that boat submitted both years of a setup. In a shared-water setup, the submitted group averages are used to estimate the ending fish available per boat. Because the response file does not record whether a random dock check occurred, Setup 4 uses its expected penalty: a 50% chance times 6 points for each fish above the group limit.
Show reproducible winner-draw code
# Read the response file directly.
winner_csv_candidates <- c(
"data/fishing-experiment - Responses.csv",
"../data/fishing-experiment - Responses.csv",
"../../data/fishing-experiment - Responses.csv"
)
winner_csv <- winner_csv_candidates[file.exists(winner_csv_candidates)][1]
if (length(winner_csv) == 0 || is.na(winner_csv)) {
stop("Responses CSV not found.", call. = FALSE)
}
winner_raw <- read_csv(
winner_csv,
show_col_types = FALSE,
name_repair = "minimal"
)
winner_num <- function(x) {
suppressWarnings(parse_double(as.character(x), na = c("", "NA", "N/A")))
}
winner_records <- winner_raw |>
transmute(
source_row = row_number(),
server_sequence = winner_num(.data[["server-sequence"]]),
session_id = trimws(as.character(.data[["session-id"]])),
boat_code = toupper(trimws(as.character(.data[["participant-id"]]))),
reported_group_id = as.integer(winner_num(.data[["group-id"]])),
reported_group_n = as.integer(winner_num(.data[["group-size"]])),
setup = as.integer(winner_num(.data[["block"]])),
year = as.integer(winner_num(.data[["round"]])),
group_limit = winner_num(.data[["group-limit"]]),
harvest = winner_num(.data[["harvest"]])
)
# Use the session containing the latest server sequence.
draw_session <- winner_records |>
filter(session_id != "") |>
arrange(desc(server_sequence), desc(source_row)) |>
slice(1) |>
pull(session_id)
valid_boat_code <- function(x) {
grepl("^A(0[1-9]|[12][0-9]|3[0-2])$", x)
}
# One boat-setup-year combination contributes one unit of weight, even if the
# boat sent several attempts or received a validation message.
draw_pool <- winner_records |>
filter(
session_id == draw_session,
valid_boat_code(boat_code),
setup %in% 1:5,
year %in% 1:2
) |>
distinct(boat_code, setup, year) |>
count(boat_code, name = "draw_weight") |>
arrange(boat_code)
# Retain the last row for payoff reconstruction, regardless of its validation
# message. Rows still need a usable group, group size, and catch amount.
winner_last <- winner_records |>
filter(
session_id == draw_session,
valid_boat_code(boat_code),
setup %in% 1:5,
year %in% 1:2
) |>
arrange(server_sequence, source_row) |>
group_by(boat_code, setup, year) |>
slice_tail(n = 1) |>
ungroup()
# Setup 1, Year 1 fixes the roster so that a later mistyped group number does
# not move a boat to another group.
winner_roster <- winner_last |>
filter(
setup == 1L,
year == 1L,
reported_group_id %in% 1:12,
reported_group_n %in% 3:5,
harvest %in% 0:5
) |>
transmute(
boat_code,
group_id = reported_group_id,
group_n_reported = reported_group_n
)
winner_choices <- winner_last |>
left_join(winner_roster, by = "boat_code") |>
mutate(
group_id = coalesce(group_id, reported_group_id),
group_n_reported = coalesce(group_n_reported, reported_group_n),
usable_choice = group_id %in% 1:12 &
group_n_reported %in% 3:5 & harvest %in% 0:5
)
winner_group_years <- winner_choices |>
filter(usable_choice) |>
group_by(group_id, setup, year) |>
summarise(
submissions = n_distinct(boat_code),
group_catch = sum(harvest),
average_catch = group_catch / submissions,
dock_price = 10 - average_catch,
.groups = "drop"
)
winner_year_points <- winner_choices |>
filter(usable_choice) |>
inner_join(
winner_group_years |>
select(
group_id, setup, year, submissions, group_catch,
average_catch, dock_price
),
by = c("group_id", "setup", "year")
) |>
mutate(
catch_cost = harvest * (harvest + 1) / 2,
expected_penalty = if_else(
setup == 4L & is.finite(group_limit),
0.50 * 6 * pmax(0, harvest - group_limit),
0
),
current_points = harvest * dock_price - catch_cost - expected_penalty
)
winner_current_points <- winner_year_points |>
group_by(boat_code) |>
summarise(
scored_setup_years = n(),
current_points = sum(current_points),
.groups = "drop"
)
# A future-fish bonus requires a last submission from the boat in both years.
# For a shared-water setup, average submitted catch approximates catch per boat.
winner_group_blocks <- winner_group_years |>
select(group_id, setup, year, average_catch) |>
pivot_wider(
names_from = year,
values_from = average_catch,
names_prefix = "average_catch_year_"
) |>
filter(
is.finite(average_catch_year_1),
is.finite(average_catch_year_2)
)
winner_future_bonuses <- winner_year_points |>
group_by(boat_code, group_id, setup) |>
summarise(
years_scored = n_distinct(year),
own_two_year_catch = sum(harvest),
.groups = "drop"
) |>
filter(years_scored == 2L) |>
inner_join(winner_group_blocks, by = c("group_id", "setup")) |>
mutate(
ending_fish_share = if_else(
setup == 1L,
9 + 2 * 2 - own_two_year_catch,
9 + 2 * 2 - average_catch_year_1 - average_catch_year_2
),
future_bonus = 4 * pmax(ending_fish_share, 0)
) |>
group_by(boat_code) |>
summarise(
completed_setups = n(),
future_bonus = sum(future_bonus),
.groups = "drop"
)
winner_payoffs <- full_join(
winner_current_points,
winner_future_bonuses,
by = "boat_code"
) |>
mutate(
scored_setup_years = coalesce(scored_setup_years, 0L),
completed_setups = coalesce(completed_setups, 0L),
current_points = coalesce(current_points, 0),
future_bonus = coalesce(future_bonus, 0),
payoff_points = current_points + future_bonus
)
winner_seed <- 20260911L
winner_count <- 2L
if (nrow(draw_pool) < winner_count) {
stop("At least two boat codes are needed for the draw.", call. = FALSE)
}
if (any(!is.finite(draw_pool$draw_weight) | draw_pool$draw_weight <= 0)) {
stop("Every draw weight must be a positive number.", call. = FALSE)
}
RNGkind(
kind = "Mersenne-Twister",
normal.kind = "Inversion",
sample.kind = "Rejection"
)
set.seed(winner_seed)
winner_rows <- sample.int(
n = nrow(draw_pool),
size = winner_count,
replace = FALSE,
prob = draw_pool$draw_weight
)
winner_table <- draw_pool[winner_rows, , drop = FALSE] |>
left_join(winner_payoffs, by = "boat_code") |>
mutate(
scored_setup_years = coalesce(scored_setup_years, 0L),
completed_setups = coalesce(completed_setups, 0L),
payoff_points = coalesce(payoff_points, 0),
dollar_prize = pmin(10, pmax(0, payoff_points / 30))
) |>
transmute(
`Boat code` = boat_code,
`Draw weight` = draw_weight,
`Scored setup-years` = scored_setup_years,
`Setups with future bonus` = completed_setups,
`Payoff points` = round(payoff_points, 2),
`Dollar prize` = paste0(
"$", formatC(dollar_prize, format = "f", digits = 2)
)
)
winner_table |>
select(-`Boat code`) |>
kable(
format = "html",
align = c("l", "r", "r", "r", "r", "r"),
caption = paste0(
"Weighted draw from the response file (fixed seed ", winner_seed, ")"
)
)| Draw weight | Scored setup-years | Setups with future bonus | Payoff points | Dollar prize |
|---|---|---|---|---|
| 8 | 8 | 3 | 212.75 | $7.09 |
| 6 | 6 | 3 | 182.00 | $6.07 |
Experimental economics studies how people respond to incentives and rules in controlled decision settings. Researchers can change one feature—such as a catch limit or monitoring—and compare individual choices and group outcomes. Laboratory experiments provide more control, while field experiments study behavior in more realistic settings. Replication and evidence from observed behavior help determine whether the findings apply beyond a particular experiment.
A natural-resource policy example comes from Georgia. After the state required an auction to pay farmers to suspend irrigation during droughts, economists tested alternative auction rules. Georgia adopted several design features supported by the experiments, showing how a controlled test can inform an actual policy.
Our fishing activity uses the same basic logic on a smaller classroom scale: the fish-growth and payoff rules stay similar while the fishing and monitoring rules change. Because all groups faced the setups in the same order and later setups have fewer responses, our comparisons are illustrative rather than clean estimates of cause and effect.
Sources: Vossler et al. (2026), Cummings, Holt, and Laury (2004), and OECD (2017).
Exit sentence
Complete one sentence:
I was most willing to leave fish for a later year when ____________________ because ____________________.
I was most willing to leave fish for a later year when I managed my own pond because I received the full future value of every fish I left instead of sharing that value with other boats.