Implemented by: Flemming
Nielsen (FACT/Banana
hill) (2010)
Main findings: Fuel required for transport is less than anticipated despite the dispersed settlements and small volumes produced.
Objective
-
provide transport cost estimates for the BBC Business Plan;
and
- to provide an interactive tool that can be used in day-to-day
operation of BBC
Background
Due to the dispersed settlements and small production of Jatropha, seeds have to be collected from a large area. Transport costs therefore play an important role in the feasibility of the Jatropha system and has implications for the CO
2 balance.
Approach
The GIS that was developed as a support tool for the research program was used to measure the distance from each collection point to BBC.
The fuel consumption depends to a large extend on the condition of the roads. All road segments were therefore classified in one of three classess:
- Tarmac roads;
- Good dirt roads;
- Bad dirt roads.
Different programming languages were considered. However, it was found that Javascript was sufficient to handle the model. The script can be embedded into a web page thus making the planner a single html page. This has several advantages, including being able to run on almost any operating system and computer without requiring additional software to be installed. It is also easy to update and expand for even inexperienced programmers.
Input Parameters
Fixed parameters that cannot be edited in the interactive
interface:
-
Collection points
-
Distance to collection points
-
Road conditions (three categories are used: tarmac, good dirt
roads and bad dirt roads)
If any of these parameters needs to be changed the source code
must be edited. The code is written in JavaScript and is well
documented so it is relatively easy to update/modify by people
knowledgeable of JavaScript.
Dynamic parameters the user can change in the interactive
interface:
-
Seeds available at each collection point
-
Max hauling capacity of truck
-
fuel consumption by road condition
A screen shot of the interface can be seen below.
Routing Algorithm
A major objective of planning the collection trips is the
minimization of mileage. A generic algorithm was considered as a
solution to this problem. The basic steps:
-
Start at one of the collection points furthest away from the
oil factory.
-
Load what is available up to the capacity of the truck.
-
If the truck is not full:, look up the distance to other
collection points in a distance matrix.
-
Look up available tonnage at other collection points in a
list
-
Calculate the transport cost in km/kg for the other
collection points
-
Select the one with the lowest km/kg cost.
-
Go there, fill the truck up to capacity
-
Repeat until the truck is full
The generic algorithm can optimize the individual trip. However,
it will often result in small amounts of seeds being left particular
at collection points off the main roads. They will eventually be
collected but at a high cost and also with the result that farmers
there have to wait for extended periods.
An algorithm that picks up everything along a particular route,
even if the collection point is off the main road is preferred.
Where the first algorithm decides the routes only from a distance
matrix and a list of available seeds at each collection point, the
algorithm that was eventually selected chooses between a number of
predefined routes.
Each route is describe as a string of collection points starting
with the one furthest away and ending at the oil factory. Each
collection point description contains the following information:
-
ID of collection point & Name
-
Road conditions: Roads have been divided into three classes.
Each class has different fuel consumption.
-
Seeds available in kg at each collection point.
-
Distance to next collection point.
The fuel consumption and tonnage hauled is calculated for each
route. The primary selection criteria is tonnage hauled and the
secondary criteria is fuel consumption.
For each trip a route plan is generated together with statistics
of mileage and fuel required.Below is an example of the output:
Example Output of Transport Planner
Trip 1
Collection Point | Seeds available | Seeds to load | Date collected | Amount collected | Remarks |
---|
Nsemuco | 45456 kg | 4000 kg | | | |
Description | Distance | Fuel Consumption |
---|
Tarmac roads | 29 km | 5 l |
Good dirt roads | 113 km | 23 l |
Poor dirt roads | 4 km | 1 l |
Total | 146 km | 28 l |
Fuel efficiency: 0.71 l fuel/100 kg seeds collected
Total seeds to collect: 4000 kg
Trip 2
Collection Point | Seeds available | Seeds to load | Date collected | Amount collected | Remarks |
---|
Nsemuco | 41456 kg | 4000 kg | | | |
Description | Distance | Fuel Consumption |
---|
Tarmac roads | 29 km | 5 l |
Good dirt roads | 113 km | 23 l |
Poor dirt roads | 4 km | 1 l |
Total | 146 km | 28 l |
Fuel efficiency: 0.71 l fuel/100 kg seeds collected
Total seeds to collect: 4000 kg
-------- data omitted -------------
Summary
Description | Distance | Fuel Consumption |
---|
Tarmac roads | 3523 km | 587 l |
Good dirt roads | 2508 km | 502 l |
Poor dirt roads | 926 km | 232 l |
Total | 6957 km | 1320 l |
Average fuel efficiency: 1.12 l fuel/100 kg seeds collected
Total seeds to collect: 118107 kg
Code
Below the complete code is listed. It can also be downloaded as a file at the bottom of this page. A map of the project area is included for information and must be present in the same directory as the html file.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
lang="en">
<head>
<title>Bilibiza transport planner</title>
<style type="text/css">
#seeds label {
width: 10em;
display: block;
float: left;
}
#seeds input, #load input {
width: 5em;
text-align: right;
}
#fuel input {
width: 3em;
text-align: right;
}
</style>
<script type="text/javascript">
// Flemming Nielsen 2010C
// fnielsen@bananahill.net
// Script for optimizing collection of Jatropha seeds for the Bilibiza
Biofuel Center (BBC)
//
// Names of collection points
var localities = [ "Bilibiza", "Citate", "Pitolha", "Nsemuco",
"Massasi", "Bangala 2", "Xinavane", "Licangano", "Litamanda", "Mieze",
"Nangua", "25 de Junho", "Ntutupe", "Salawe", "Metoro", "Nanjua",
"Gihote", "Nicuita", "Ntessa", "25 de Setembro", "Cagembe", "Primeiro
de Maio", "Muaguide", "Nancororo", "Metambo", "Nova Zambezia", "Koko",
"Nacate", "Nacuta", "Nanlia", "Taratara", "Muissi", "Nanua", "Ngeue",
"Napuda", "Nacoba", "Namange", "Junction 37", "Junction 38", "Junction
39", "Junction 40", "Junction 41", "Junction 42", "Junction 43" ];
// Distance to next collection point in direction of Bilibiza
var distance = [ 3.97, 16.45, 10.72, 3.55, 5.36, 2.16, 9.2, 23.86,
6.13, 7.56, 7.22, 8.55, 22.51, 12.05, 14.87, 3.22, 6.64, 8.48, 14.25,
2.01, 2.9, 7.01, 6.52, 1.69, 6.19, 9.81, 0.96, 5.15, 25.01, 1.23, 5.88,
15.72, 29.92, 13.48, 15.65, 15.64, 15.91, 1.71, 4.32, 4.31, 8.91,
12.97, 4.82 ];
// Road class between collection point and the next one closer to
Bilibiza
var roadclass = [ 2, 2, 2, 1, 1, 3, 3, 3, 1, 3, 3, 1, 1, 1, 1, 1, 1, 2,
2, 3, 2, 2, 1, 1, 2, 1, 1, 3, 1, 3, 1, 1, 1, 3, 3, 3, 1, 1, 2, 1, 1, 1,
2 ];
// The routes that can be used for collecting seeds
var route1 = [ 8, 25, 42, 41, 6, 7, 5, 27, 40, 20, 26, 23, 39, 18, 19,
0 ];
var route2 = [ 8, 25, 42, 41, 7, 5, 27, 40, 20, 26, 23, 18, 39, 19, 0 ];
var route3 = [ 8, 25, 42, 41, 6, 5, 27, 40, 20, 26, 23, 18, 39, 19, 0 ];
var route4 = [ 8, 25, 42, 41, 5, 27, 40, 20, 26, 23, 18, 19, 39, 0 ];
var route5 = [ 3, 1, 21, 2, 22, 38, 39, 18, 19, 0 ];
var route6 = [ 34, 35, 43, 36, 0 ];
var route7 = [ 30, 28, 11, 10, 37, 9, 29, 31, 12, 15, 14, 13, 16, 17,
33, 32, 4, 24, 18, 19, 0 ];
var route8 = [ 30, 28, 11, 10, 37, 29, 31, 12, 13, 16, 17, 33, 32, 4,
24, 18, 19, 0 ];
var route9 = [ 30, 28, 11, 10, 37, 9, 29, 31, 12, 13, 16, 17, 33, 32,
4, 24, 18, 19, 0 ];
var route10 = [ 30, 28, 11, 10, 37, 29, 31, 12, 15, 13, 16, 17, 33, 32,
4, 24, 18, 19, 0 ];
var route11 = [ 30, 28, 11, 10, 37, 9, 29, 31, 12, 15, 13, 16, 17, 33,
32, 4, 24, 18, 19, 0 ];
var route12 = [ 30, 28, 11, 10, 37, 29, 31, 12, 14, 13, 16, 17, 33, 32,
4, 24, 18, 19, 0 ];
var route13 = [ 30, 28, 11, 10, 37, 9, 29, 31, 12, 14, 13, 16, 17, 33,
32, 4, 24, 18, 19, 0 ];
var route14 = [ 30, 28, 11, 10, 37, 29, 31, 12, 15, 14, 13, 16, 17, 33,
32, 4, 24, 18, 19, 0 ];
var route15 = [ 30, 28, 11, 10, 37, 9, 29, 31, 12, 15, 14, 13, 16, 17,
33, 32, 4, 24, 18, 19, 0 ];
// Max loading capacity of truck - determined by poorest road
loadrd1 = [ 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ];
loadrd2 = [ 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 ];
loadrd3 = [ 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 ];
loadrd4 = [ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 ];
loadrd5 = [ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 ];
loadrd6 = [ 3, 3, 3, 2, 2 ];
loadrd7 = [ 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2 ];
loadrd8 = [ 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 ];
loadrd9 = [ 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 ];
loadrd10 = [ 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 ];
loadrd11 = [ 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
];
loadrd12 = [ 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 ];
loadrd13 = [ 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
];
loadrd14 = [ 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
];
loadrd15 = [ 3.1, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2 ];
function checkIt(evt) {
evt = (evt) ? evt : window.event
var charCode = (evt.which) ? evt.which : evt.keyCode
if (charCode > 31 && (charCode < 48 ||
charCode > 57)) {
status = "This field accepts
numbers only."
return false
}
status = ""
return true
}
function makePlan() {
var disttot = 0
var loadtot = 0
var disttotrd1 = 0
var disttotrd2 = 0
var disttotrd3 = 0
var DataForm=document.Seeds
document.write("<html><head><title>BBC
Jatropha Collection Plan</title></head><body>");
// Loop through form fields to get seeds available at each
collection point into array
seeds = [];
i=0
do {
seeds[i]=eval("DataForm._" + i + ".value")
i+=1
} while (eval("DataForm._" + i ));
// Loop through form fields to get fuel consumption by road type
into array
fueluse = [];
i=1
do {
fueluse[i]=eval("DataForm.fuel" + i + ".value")
i+=1
} while (eval("DataForm.fuel" + i ));
// !!Read maxload from form field
var maxload = DataForm.maxload.value
// Loop through all routes finding the one with max tonnage and
highest energy efficiency
var trip = 1
while (true) {
r=0
ef=0
eft=0
tn=0
i=1
while ( i > 0 ) {
disttriprd1=0
disttriprd2=0
disttriprd3=0
curload = 0
// Step through route and sum seeds to
collect, distance and fuel consumption
for ( s=0; s < eval("route" +
i).length; ++s ) {
if ( maxload - curload*1
> 0 ) {
if ( maxload -
curload < seeds[eval("route" + i)[s]] ) {
curload = maxload }
else {
curload+=seeds[eval("route" + i)[s]]*1
}
}
switch
(roadclass[eval("route" + i)[s]]) {
case 1 :
disttriprd1+=distance[eval("route" + i)[s]]
break;
case 2 :
disttriprd2+=distance[eval("route" + i)[s]]
break;
case 3 :
disttriprd3+=distance[eval("route" + i)[s]]
break;
}
if ( curload > tn ) {
r = i
ef = eft
tn = curload
}
if ( curload == tn
&& eft > ef ) {
r = i
ef = eft
}
}
eft=curload/( disttriprd1/fueluse[1] +
disttriprd2/fueluse[2] + disttriprd3/fueluse[3] )
i+=1
try {
eval("route" + i);
}
catch (e) {
i=-1
}
}
// If no route was found all seeds have been
collected
if ( r == 0 ) {
f1=disttotrd1/fueluse[1]
f2=disttotrd2/fueluse[2]
f3=disttotrd3/fueluse[3]
disttot = disttotrd1 + disttotrd2 +
disttotrd3
ft=f1 + f2 + f3
e=ft/loadtot*100
document.write("<h1>Summary</h1>");
document.write("<table
border='1'><tr><th>Description</th><th>Distance</th><th>Fuel
Consumption</th></tr>");
document.write("<tr><td>Tarmac roads</td><td>",
disttotrd1.toFixed(0), " km</td><td>", f1.toFixed(0),"
l</td></tr>");
document.write("<tr><td>Good
dirt roads</td><td>", disttotrd2.toFixed(0), "
km</td><td>", f2.toFixed(0)," l</td></tr>");
document.write("<tr><td>Poor
dirt roads</td><td>", disttotrd3.toFixed(0), "
km</td><td>", f3.toFixed(0)," l</td></tr>");
document.write("<tr><td>Total</td><td>",
disttot.toFixed(0), " km</td><td>", ft.toFixed(0) ,"
l</td></tr>");
document.write("</table><p>Average fuel efficiency:
<b>", e.toFixed(2), " l fuel/100 kg</b> seeds
collected<p>");
document.write("Total seeds to collect:
<b>", loadtot," kg</b>");
document.write("</body></html>");
return
}
// Seeds to collect. Route r has been selected, will
now find the first collection point with seeds on that route
for ( i=-1; i < eval("route" + r).length; ++i ) {
if (seeds[eval("route" + r)[i]] > 0 )
break
}
// First stop on route r is now stored in i. Iterate
through rest of stops and collect the seeds
var disttrip = 0
var disttriprd1 = 0
var disttriprd2 = 0
var disttriprd3 = 0
var curload = 0
document.write("<h2>Trip ", trip
,"</h2><table border='1'
width='100%'><tr><th>Collection
Point</th><th>Seeds available</th><th>Seeds to
load</th><th>Date collected</th><th>Amount
collected</th><th>Remarks</th></tr>");
trip+=1
for ( s=i; s < eval("route" + r).length; ++s ) {
// Figure out how much can be loaded on the truck
toload = 0
if ( maxload - curload*1 > 0 ) {
if ( maxload - curload <
seeds[eval("route" + r)[s]] ) {
toload = maxload
- curload
curload =
maxload }
else {
toload =
seeds[eval("route" + r)[s]]*1
curload+=toload
}
loadtot+=toload
}
switch (roadclass[eval("route" + r)[s]])
{
case 1 :
disttriprd1+=distance[eval("route" + r)[s]]*2
break;
case 2 :
disttriprd2+=distance[eval("route" + r)[s]]*2
break;
case 3 :
disttriprd3+=distance[eval("route" + r)[s]]*2
break;
}
if (toload > 0 ) {
document.write("<tr><td>", localities[eval("route" +
r)[s]],"</td><td align='right'>", seeds[eval("route" +
r)[s]]," kg</td><td align='right'>", toload, "
kg</td><td> </td><td> </td><td> </td></tr>")
seeds[eval("route" + r)[s]]-=toload
}
}
disttotrd1+=disttriprd1
disttotrd2+=disttriprd2
disttotrd3+=disttriprd3
disttrip=disttriprd1 + disttriprd2 + disttriprd3
f1=disttriprd1/fueluse[1]
f2=disttriprd2/fueluse[2]
f3=disttriprd3/fueluse[3]
ft=f1 + f2 + f3
e=ft/curload*100
document.write("</table><p>");
document.write("<table
border='1'><tr><th>Description</th><th>Distance</th><th>Fuel
Consumption</th></tr>");
document.write("<tr><td>Tarmac
roads</td><td align='right'>", disttriprd1.toFixed(0), "
km</td><td align='right'>", f1.toFixed(0),"
l</td></tr>");
document.write("<tr><td>Good dirt
roads</td><td align='right'>", disttriprd2.toFixed(0), "
km</td><td align='right'>", f2.toFixed(0),"
l</td></tr>");
document.write("<tr><td>Poor dirt
roads</td><td align='right'>", disttriprd3.toFixed(0), "
km</td><td align='right'>", f3.toFixed(0),"
l</td></tr>");
document.write("<tr><td>Total</td><td
align='right'>", disttrip.toFixed(0), " km</td><td
align='right'>", ft.toFixed(0) ," l</td></tr>");
document.write("</table><p>Fuel
efficiency: <b>", e.toFixed(2), " l fuel/100 kg</b> seeds
collected<p>");
document.write("Total seeds to collect: <b>",
curload," kg</b><hr>");
}
}
</script>
</head>
<body>
<h1>Transport Planner for BBC</h1>
<form method="get" name="Seeds">
<input name="0" id="_0" value="0" type="hidden" />
<fieldset id="seeds"><legend>Seeds available at each
collection point</legend>
<img style="width: 510px; height: 528px;" alt="Project Area"
title="Project Area" src="map1.gif" align="right" />
<label for="1">Citate:</label><input name="1" id="_1"
value="0" maxlength="5" onKeyPress="return checkIt(event)" />
kg<br />
<label for="2">Pitolha:</label><input name="2" id="_2"
value="0" maxlength="5" onKeyPress="return checkIt(event)" />
kg<br />
<label for="3">Nsemuco:</label><input name="3" id="_3"
value="0" maxlength="5" onKeyPress="return checkIt(event)" />
kg<br />
<label for="4">Massasi:</label><input name="4" id="_4"
value="0" maxlength="5" onKeyPress="return checkIt(event)" />
kg<br />
<label for="5">Bangala 2:</label><input name="5" id="_5"
value="0" maxlength="5" onKeyPress="return checkIt(event)" />
kg<br />
<label for="6">Xinavane:</label><input name="6" id="_6"
value="0" maxlength="5" onKeyPress="return checkIt(event)" />
kg<br />
<label for="7">Licangano:</label><input name="7" id="_7"
value="0" maxlength="5" onKeyPress="return checkIt(event)" />
kg<br />
<label for="8">Litamanda:</label><input name="8" id="_8"
value="0" maxlength="5" onKeyPress="return checkIt(event)" />
kg<br />
<label for="9">Mieze:</label><input name="9" id="_9"
value="0" maxlength="5" onKeyPress="return checkIt(event)" />
kg<br />
<label for="10">Nangua:</label><input name="10" id="_10"
value="0" maxlength="5" onKeyPress="return checkIt(event)" />
kg<br />
<label for="11">25 de Junho:</label><input name="11"
id="_11" value="0" maxlength="5" onKeyPress="return checkIt(event)"
/> kg<br />
<label for="12">Ntutupe:</label><input name="12"
id="_12" value="0" maxlength="5" onKeyPress="return checkIt(event)"
/> kg<br />
<label for="13">Salawe:</label><input name="13" id="_13"
value="0" maxlength="5" onKeyPress="return checkIt(event)" />
kg<br />
<label for="14">Metoro:</label><input name="14" id="_14"
value="0" maxlength="5" onKeyPress="return checkIt(event)" />
kg<br />
<label for="15">Nanjua:</label><input name="15" id="_15"
value="0" maxlength="5" onKeyPress="return checkIt(event)" />
kg<br />
<label for="16">Gihote:</label><input name="16" id="_16"
value="0" maxlength="5" onKeyPress="return checkIt(event)" />
kg<br />
<label for="17">Nicuita:</label><input name="17"
id="_17" value="0" maxlength="5" onKeyPress="return checkIt(event)"
/> kg<br />
<label for="18">Ntessa:</label><input name="18" id="_18"
value="0" maxlength="5" onKeyPress="return checkIt(event)" />
kg<br />
<label for="19">25 de Setembro:</label><input name="19"
id="_19" value="0" maxlength="5" onKeyPress="return checkIt(event)"
/> kg<br />
<label for="20">Cagembe:</label><input name="20"
id="_20" value="0" maxlength="5" onKeyPress="return checkIt(event)"
/> kg<br />
<label for="21">Primeiro de Maio:</label><input
name="21" id="_21" value="0" maxlength="5" onKeyPress="return
checkIt(event)" /> kg<br />
<label for="22">Muaguide:</label><input name="22"
id="_22" value="0" maxlength="5" onKeyPress="return checkIt(event)"
/> kg<br />
<label for="23">Nancororo:</label><input name="23"
id="_23" value="0" maxlength="5" onKeyPress="return checkIt(event)"
/> kg<br />
<label for="24">Metambo:</label><input name="24"
id="_24" value="0" maxlength="5" onKeyPress="return checkIt(event)"
/> kg<br />
<label for="25">Nova Zambezia:</label><input name="25"
id="_25" value="0" maxlength="5" onKeyPress="return checkIt(event)"
/> kg<br />
<label for="26">Koko:</label><input name="26" id="_26"
value="0" maxlength="5" onKeyPress="return checkIt(event)" />
kg<br />
<label for="27">Nacate:</label><input name="27" id="_27"
value="0" maxlength="5" onKeyPress="return checkIt(event)" />
kg<br />
<label for="28">Nacuta:</label><input name="28" id="_28"
value="0" maxlength="5" onKeyPress="return checkIt(event)" />
kg<br />
<label for="29">Nanlia:</label><input name="29" id="_29"
value="0" maxlength="5" onKeyPress="return checkIt(event)" />
kg<br />
<label for="30">Taratara:</label><input name="30"
id="_30" value="0" maxlength="5" onKeyPress="return checkIt(event)"
/> kg<br />
<label for="31">Muissi:</label><input name="31" id="_31"
value="0" maxlength="5" onKeyPress="return checkIt(event)" />
kg<br />
<label for="32">Nanua:</label><input name="32" id="_32"
value="0" maxlength="5" onKeyPress="return checkIt(event)" />
kg<br />
<label for="33">Ngeue:</label><input name="33" id="_33"
value="0" maxlength="5" onKeyPress="return checkIt(event)" />
kg<br />
<label for="34">Napuda:</label><input name="34" id="_34"
value="0" maxlength="5" onKeyPress="return checkIt(event)" />
kg<br />
<label for="35">Nacoba:</label><input name="35" id="_35"
value="0" maxlength="5" onKeyPress="return checkIt(event)" />
kg<br />
<label for="36">Namange:</label><input name="36"
id="_36" value="0" maxlength="5" onKeyPress="return checkIt(event)"
/> kg
<input name="37" id="_37" value="0" type="hidden" />
<input name="38" id="_38" value="0" type="hidden" />
<input name="39" id="_39" value="0" type="hidden" />
<input name="40" id="_40" value="0" type="hidden" />
<input name="41" id="_41" value="0" type="hidden" />
<input name="42" id="_42" value="0" type="hidden" />
<input name="43" id="_43" value="0" type="hidden" />
</fieldset>
<fieldset id="load">
<legend>Max Truck Load</legend>
<label for="maxload">Loading capacity of truck:
</label><input name="maxload" id="maxload" value="4000"
maxlength="5" onKeyPress="return checkIt(event)" /> kg
</fieldset>
<fieldset id="fuel">
<legend>Truck Fuel Consumption</legend>
<label for="fuel1">1) Tarmac roads: </label><input
name="fuel1" id="fuel1" value="6" maxlength="2" onKeyPress="return
checkIt(event)" /> km/l,
<label for="fuel2">2) Good dirt roads: </label><input
name="fuel2" id="fuel2" value="5" maxlength="2" onKeyPress="return
checkIt(event)" /> km/l,
<label for="fuel3">3) Poor dirt roads: </label><input
name="fuel3" id="fuel3" value="4" maxlength="2" onKeyPress="return
checkIt(event)" /> km/l
</fieldset>
<p></p>
<input type="button" value="Make Plan" onClick="makePlan()"
style="width: 8em" />
<input type="reset" style="margin-left: 4em;width: 5em" />
</form>
</body>
</html>
Transport Requirements
By combining the data on production, the yield forecasting described elsewhere, and the transport planner, it is possible to estimate the transport needs for the coming years:
|
|
2011 |
2012 |
2013 |
2014 |
2015 |
2016 |
2017 |
Harvest |
kg |
36,068 |
63,869 |
113,098 |
200,164 |
344,992 |
437,111 |
442,190 |
Truck loading
capacity |
kg |
4,000 |
4,000 |
4,000 |
4,000 |
4,000 |
4,000 |
4,000 |
Fuel efficiency on
tarmac |
km/l |
6 |
6 |
6 |
6 |
6 |
6 |
6 |
Fuel efficiency on
good dirt road |
km/l |
5 |
5 |
5 |
5 |
5 |
5 |
5 |
Fuel efficiency on
gad dirt road |
km/l |
4 |
4 |
4 |
4 |
4 |
4 |
4 |
Trips |
# |
12 |
19 |
30 |
52 |
88 |
111 |
112 |
Distance on tarmac |
km |
750 |
1,091 |
1,686 |
2,682 |
4,570 |
5,692 |
5,756 |
Distance on bad
dirt roads |
km |
727 |
1,264 |
2,010 |
3,534 |
5,965 |
7,524 |
7,600 |
Distance on good
dirt roads |
km |
290 |
470 |
662 |
1,048 |
1,701 |
2,095 |
2,085 |
Distance total |
km |
1,768 |
2,825 |
4,358 |
7,265 |
12,236 |
15,312 |
15,441 |
fuel total |
l |
343 |
552 |
849 |
1,416 |
2,380 |
2,977 |
3,001 |
Fuel/seeds
efficiency |
l/100kg |
0.95 |
0.86 |
0.75 |
0.71 |
0.69 |
0.68 |
0.68 |