Skip to content

Optimizer#

The Run Optimizer computes three plans for the fields of the tile: a field operation plan, a traction and fuel setup, and a harvest schedule. Each plan is a steady-state estimate that calls the draft, tyre-soil, fuel and weather functions of the simulator.

The flow of the Run Optimizer: the inputs of the menu and the map files go into a setup search for each field that calls the draft, tyre-soil and fuel functions of the simulator, then into the coverage, field order and harvest timing steps; the result is a plan with files, and Visualize makes a path replay of one field. INPUTS PHYSICS EVALUATION PLANNING Menu session Tabs: Optimize, Fields, Weather, Tractor Map files fields.json, site.json soils.json, soil_units.u8 Configuration tractor.json farm.json 1. Setup search for each field Grid: ballast, speed and gear Draft Implement model or ASABE D497.7 Slip and wheel power SoilContact, JanosiForce, bisection Engine, fuel and cost Torque reserve of 15 %, Willans fuel map Lowest cost in the slip band 2. Coverage Pass direction from 0° to 175° Lowest time for passes and turns 3. Field order Road graph, shortest distances Nearest neighbour, then 2-opt 4. Harvest timing (harvest scenario) Weather model for each hour Soil water, grain moisture, schedule OUTPUTS Plan and result files Result page: map, table and summary Saved/Optimizer/<stamp>-<scenario>/ fields.csv, fields.geojson, result.json Visualize Coverage path of one field: passes, U turns, omega turns visualize-F<id>.csv Path replay session The Maxxum drives the path with the ballast, implement and gear of the plan.
The optimizer evaluates each field with the functions of the simulator, then plans the coverage, the field order and the harvest times. Open the diagram

Scope and Assumptions#

FAcresOptimizer::Run reads the session of the menu and fills one result for all fields. It runs in less than one second. Plan Field Work gives the procedure.

Scenario Identifier Question
Field Operation Plan plan Which pass direction, which field order, how much time and fuel?
Traction and Fuel Setup traction Which ballast, gear and speed give the lowest cost in a slip band?
Harvest Timing against Rain harvest At which hour can one machine harvest each field?

The model makes these assumptions.

  • Steady state. The tractor pulls at a constant speed on flat ground. The model has no acceleration, no clutch and no slope.
  • One soil for each field. A field has one soil map unit and one water content.
  • Legacy tyre-soil functions. The slip comes from AcresSim::SoilContact and AcresSim::JanosiForce with the soil block of tractor.json. A simulation with soil.class set to auto uses the soil library, which is a different model (see Limitations).
  • Land cover of the map. The crop of a field is the land cover of fields.json or the crop of the Fields tab. The optimizer does not read the crop season file.
  • Maxxum only. The tractor is the Maxxum with the values of the Tractor tab.
  • One machine. The harvest schedule has one machine and no transport of the grain.
  • No calibration. No value of the optimizer comes from a measurement at ACRE.

Symbols#

Symbol Quantity Unit
\(D\) Draft of the implement N
\(S\) Speed of the operation km/h
\(v\) Ground speed, \(S/3.6\) m/s
\(W\) Working width m
\(T_d\) Working depth cm
\(m, m_b, m_h\) Mass of the tractor, ballast, load on the hitch kg
\(L\) Wheelbase m
\(c_g\) Position of the centre of gravity in front of its default position m
\(h_d\) Height of the drawbar, 0.5 m m
\(o_h\) Distance of the hitch load behind the rear axle, 0.9 m m
\(W_f, W_r\) Load of the front axle and of the rear axle N
\(b, r\) Width and radius of a tyre m
\(\theta\) Volumetric water content of the soil m³/m³
\(\theta_{wp}, \theta_{fc}, \theta_s\) Water content at the wilting point, at field capacity and at saturation m³/m³
\(w\) Wetness of a field: 0 at the wilting point, 1 at field capacity -
\(F_{max}\) Shear capacity of one tyre contact N
\(\ell\) Length of the tyre contact m
\(K\) Shear deformation modulus of Janosi and Hanamoto (janosi_k_m) m
\(q\) Rolling speed of the rear wheels divided by the ground speed -
\(\lambda_f\) Lead of the front axle (front_lead_ratio) -
\(s\) Slip of the drivetrain -
\(R\) Rolling resistance of all wheels N
\(P_w, P_e\) Wheel power, engine power kW
\(n_e\) Engine speed rpm
\(Q\) Fuel flow L/h
\(C\) Field capacity ha/h
\(c\) Cost for each hectare $/ha
\(R_t\) Turn radius of the plan m
\(H\) Width of the headland m
\(M\) Grain moisture, wet basis %
\(M_e\) Equilibrium grain moisture, wet basis %
\(B\) Water in the soil bucket mm
\(K_s\) Saturated conductivity of the soil (ksat_surface_mm_h) mm/h

Inputs#

Input Source
Field outlines and land covers ACRE/fields.json through FAcresFieldSetup::Fields.
Crop, soil and wetness of a field The Fields tab. Without a change, the land cover, the SSURGO soil and the default wetness apply.
Soil map units ACRE/soils.json and ACRE/soil_units.u8.
Default wetness hydrology.initial_fraction_between_wilting_and_field_capacity of farm.json (0.5).
Tractor The Tractor tab. The gears, the torque curve, the final drive and the front lead come from tractor.json.
Tyre-soil parameters The soil block of tractor.json.
Road graph ACRE/site.json through FAcresRoadGraph::Build.
Weather The Weather tab, for the scenario harvest only.
Operation, costs and limits The Optimize tab (see Parameters).

Field selection. A field with the land cover corn, soybean or potato is a planted field. The game changes unassigned to corn. A field with the land cover empty is an empty field. The optimizer ignores lawns, shrubs and woodland.

The scenario harvest uses all planted fields. The other scenarios use the selection of opt:fields.

Soil of a field. The optimizer samples soil_units.u8 at each second cell of the field. The soil is the map unit with the most samples. A soil preset or a custom soil of the Fields tab replaces it.

Water content. ThetaOf changes the wetness \(w\) of the field to a water content.

\[ \theta = \begin{cases} \theta_{wp} + w\,(\theta_{fc} - \theta_{wp}) & w \le 1 \\ \theta_{fc} + (w - 1)(\theta_s - \theta_{fc}) & w > 1 \end{cases} \]

Texture. AcresSim::TextureFromWilting gives the ASABE texture group: fine for \(\theta_{wp} \ge 0.19\), coarse for \(\theta_{wp} \le 0.10\), and medium between them.

Operations and Draft#

OpOf makes the operation from opt:operation. The scenario harvest always uses the operation harvest.

Operation Machine Width Speed Range (km/h) PTO Power Draft Model
chisel Chisel plow of the Maxxum 2.7 m 6.5 to 10.5 0 Implement model
cultivator Cultivator of the Maxxum 2.7 m 8 to 13 0 Implement model
disk Disc harrow of the Maxxum 3.0 m 6.5 to 11 0 Implement model
planter Seed drill of the Maxxum, depth 5 cm 3.0 m 6.5 to 11 0 Implement model
moldboard Moldboard plow opt:width_m 5.5 to 10 0 ASABE D497.7
harvest Offset cutter 3.0 m 3 to 8 35 kW No draft
potato_digger Two-row digger, depth 22 cm 1.8 m 4 to 6.5 20 kW ASABE form, estimate

The operation harvest uses the digger on a potato field and the cutter on the other fields. The hitch load \(m_h\) is the dry mass of a Maxxum implement. The seed drill adds the mass of a half hopper. The cutter has 300 kg. The digger has its mass and 750 kg of tubers.

Maxxum implements. DraftN calls the implement model of the simulator: AcresSim::ImplementSteadyState. The soil is the soil library class of the texture group at the water content of the field. AcresSim::ImplementControlsForDepth sets the hitch or the roller for the depth. Implement Mechanics gives the equations.

Other operations. AcresSim::AsabeDraftN computes the draft of ASABE D497.7.

\[ D = F_i\,\big(A + B\,S + C\,S^2\big)\,W_u\,T_d \]

\(W_u\) is the width in metres or the number of tools \(W / \text{spacing}\). \(T_d\) is 1 for an implement without a depth term.

Implement \(A\) \(B\) \(C\) \(F_1, F_2, F_3\) (Fine, Medium, Coarse) Unit of \(W_u\)
Moldboard plow 652 0 5.1 1, 0.70, 0.45 m
Two-row potato digger 250 12 0 1, 0.88, 0.78 m

The row of the digger is an estimate in the form of the standard. The digger is not in Table 1 of ASABE D497.7.

Traction#

SolveSlip finds the slip at which the tyres give the draft and the rolling resistance. It uses the tyre-soil functions of the vehicle model.

Axle Loads#

The static share of the front axle is \(\sigma = \operatorname{clamp}\big((0.4\,L + c_g)/L,\; 0.05,\; 0.95\big)\). The ballast is part of the chassis mass.

\[ W_f = (m + m_b)\,g\,\sigma - m_h\,g\,\frac{o_h}{L} - D\,\frac{h_d}{L} \]
\[ W_r = (m + m_b)\,g\,(1 - \sigma) + m_h\,g\left(1 + \frac{o_h}{L}\right) + D\,\frac{h_d}{L} \]

The setup is not possible when \(W_f \le 0\). Each wheel of an axle carries half of the axle load.

Soil Contact#

AcresSim::SoilContact gives the contact of one tyre with the load \(W_w\). The tyre is a rigid circle with a fixed deflection \(\delta_t\).

\[ \delta_t = \operatorname{clamp}\!\left(\tfrac{1}{2}\,\rho_t\,r,\; 0.005,\; 0.4\,r\right), \qquad \ell = 2\sqrt{2\,r\,\delta_t - \delta_t^2}, \qquad p = \frac{W_w}{b\,\ell} \]

The effective saturation \(S_e\) makes the Bekker modulus smaller in wet soil. The sinkage \(z\) follows the pressure-sinkage relation of Bekker.

\[ S_e = \operatorname{clamp}\!\left(\frac{\theta - \theta_r}{\theta_{sat} - \theta_r},\; 0.001,\; 1\right), \qquad k = \left(\frac{k_c}{b} + k_\varphi\right)\big(1 + (\kappa - 1)\,S_e\big), \qquad z = \min\!\left(\left(\frac{p}{k}\right)^{1/n},\; z_{max}\right) \]

The matric suction \(\psi_m\) follows the relation of van Genuchten with \(m_v = 1 - 1/n_v\). The shear capacity is the Mohr-Coulomb strength on the contact area.

\[ \psi_m = \min\!\left(\psi_{cap},\; \frac{\rho_w\,g}{\alpha_v}\left(S_e^{-1/m_v} - 1\right)^{1/n_v}\right), \qquad F_{max} = b\,\ell\,\big[c + (p + S_e\,\psi_m)\tan\varphi\big] \]

The compaction resistance of Bekker is the work to make the rut for each metre of travel.

\[ R_c = \frac{b\,k\,z^{\,n+1}}{n + 1} \]

SolveSlip adds the rolling resistance of the tyre itself and limits the coefficient.

\[ R = 2\sum_{a \in \{f, r\}} \min\!\left(0.01 + \frac{R_{c,a}}{W_{w,a}},\; 0.45\right) W_{w,a} \]

Slip#

The unknown \(q\) is the rolling speed of the rear wheels divided by the ground speed. With mechanical front-wheel drive, the front wheels roll at \((1 + \lambda_f)\,q\). AcresSim::Slip gives the slip of a wheel.

\[ s(q) = \frac{q - 1}{\max(q, 1)} \]

AcresSim::JanosiForce gives the force of one tyre from the shear relation of Janosi and Hanamoto.

\[ F(s) = \operatorname{sign}(s)\,F_{max}\left(1 - e^{-|s|\,\ell/(2K)}\right) \]

The pull of the two axles must be equal to the draft and the rolling resistance.

\[ 2\,F_r\big(s(q)\big) + 2\,F_f\big(s((1 + \lambda_f)\,q)\big) = D + R \]

Without front-wheel drive, the front term is 0. A bisection with 50 steps finds \(q\) between 0.5 and 2.5. The setup is not possible when the pull at \(q = 2.5\) (a rear slip of 60 %) is smaller than \(D + R\).

\[ s = 1 - \frac{1}{q}, \qquad P_w = \frac{v}{1000}\Big[2\,F_r\,q + 2\,F_f\,(1 + \lambda_f)\,q\Big] \]

The slip of the drivetrain is the slip of the rear wheels, because the engine speed follows the rear axle. The rut depth of the result is the sinkage of the rear tyres.

Engine, Fuel and Cost#

BestSetup computes the engine state for each gear with the ratio \(i_g\) and the final drive \(i_f\).

\[ n_e = \frac{v}{1 - s}\cdot\frac{i_g\,i_f}{r_r}\cdot\frac{60}{2\pi}, \qquad P_e = \frac{P_w}{\eta_d} + P_{PTO} \]

The search accepts a setup when the engine speed and the power reserve are in their limits.

\[ n_{idle} + 300 \le n_e \le 0.97\,n_{max}, \qquad P_e \le 0.85\,\min\!\left(\frac{T_e(n_e)\,\omega_e}{1000},\; P_{max}\right) \]

\(T_e(n_e)\) is the torque curve of tractor.json with linear interpolation. The factor 0.85 keeps a torque reserve of 15 %.

Willans gives the fuel flow from the fuel map of the vehicle model (AcresSim::WillansFuelPowerW). The brake power includes the drag of the engine, which is 15 N m at the idle speed and increases with the speed.

\[ P_b = 1000\,P_e + T_{drag}\,\frac{\omega_e}{\omega_{idle}}\,\omega_e, \qquad P_f = p_{fme}\,V_d\,\frac{\omega_e}{4\pi}, \qquad p_{fme} = \big(0.6 + 0.2\,n_k + 0.08\,n_k^2\big)\times10^5 \text{ Pa} \]
\[ Q = \frac{P_b + P_f}{\eta_i}\cdot\frac{3600}{H_u\,\rho_f} \]

\(n_k\) is the engine speed in 1000 rpm. The constants are \(V_d = 6.7\times10^{-3}\) m³, \(\eta_i = 0.47\), \(H_u = 42.8\times10^6\) J/kg and \(\rho_f = 0.835\) kg/L. Energy and Fuel describes the fuel map.

The field capacity uses a field efficiency of 0.85. The cost has a fuel term and a time term.

\[ C = 0.36\cdot 0.85\,v\,W, \qquad c = \frac{Q}{C}\,p_{fuel} + \frac{c_{hour}}{C}, \qquad \eta_t = \frac{D\,v}{1000\,P_w} \]

\(\eta_t\) is the tractive efficiency of the result.

BestSetup examines a grid of setups for each field.

Variable Values
Ballast \(m_b\) 0 to opt:ballast_max_kg in steps of 250 kg
Speed \(S\) The speed range of the operation in steps of 0.5 km/h, limited by opt:speed_max_kmh
Gear All 16 forward gears

For an operation with draft, the distance of the slip from the slip band is

\[ e_s = \max(s_{min} - s,\; 0) + \max(s - s_{max},\; 0) \]

For the cutter, \(e_s = 0\). The search selects the setup as follows.

  1. Of the accepted setups with \(e_s = 0\), it selects the lowest value of \(c\,(1 + 0.01\,z_{cm})\). \(z_{cm}\) is the rut depth in centimetres.
  2. If no setup has \(e_s = 0\), it selects the smallest \(e_s\). The result page and fields.csv do not mark such a field. Compare its slip with the band.
  3. If the search accepts no setup, the field has no setup. The note is "cannot pull this implement here".

The scenario traction shows the setup of each field. Its map colour is the cost \(c\).

Coverage of a Field#

PlanCoverage selects the pass direction of a field. The turn radius of the plan is 1.4 times the kinematic radius.

\[ R_t = 1.4\,\frac{L}{\tan\delta_{max}} \]

The value is 4.73 m for the shipped tractor. The headland and the time of one turn are

\[ H = R_t + \frac{W}{2} + 1, \qquad N_h = \left\lceil\frac{H}{W}\right\rceil, \qquad t_{turn} = \frac{\pi\,\max(R_t,\; W/2) + 4}{1.5} + 3 \]

PassesOf turns the outline by the pass direction \(\beta\) and cuts it with lines at a spacing of \(W\). Each pass goes between the two outer crossings of its line, shortened by \(H\) at each end. The function ignores a pass shorter than 2 m.

For each direction \(\beta\) from 0° to 175° in steps of 5°, the work time with \(n_p\) passes is

\[ t(\beta) = \frac{1}{3600}\left[\frac{\sum_j \ell_j + N_h\,U}{v} + (n_p - 1)\,t_{turn}\right] \]

\(\ell_j\) is the length of pass \(j\) and \(U\) is the perimeter of the field. The direction with the smallest time is the result.

The fuel of a field uses the fuel flow \(Q\) of the setup for the passes and a light load for the turns.

\[ V_{fuel} = Q\,(t - t_T) + Q(1400 \text{ rpm},\; 25 \text{ kW})\;t_T, \qquad t_T = \frac{(n_p - 1)\,t_{turn}}{3600} \]
Status of a Field Condition
too wet now \(w > 1\). The field is not in the route.
The note of the setup The field has no setup. The field is not in the route.
rut risk The rut depth is more than 8 cm.

Field Order#

The scenario plan puts the fields into a sequence along the farm roads. The route starts at the entrance of the parking lot of the Beck Agricultural Center, grid position (647.5, 692).

  1. Each field gets the node of the road graph that is nearest to its centroid. The centroid is the mean of the outline points.
  2. RoadDistances computes the road distance from each node with the algorithm of Dijkstra.
  3. The cost from \(a\) to \(b\) has two parts. The first part is the road distance between the nodes. The second part is the straight distance from the node of \(b\) to its centroid.
  4. A nearest-neighbour tour starts at the parking lot. The tour is open: it does not go back to the start.
  5. A 2-opt step reverses a part of the tour when that makes the tour shorter. It stops when no reversal helps.

The clock adds the travel time at 7 m/s and the work time of each field. The fuel of the travel is \(Q(1800 \text{ rpm},\; 40 \text{ kW})\) for the travel time. The map colour of the scenario plan is the position of the field in the sequence.

Harvest Timing#

Weather for Each Hour#

The scenario runs the weather model of the simulator (AcresEnv::Model) with the settings of the Weather tab. It makes six steps of 600 s for each hour. It keeps the hourly means of the rain rate, the evaporation rate, the air temperature and the relative humidity. It also keeps the maximum of the surface wetness. Weather describes the model. The horizon is opt:horizon_days times 24 hours.

Soil Water of a Field#

Each field has a bucket for the top 0.3 m of the soil.

\[ B_{cap} = \max\big(1,\; 300\,(\theta_{fc} - \theta_{wp})\big), \qquad B_{sat} = \max\big(0,\; 300\,(\theta_s - \theta_{fc})\big) \]

The start value includes the rain before the session, \(P_0\) in mm during \(t_0\) hours.

\[ B_0 = \min\!\left(w\,B_{cap} + \min(P_0,\; K_s\,t_0)\,e^{-t_0/48},\; B_{cap} + B_{sat}\right) \]

Each hour changes the bucket with the rain \(P\) and the evaporation \(E\) of that hour in mm.

\[ B \leftarrow B + \min(P,\; K_s) - 0.5\,E \]
\[ B \leftarrow B - \min\!\left(B - B_{cap},\; \frac{9.525}{24} + 0.02\,K_s\right) \quad \text{if } B > B_{cap} \]
\[ B \leftarrow \operatorname{clamp}(B,\; 0,\; B_{cap} + B_{sat}), \qquad w_h = \frac{B}{B_{cap}} \]

The value 9.525 mm/day is the drainage coefficient of the tile drains. The factor 0.5 is for a crop at the end of its season.

Grain Moisture#

EquilibriumWb solves the modified Henderson equation of ASABE D245.6 for the equilibrium moisture. \(T\) is the air temperature in °C and \(\phi\) is the relative humidity as a fraction.

\[ 1 - \phi = \exp\!\big(-A\,(T + C_h)\,M_d^{\,N}\big) \quad\Rightarrow\quad M_d = \left[\frac{-\ln(1 - \phi)}{A\,(T + C_h)}\right]^{1/N}, \qquad M_e = \frac{100\,M_d}{100 + M_d} \]
Crop \(A\) \(C_h\) \(N\)
Corn \(8.6541\times10^{-5}\) 49.81 1.8634
Soybean \(30.5327\times10^{-5}\) 134.136 1.2164

The grain moisture moves to the equilibrium each hour. Rain makes the grain wet again.

\[ M \leftarrow M - k_0\,\max\big(0.3,\; 1 + 0.04\,(T - 20)\big)\,(M - M_e) + r_w\,P \]
Crop \(k_0\) (1/h) \(r_w\) (% for Each mm) Limits of \(M\) (%) Market Moisture (%)
Corn 0.0035 0.05 5 to 35 15.5
Soybean 0.03 0.3 5 to 25 13

The start values are opt:corn_moisture_pct and opt:soy_moisture_pct. A potato field has no grain moisture.

Schedule#

One machine works one field at a time. The soybean fields have priority, then the sequence of the field order. In each hour, the machine can work a field when all conditions of the table are true.

Condition Corn Soybean Potato
Local hour opt:work_start_h to opt:work_end_h Same Same
Rain rate Less than 0.2 mm/h Same Same
Wetness of the soil \(w_h\) 1.0 maximum 1.0 maximum 0.9 maximum
Grain moisture opt:corn_target_pct maximum opt:soy_target_pct maximum
Surface wetness of the canopy Less than 0.3

After the machine starts a field, the grain limit of that field is 1 % of moisture higher. The machine thus does not stop and start at the limit. The work time of a field is the time of Coverage of a Field for the harvest machine. The travel from the field before it adds \(1.4\,d / 7\) seconds, with the straight distance \(d\) between the centroids.

The optimizer also runs a second schedule as a reference. That schedule stops only for rain and for the work hours. The summary gives the hours that this reference works on soil with \(w_h > 1\).

Losses. With the end time \(t_e\) in hours and the moisture \(M_s\) at the start of the field:

\[ \text{loss} = 0.5\,[M_s > M_{market}] + \rho_d\,\frac{t_e}{24}, \qquad \text{shrink} = \max\!\left(0,\; \frac{M_s - M_{market}}{100 - M_{market}}\right)\times 100 \]

The standing loss \(\rho_d\) is 0.1 % for each day for corn and potato and 0.2 % for each day for soybean. A potato field has no handling loss and no shrink. The map colour of the scenario is the start hour of the field.

Path for Visualize#

FAcresOptimizer::PrepareVisualization makes a path replay of the plan of one field. CoveragePath makes the points.

  • Pass sequence. PassOrder uses blocks with a skip of \(k = \lceil 2R_t/W \rceil + 1\) passes. A block of \(2k\) passes has the sequence 0, \(k\), 1, \(k+1\) to \(k-1\), \(2k-1\). The next block has the opposite sequence.
  • U turn. When two passes are \(2R_t\) or more apart, the turn is a quarter circle, a straight line and a quarter circle.
  • Omega turn. When two passes are nearer, the turn uses three circles of radius \(R_t\) that touch. With the pass distance \(a\), their centres are \((0, -R_t)\), \(\big(\sqrt{4R_t^2 - (a/2 + R_t)^2},\; a/2\big)\) and \((0, a + R_t)\).
  • Speed. The passes use the speed of the setup. The turns use 1.5 m/s.
  • Implement. The implement works during the passes only. The turns use the automatic gear.

The file visualize-F<id>.csv has one row for each path point. The curvature of a row is the Menger curvature of three points, positive to the left and limited to ±1 m⁻¹.

\[ \kappa = -\frac{2\,\big[(\mathbf{B} - \mathbf{A})\times(\mathbf{C} - \mathbf{B})\big]}{\lVert\mathbf{B} - \mathbf{A}\rVert\,\lVert\mathbf{C} - \mathbf{B}\rVert\,\lVert\mathbf{C} - \mathbf{A}\rVert} \]

The time of a row increases by the distance divided by the mean speed of the two points, with a minimum speed of 0.3 m/s.

The function then makes a copy of the session for the path replay.

Setting Value
Mass of the tractor The mass of the session and the ballast of the setup.
Implement The Maxxum implement of the operation with the planned depth and the automatic hitch mode.
Moldboard plow The legacy tractor with a trailed implement, because the Maxxum has no model of this plow.
Cutter or digger The harvester of the farm (-FarmHarvester).
Clock, for the scenario harvest The planned start time of the field. The rain event moves with the clock.

Replay describes the path replay.

Outputs#

Each run writes a new folder Saved/Optimizer/<stamp>-<scenario> below the folder of the game. The stamp has the form YYYYMMDD-HHMMSS. For the packaged game, the folder is Packaged/Linux/Acres/Saved/Optimizer.

File Contents
fields.csv One row for each field with the columns of the table below.
fields.geojson The outline of each field with the properties field, value, label and status.
result.json The schema acres-optimizer-1: scenario, operation, title, value, summary and files.
visualize-F<id>.csv The replay path. The columns are time_s, speed_mps, curvature_1pm, ue_x_m, ue_y_m, implement and gear.
Column of fields.csv Unit Description
field, crop, soil, texture The field, its crop, its soil symbol or preset and its texture group.
area_ha ha The area of the outline.
wetness, theta -, m³/m³ \(w\) and \(\theta\).
feasible 1 when the field has a setup.
gear, speed_kmh, rpm, ballast_kg -, km/h, rpm, kg The setup.
slip - \(s\) as a fraction.
draft_kn, engine_kw kN, kW \(D\) and \(P_e\).
fuel_lph, fuel_l_ha, cost_per_ha, ha_h L/h, L/ha, $/ha, ha/h \(Q\), \(Q/C\), \(c\) and \(C\).
tractive_eff, rut_cm -, cm \(\eta_t\) and the sinkage of the rear tyres.
heading_deg, passes, turns deg, -, - \(\beta\), \(n_p\) and \(n_p - 1\).
work_h, fuel_l h, L \(t\) and \(V_{fuel}\).
order, arrive_h -, h The position in the route and the arrival time. 0 means that the field is not in the route.
start_h, end_h h The harvest times from the start of the timeline. -1 means no harvest.
grain_moisture_pct, loss_pct %, % The moisture at the start of the harvest and the loss.
status The note of the field.
operation, width_m -, m The operation of the field and its width.

fields.csv and fields.geojson are UTF-8 text. result.json is UTF-16 with a byte-order mark when a summary line has a character outside ASCII. The game writes an apostrophe of a summary line as \', which is not a JSON escape sequence. The scenario traction has such a line. Plan Field Work shows how to read the file.

Parameters#

Optimize Tab#

Name Type Unit Default Description
opt:scenario choice plan plan, traction or harvest.
opt:fields choice all all, planted or empty. Not for harvest.
opt:operation choice chisel chisel, cultivator, disk, moldboard, planter or harvest.
opt:width_m number m 3.0 The working width of the moldboard plow. Range 1.5 to 12.
opt:depth_cm number cm 18 The working depth of a tillage tool. Range 5 to 35.
opt:ballast_max_kg number kg 1500 The largest ballast of the search. Range 0 to 3000.
opt:slip_min_pct number % 8 The lower limit of the slip band. Range 2 to 25.
opt:slip_max_pct number % 15 The upper limit of the slip band. Range 4 to 30.
opt:speed_max_kmh number km/h 12 The largest field speed. Range 3 to 15.
opt:fuel_price number $/L 1.0 The price of diesel fuel. Range 0 to 5.
opt:hourly_cost number $/h 60 The cost of the operator and the machine. Range 0 to 500.
opt:horizon_days integer day 7 The horizon of the harvest schedule. Range 1 to 14.
opt:corn_moisture_pct number % 21 The moisture of the corn grain at the start. Range 12 to 35.
opt:soy_moisture_pct number % 14 The moisture of the soybean at the start. Range 8 to 25.
opt:corn_target_pct number % 22 The largest moisture for the corn harvest. Range 14 to 30.
opt:soy_target_pct number % 13 The largest moisture for the soybean harvest. Range 10 to 18.
opt:work_start_h number h 7 The start of the work day, local time. Range 0 to 23.
opt:work_end_h number h 20 The end of the work day, local time. Range 1 to 24.

The optimizer stops with a message when the lower slip limit is not below the upper slip limit.

tractor.json#

The table shows the keys that the optimizer reads and their shipped values.

Name Type Unit Default Description
vehicle.mass_kg number kg 5820 \(m\). The Tractor tab can change it.
vehicle.wheelbase_m number m 2.6416 \(L\).
vehicle.cg_forward_m number m 0 \(c_g\).
vehicle.front_radius_m, vehicle.rear_radius_m number m 0.7066, 0.9051 The tyre radii.
vehicle.front_width_m, vehicle.rear_width_m number m 0.54, 0.65 The tyre widths.
vehicle.max_power_kw number kW 116.2 \(P_{max}\).
vehicle.idle_rpm, vehicle.max_rpm number rpm 800, 2300 The limits of the engine speed.
vehicle.efficiency number - 0.9 \(\eta_d\), the efficiency of the driveline.
vehicle.max_steer_rad number rad 0.6632 \(\delta_{max}\).
vehicle.front_drive switch on Mechanical front-wheel drive.
vehicle.final_drive number - 10 \(i_f\).
vehicle.front_lead_ratio number - 0.015 \(\lambda_f\).
vehicle.forward_gears array - 16 ratios, 36.02 to 1.80 \(i_g\).
vehicle.torque_curve array rpm, N m 10 points, peak 700 N m \(T_e(n_e)\).
soil.bekker_kc number N/m^(n+1) 20000 \(k_c\).
soil.bekker_kphi number N/m^(n+2) 2000000 \(k_\varphi\).
soil.bekker_n number - 1.1 \(n\).
soil.saturated_bekker_ratio number - 0.4 \(\kappa\).
soil.cohesion_pa number Pa 3000 \(c\).
soil.friction_degrees number deg 28 \(\varphi\).
soil.max_sinkage_m number m 0.35 \(z_{max}\).
soil.janosi_k_m number m 0.025 \(K\).
soil.theta_residual, soil.theta_saturated number m³/m³ 0.06, 0.43 \(\theta_r\) and \(\theta_{sat}\).
soil.vg_alpha_m_inv, soil.vg_n number 1/m, - 2, 1.6 \(\alpha_v\) and \(n_v\).
soil.suction_cap_pa number Pa 100000 \(\psi_{cap}\).
soil.tire_deflection_ratio number - 0.2 \(\rho_t\).

Constants in the Code#

Constant Value Use
HitchHeightM 0.5 m The height of the drawbar for the weight transfer.
RoadSpeedMps 7 m/s The speed between the fields.
TurnSpeedMps 1.5 m/s The speed in a headland turn.
Field efficiency 0.85 The share of the time that the machine works at full width.
Torque reserve 15 % The limit of the engine power is 85 % of the available power.
Rut penalty 1 % for each cm The factor on the cost in the search.
Rut note 8 cm The rut depth that gives the note rut risk.
Turn radius factor 1.4 The plan radius divided by the kinematic radius.
Depth of the soil bucket 0.3 m The layer of the harvest water balance.

Accuracy against the Simulation#

The repository has no measurement of a real tractor for these plans. The only reference is the simulation. The repository also has no result file that compares a plan with the simulation.

An earlier README reported speed agreement within a few percent. It reported engine speed and fuel approximately 20 % above the plan.

A test for this page did not confirm these statements. The test used Visualize in the packaged game on 2026-10-02. The plan was the scenario traction with the chisel plow and the default settings. The fields were F45 (soil TmA, medium texture) and F42 (soil Cm, fine texture). The table compares each plan with the session log (tractor.csv) of its path replay.

Quantity F45, Plan F45, Simulation F42, Plan F42, Simulation
Speed in a pass 10.5 km/h 0.28 km/h 7.5 km/h 0.19 km/h
Gear 11 11 9 9
Engine speed 1576 rpm 603 rpm 1782 rpm 603 rpm
Draft 22.7 kN 15.4 kN 33.6 kN 25.8 kN
Working depth 18 cm 22 cm 18 cm 24 cm
Slip of the rear wheels 4.5 % 2.2 % 10.1 % 2.9 %
Sinkage of the rear tyres 4.6 cm 1.1 cm 5.6 cm 0.4 cm
Fuel flow 21.5 L/h 6.0 L/h 24.1 L/h 6.0 L/h

The simulation values are the steady values after the tines went into the soil. On F45, the tractor first got to 12.1 km/h. Then the draft increased to 51 kN at a depth of 28 cm, and the speed decreased to 0.28 km/h. The tractor did not complete the first pass in 824 s (F45) and in 114 s (F42). Three causes are visible in the logs.

  • The depth of the implement in the simulation was larger than the depth of the plan, and the draft was thus larger.
  • The replay keeps the planned gear during a pass. The engine speed decreased below the idle speed and did not recover.
  • The plan and the simulation use different tyre-soil models (see Limitations).

The current path replay reports stalled after 10 s below 0.15 m/s with a target above 0.5 m/s. It applies the brake and requests an implement lift. It keeps completed=false in the summary. This detects the failed plan; it does not correct the difference between the planning and runtime models.

Do this test again for your field before you use the numbers of a plan. The session log of the path replay gives the speed, the slip, the draft and the fuel of the simulation.

Code Map#

Item File Function
Entry points Acres/Source/Acres/AcresOptimizer.cpp FAcresOptimizer::Run, FAcresOptimizer::PrepareVisualization, FAcresOptimizer::TimeLabel
Tractor and soil inputs Acres/Source/Acres/AcresOptimizer.cpp TractorOf, GroundOf, ThetaOf, TextureOf
Operations and draft Acres/Source/Acres/AcresOptimizer.cpp OpOf, OpForField, DraftN
Traction Acres/Source/Acres/AcresOptimizer.cpp SolveSlip
Setup search Acres/Source/Acres/AcresOptimizer.cpp BestSetup, Willans
Coverage Acres/Source/Acres/AcresOptimizer.cpp PassesOf, PlanCoverage, PassOrder, TurnPoints, CoveragePath
Field order Acres/Source/Acres/AcresOptimizer.cpp RoadDistances, the tour in FAcresOptimizer::Run
Harvest timing Acres/Source/Acres/AcresOptimizer.cpp EquilibriumWb, the schedule in FAcresOptimizer::Run
Tyre-soil functions Acres/Source/Acres/AcresVehicleModel.cpp AcresSim::SoilContact, AcresSim::JanosiForce
Slip definition Acres/Source/Acres/AcresSimModel.cpp AcresSim::Slip
ASABE draft Acres/Source/Acres/AcresVehicleModel.cpp AcresSim::AsabeDraftN, AcresSim::TextureFromWilting
Implement model Acres/Source/Acres/AcresImplementCoupling.h AcresSim::ImplementSteadyState, AcresSim::ImplementControlsForDepth
Fuel map Acres/Source/Acres/AcresPowerModel.cpp AcresSim::WillansFuelPowerW, AcresSim::EngineFrictionPowerW
Weather model Acres/Source/Acres/AcresEnvironmentModel.h AcresEnv::Model
Road graph Acres/Source/Acres/AcresNpc.cpp FAcresRoadGraph::Build, FAcresRoadGraph::Route
Result page and Visualize Acres/Source/Acres/AcresMenu.cpp SAcresOptMap, SAcresMenu::ResultPage, SAcresMenu::Visualize
Menu settings Acres/Source/Acres/AcresSession.cpp The rows opt:* of the parameter table

Limitations#

  • Two tyre-soil models. SolveSlip uses the legacy functions with the soil block of tractor.json. The shipped tractor.json has soil.class set to auto, so the wheels of the simulation use the soil library. The slip of a plan and the slip of the simulation thus come from different models.
  • Tyre deflection. SoilContact uses a fixed tyre deflection. The contact length does not change with the load.
  • Ballast position. The ballast has the static load share of the chassis: 40 % on the front axle for \(c_g = 0\). The menu text and a comment in AcresOptimizer.h state 45 %.
  • Crops. The optimizer reads the land cover of fields.json. A session with the crop season of 2026 can have different crops.
  • Soil. One map unit and one water content apply to the full field. The water content does not change during a plan.
  • Draft. ASABE D497.7 gives a range for each draft value. The code uses the centre value. The digger row is an estimate.
  • Weather. The harvest weather is the scenario of the Weather tab. It is not a forecast.
  • Grain and loss rates. The drying rates and the loss rates are constants in the code without a source.
  • Field order. The order ignores the wetness of the fields, but a field with \(w > 1\) is not in the route.
  • Road graph. The road distances use the centrelines of site.json (see Farm Traffic and Workers).
  • Datum of the outlines. fields.geojson has NAD83(HARN) coordinates. result.json gives them the label WGS84. The difference is approximately 1.3 m.
  • Slip band note. A setup outside the slip band keeps a note in memory. The result page and the files do not show it.
  • Stale comment. AcresOptimizer.h refers to the old page Documentation/Modelling/optimizer.md.

References#

  • ASABE (2011, reaffirmed 2015). ASAE D497.7: Agricultural Machinery Management Data. St. Joseph, MI: American Society of Agricultural and Biological Engineers.
  • ASABE. ASAE D245.6: Moisture Relationships of Plant-Based Agricultural Products. St. Joseph, MI: American Society of Agricultural and Biological Engineers.
  • Bekker, M. G. (1969). Introduction to Terrain-Vehicle Systems. Ann Arbor, MI: University of Michigan Press.
  • Janosi, Z., and Hanamoto, B. (1961). The analytical determination of drawbar pull as a function of slip for tracked vehicles in deformable soils. Proceedings of the 1st International Conference on Terrain-Vehicle Systems, Turin.
  • van Genuchten, M. Th. (1980). A closed-form equation for predicting the hydraulic conductivity of unsaturated soils. Soil Science Society of America Journal, 44(5), 892-898.
  • Wong, J. Y. (2008). Theory of Ground Vehicles (4th ed.). Hoboken, NJ: Wiley.
  • Croes, G. A. (1958). A method for solving traveling-salesman problems. Operations Research, 6(6), 791-812.
  • Dijkstra, E. W. (1959). A note on two problems in connexion with graphs. Numerische Mathematik, 1, 269-271.
  • OECD. Tractor test report No. 2974 (Case IH Maxxum 150). OECD Standard Codes for the Official Testing of Agricultural and Forestry Tractors. Paris: OECD.