Builds a fleet object specifying the fishing behaviour, spatial dynamics,
and economic parameters for one group of vessels targeting one or more
species. Always run tune_fleets after creating fleets to
calibrate catchability and costs to the desired initial conditions.
Usage
create_fleet(
metiers,
mpa_response = "stay",
fleet_model = "constant_effort",
oa_max_growth_per_year = 0.5,
oa_max_decline_per_year = 0.5,
oa_signal_half = 0.3,
cost_per_unit_effort = 1,
spatial_allocation = "rpue",
effort_cost_exponent = 1.2,
travel_fraction = 0,
ports = NULL,
cost_per_distance = 1,
cr_ratio = 1,
resolution,
patch_area = 1,
base_effort = NULL,
fishing_grounds = NULL,
responsiveness = 0.025,
eps_mix = 0,
memory_halflife = 0
)Arguments
- metiers
Named list of
MetierR6 objects, one per species infauna. Each metier specifies price, selectivity, and relative catchability for that fleet-species combination. Names must match species names infauna.- mpa_response
Character. Vessel response to MPA closures:
"stay"(vessels stay in the closed area) or"leave"(vessels redistribute to open patches, concentrating effort).- fleet_model
Character. Effort dynamics model; see Details. One of
"constant_effort"(default),"open_access","sole_owner", or"manual".- oa_max_growth_per_year
Numeric. Maximum fractional increase in total effort per year under highly profitable conditions for open-access and sole-owner fleets (e.g.
0.5= +50% per year). Converted to a per-step multiplier internally. Must be > 0.- oa_max_decline_per_year
Numeric in (0, 1). Maximum fractional decrease in total effort per year under highly unprofitable conditions (e.g.
0.5= -50% per year). Must be in (0, 1).- oa_signal_half
Numeric in (0, 1). Profitability signal value at which effort adjustment speed reaches half its maximum. Lower values make fleets more sensitive. Typical range
0.15–0.4. Default0.3.- cost_per_unit_effort
Numeric. Base cost per unit of effort. Overridden by
tune_fleetswhentune_costs = TRUE; rarely needs manual adjustment.- spatial_allocation
Character. Spatial effort allocation strategy; see Details. Default
"rpue".- effort_cost_exponent
Numeric. Exponent \(\gamma\) in the effort cost function, controlling congestion / convexity. Values > 1 make additional units of effort progressively more expensive. Default
1.2.- travel_fraction
Numeric in [0, 1). Fraction of total costs attributable to travel at equilibrium.
0means no spatial cost heterogeneity (all patches equally costly). Controls how strongly port proximity shapes the spatial cost surface.- ports
Data frame with columns
xandygiving port patch coordinates. Minimum distances from each patch to the nearest port are used to compute the travel-cost component whentravel_fraction > 0.- cost_per_distance
Numeric. Deprecated; use
travel_fractioninstead.- cr_ratio
Numeric. Target cost-to-revenue ratio at equilibrium.
1implies zero profits (open-access equilibrium). Used bytune_fleetsto calibratecost_per_unit_effort.- resolution
Integer scalar or length-2 integer vector
c(nx, ny). Must match the resolution of thefaunaobjects.- patch_area
Numeric. Area of each patch (km^2). Used to compute port distances.
- base_effort
Numeric. Total effort units available to the fleet. Defaults to
prod(resolution)(one unit per patch). Catchability is calibrated relative to this value bytune_fleets.- fishing_grounds
Data frame with columns
x,y, andfishing_ground(logical or numeric). Restricts where effort can be deployed;TRUE/1= open,FALSE/0= closed. Whenspatial_allocation = "manual", numeric values infishing_groundare used as effort weights. Defaults to all patches open.- responsiveness
Numeric. Per-step responsiveness of patch effort to the objective signal in
allocate_effort(the \(\eta\) parameter of the multiplicative update). Larger values move effort more aggressively toward high-objective patches each step; if too large, can drive period-2 sawtooth oscillation. Default0.025.- eps_mix
Numeric in [0, 1). Fraction of this fleet's effort blended back toward a uniform distribution over open patches each step – exploratory fishing.
0(default) disables it, matching legacy behavior.The spatial update is multiplicative (\(e^{new} \propto e \, \exp(\eta v)\)), which has an absorbing state at zero: a patch whose effort decays to
0can never recover, because \(0 \times \exp(\cdot) = 0\), no matter how attractive it later becomes. Mixing in a uniform baseline floors every open patch ateps_mix * total_effort / n_open, which makes zero unreachable and keeps every patch recoverable.Two situations call for it. First, high
responsivenesson a sharply varying objective drives effort to collapse onto a handful of patches and strand the rest at zero. Second, the per-unit-effort objectives (rpue,cpue,ppue) areNAwhere effort is exactly zero, since they divide by it – a patch that dies goes dark and the fleet has no information with which to ever return. A small positiveeps_mix(0.01–0.05) forecloses both. Not needed forspatial_allocation = "fishable_revenue"on information grounds, since that objective is defined at zero effort, but still relevant to the absorbing state.- memory_halflife
Non-negative numeric. Half-life in years of the exponential smoothing applied to this fleet's spatial objective surface inside
simmar.0(default) disables smoothing — the fleet sees only the previous step's objective, matching legacy behavior. The parameter is season-agnostic: simmar converts it internally to time steps (halflife_steps = halflife * steps_per_year) so a given value produces the same calendar-time smoothing regardless of how many seasons per year the model uses. Larger values dampen high-frequency feedback oscillations by blending in past objective surfaces; the per-step weight on the current surface is \(\alpha = 1 - 0.5^{1/halflife_{steps}}\). Smoothing updates only patches that are currently open; closed patches retain their last-seen smoothed value ("freeze and resume"). Early warm-up steps use a Welford-style ramp (effective \(\alpha_\mathrm{eff} = \max(\alpha, 1/n)\)) so the smoothed surface is not anchored to the first observed buffet column.Practical guidance: values around
0.5–1.5years are the typical sweet spot. Larger halflives introduce phase lag of roughly \(1.44 \times \mathrm{halflife}\) years between a true change in patch marginal value and the fleet's perceived value, which can produce low-frequency overshoot/undershoot — a different pathology from the high-frequency sawtooth that motivates the parameter. If catch trajectories under a given halflife show slow swings that aren't present athalflife = 0, reduce it.
Value
A named list (fleet object) with all parameters needed by
simmar and tune_fleets, including
computed travel weights, normalised cost-per-patch, and (for open-access /
sole-owner fleets) the derived annual effort-adjustment parameters.
Details
Fleet models
"constant_effort"Total effort is fixed at
base_efforteach time step. Use for scenarios where fishing pressure is prescribed externally."open_access"Total effort adjusts each step based on a normalised average-profitability signal. Equilibrates where total profits = 0. Entry/exit speed is controlled by
oa_max_growth_per_year,oa_max_decline_per_year, andoa_signal_half."sole_owner"Identical dynamics to
"open_access"but uses the marginal (not average) profit signal. Equilibrates at MEY where marginal profit = 0. Requirescalc_marginal_value()to be computed each step;simmarhandles this automatically."manual"Total effort each step is taken directly from a user-supplied vector; see the
managerargument ofsimmar.
Spatial allocation
The spatial_allocation argument determines how total fleet effort is
distributed among patches each step. Options:
"rpue"Revenue per unit effort (default). Effort concentrates in high-revenue patches.
"revenue"Total revenue. Similar to
"rpue"but favours larger patches."ppue"Profit per unit effort (cost-aware).
"profit"Total profit (cost-aware).
"cpue"/"catch"Catch-based variants.
"marginal_revenue"/"marginal_profit"Uses finite- difference marginal returns from
calc_marginal_value. Required for"sole_owner"fleets. Requiresfleet_model = "sole_owner"or explicit pre-computation."fishable_revenue"Revenue standing available in each patch – biomass at age times vulnerability at age times price, from
calc_fishable_revenue. Unlike every option above it is not a function of realised fishing, so it is evaluated against the biomass the step is about to fish rather than the one it just fished. Use it when you want effort to track biomass in phase, in particular when habitat moves on a timescale near the time step (e.g. seasonal migration), where the realised objectives always lag by a step no matter howresponsivenessis set. In exchange there is no crowding within a step, no cost side, and no within-step interaction between fleets, and the fleet relaxes toward effort tracking standing stock rather than toward an ideal free distribution. Seecalc_fishable_revenue."manual"Effort distributed proportionally to continuous weights in
fishing_grounds$fishing_ground(0–1 valued)."uniform"Effort spread equally across all open patches.
Costs
Total cost per fleet is:
$$C = c_0 \, E^{ref} \sum_l \left[\left(\frac{E_l}{E^{ref}}\right)^\gamma + \theta \, \tilde{d}_l \frac{E_l}{E^{ref}}\right]$$
where \(c_0\) is cost_per_unit_effort, \(E^{ref}\) is the
reference effort per patch, \(\gamma\) is effort_cost_exponent,
\(\theta\) is travel_weight (derived from travel_fraction),
and \(\tilde{d}_l\) is the normalised distance from patch \(l\) to the
nearest port.
Examples
if (FALSE) { # \dontrun{
# Create a metier for a single species
met <- Metier$new(
critter = fauna[["tuna"]],
price = 10,
sel_form = "logistic",
sel_start = 0.3,
sel_delta = 0.1,
catchability = 0.01,
p_explt = 1
)
# Constant-effort fleet
fleet <- create_fleet(
metiers = list(tuna = met),
resolution = c(10, 10)
)
# Open-access fleet with port-based travel costs
ports <- data.frame(x = 1, y = 1)
oa_fleet <- create_fleet(
metiers = list(tuna = met),
fleet_model = "open_access",
spatial_allocation = "ppue",
travel_fraction = 0.3,
ports = ports,
cr_ratio = 0.9,
resolution = c(10, 10)
)
fleets <- list(fleet = fleet)
fleets <- tune_fleets(fauna, fleets, tune_type = "depletion")
} # }