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.
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::SoilContactandAcresSim::JanosiForcewith thesoilblock oftractor.json. A simulation withsoil.classset toautouses 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.jsonor 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.
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.
\(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.
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\).
The effective saturation \(S_e\) makes the Bekker modulus smaller in wet soil. The sinkage \(z\) follows the pressure-sinkage relation of Bekker.
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.
The compaction resistance of Bekker is the work to make the rut for each metre of travel.
SolveSlip adds the rolling resistance of the tyre itself and limits the coefficient.
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.
AcresSim::JanosiForce gives the force of one tyre from the shear relation of Janosi and Hanamoto.
The pull of the two axles must be equal to the draft and the rolling resistance.
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\).
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\).
The search accepts a setup when the engine speed and the power reserve are in their limits.
\(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.
\(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.
\(\eta_t\) is the tractive efficiency of the result.
Setup Search#
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
For the cutter, \(e_s = 0\). The search selects the setup as follows.
- 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.
- If no setup has \(e_s = 0\), it selects the smallest \(e_s\). The result page and
fields.csvdo not mark such a field. Compare its slip with the band. - 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.
The value is 4.73 m for the shipped tractor. The headland and the time of one turn are
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
\(\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.
| 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).
- Each field gets the node of the road graph that is nearest to its centroid. The centroid is the mean of the outline points.
RoadDistancescomputes the road distance from each node with the algorithm of Dijkstra.- 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.
- A nearest-neighbour tour starts at the parking lot. The tour is open: it does not go back to the start.
- 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.
The start value includes the rain before the session, \(P_0\) in mm during \(t_0\) hours.
Each hour changes the bucket with the rain \(P\) and the evaporation \(E\) of that hour in mm.
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.
| 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.
| 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:
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.
PassOrderuses 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⁻¹.
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.
SolveSlipuses the legacy functions with thesoilblock oftractor.json. The shippedtractor.jsonhassoil.classset toauto, 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.
SoilContactuses 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.hstate 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.geojsonhas NAD83(HARN) coordinates.result.jsongives 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.hrefers to the old pageDocumentation/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.