← Past problems · 2020 set

2020 · Problem B — Funding Biodiversity Conservation

Knapsack optimization Conservation biology Index design Sensitivity

Read the official PDF →

The prompt, restated

A foundation has decided to fund the conservation of native Florida plants and has a fixed annual budget. Florida's plant flora includes hundreds of species formally listed as threatened or endangered, distributed unevenly across distinct ecoregions (Everglades, scrub, panhandle sandhills, coastal hammock, etc.), each with very different cost structures for habitat preservation, propagation, and reintroduction.

The team is asked to (1) define a quantitative measure of "biodiversity benefit" that can be attached to each species or to a regional bundle, (2) build a model that recommends how to spend the foundation's budget across species/regions to maximize biodiversity benefit, (3) extend the model to multi-year planning where some interventions take several years to pay off, (4) discuss what happens when the budget grows or shrinks by ±50%, and (5) write a memo to the foundation board with a one-page funding recommendation.

Key modeling idea

This is a weighted-knapsack at heart: each candidate intervention has a cost and a benefit; the foundation picks the subset that maximizes total benefit subject to the budget. The hard, interesting part is defining the benefit score in a defensible way — combining IUCN-style threat status, phylogenetic distinctiveness, ecological role, and probability that funding actually saves the species.

Suggested approach

  • Step 1 — Build the species table. Pull a list of Florida-threatened plants from FNAI (Florida Natural Areas Inventory). For each: ecoregion, threat level, cost of a 5-year conservation action, probability of recovery if funded.
  • Step 2 — Define the benefit index. $B_i = w_1 T_i + w_2 D_i + w_3 R_i$, where $T$ is threat, $D$ is distinctiveness (use EDGE scores if available), $R$ is ecological role. Justify weights with AHP or EWM.
  • Step 3 — Formulate as 0/1 knapsack. $\max \sum_i p_i B_i x_i$ subject to $\sum_i c_i x_i \le \text{Budget}$, where $p_i$ is the probability of recovery under funding. Solve with PuLP or a simple greedy by $p_i B_i / c_i$.
  • Step 4 — Multi-year extension. Some species need 5+ years of funding — treat as a phased commitment with discount rate, similar to NPV planning.
  • Step 5 — Sensitivity (Monte Carlo): perturb benefit weights, recovery probabilities, costs, and observe how the funded list changes.

Data sources to consider

SourceWhat you get
Florida Natural Areas Inventory (FNAI)Rare plant list with state-level conservation rank
USFWS Threatened & Endangered Species System (TESS)Federal listing status and recovery plans
IUCN Red ListGlobal threat categories (CR, EN, VU)
EDGE of Existence projectPhylogenetic distinctiveness scores
USFWS Recovery Plan budgetsReference dollar costs per species action
FWC habitat-management plansCost per acre by ecoregion

Common pitfalls and judge commentary patterns

  • Benefit index without justification. Picking weights by feel and never defending them is the most common failure.
  • Ignoring probability of recovery. Funding a hopeless case for $1M is worse than funding three high-probability cases for $300K each — the math has to show this.
  • Single-species view. Conservation is regional; many actions protect multiple species at once. Strong papers cluster species by ecoregion.
  • No multi-year angle. The problem explicitly asks for it.
  • Budget sensitivity skipped. The ±50% sweep is part of the prompt; don't forget it.

Python sketch

A small 0/1 knapsack over conservation actions. Replace with real FNAI species when writing the real paper.

import numpy as np, pulp

# rows: candidate actions (illustrative)
# cols: cost ($k), threat T, distinctiveness D, role R, recovery prob p
actions = np.array([
    [120, 0.9, 0.7, 0.6, 0.55],   # scrub species
    [80,  0.8, 0.5, 0.7, 0.65],   # panhandle endemic
    [220, 1.0, 0.9, 0.8, 0.40],   # Everglades orchid
    [60,  0.6, 0.6, 0.5, 0.75],   # coastal hammock vine
    [150, 0.85,0.8, 0.7, 0.50],
    [90,  0.7, 0.4, 0.6, 0.70],
    [200, 0.95,0.85,0.9, 0.45],
    [50,  0.5, 0.5, 0.4, 0.80],
])
w = np.array([0.45, 0.30, 0.25])              # AHP weights for T,D,R
B = actions[:, 1:4] @ w                       # benefit index
EB = actions[:, 4] * B                        # expected benefit
cost = actions[:, 0]
budget = 500                                  # $k

m = pulp.LpProblem("conserve", pulp.LpMaximize)
x = [pulp.LpVariable(f"x{i}", cat="Binary") for i in range(len(actions))]
m += pulp.lpSum(EB[i] * x[i] for i in range(len(actions)))
m += pulp.lpSum(cost[i] * x[i] for i in range(len(actions))) <= budget
m.solve(pulp.PULP_CBC_CMD(msg=False))

picked = [i for i, v in enumerate(x) if v.value() > 0.5]
print("fund:", picked, "EB =", round(sum(EB[i] for i in picked), 2))

Sensitivity & validation checklist

  • Re-run at budgets of $250k, $500k, $750k. Plot expected biodiversity benefit vs. budget.
  • Perturb recovery probabilities by ±0.15 — does the funded set stay stable?
  • Try equal weights ($w_1=w_2=w_3=1/3$) and compare.
  • Add a constraint that at least one action per ecoregion must be funded — show the cost.
  • Validate that the greedy benefit/cost solution is within a few percent of the MIP optimum.

Related pages