19 Transport Planner

Truck for transporting Jatropha
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

  1. provide transport cost estimates for the BBC Business Plan; and

  2. 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 CO2 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:
  1. Tarmac roads;
  2. Good dirt roads;
  3. 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 PointSeeds availableSeeds to loadDate collectedAmount collectedRemarks
Nsemuco45456 kg4000 kg   
DescriptionDistanceFuel Consumption
Tarmac roads29 km5 l
Good dirt roads113 km23 l
Poor dirt roads4 km1 l
Total146 km28 l

Fuel efficiency: 0.71 l fuel/100 kg seeds collected

Total seeds to collect: 4000 kg



Trip 2

Collection PointSeeds availableSeeds to loadDate collectedAmount collectedRemarks
Nsemuco41456 kg4000 kg   
DescriptionDistanceFuel Consumption
Tarmac roads29 km5 l
Good dirt roads113 km23 l
Poor dirt roads4 km1 l
Total146 km28 l

Fuel efficiency: 0.71 l fuel/100 kg seeds collected

Total seeds to collect: 4000 kg

--------      data omitted -------------


Summary

DescriptionDistanceFuel Consumption
Tarmac roads3523 km587 l
Good dirt roads2508 km502 l
Poor dirt roads926 km232 l
Total6957 km1320 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>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</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, &nbsp;
<label for="fuel2">2) Good dirt roads: </label><input name="fuel2" id="fuel2" value="5" maxlength="2" onKeyPress="return checkIt(event)" /> km/l, &nbsp;
<label for="fuel3">3) Poor dirt roads: </label><input name="fuel3" id="fuel3" value="4" maxlength="2" onKeyPress="return checkIt(event)" /> km/l &nbsp;
</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


SelectionFile type iconFile nameDescriptionSizeRevisionTimeUser
ċ

Download
Flemming Nielsen (2010): BBC Transport planner  17k v. 5 16 Feb 2011, 08:43 Banana hill Consultants
ą

View Download
Map file for Transport Planner. Place this file in the same directory as the Transport Planner main file.  30k v. 5 16 Feb 2011, 08:44 Banana hill Consultants
Comments