Skip to content

ptv

TLN planner is the product I want to compare against. It is a web application just like klopt, and I got a 15 day license from :

  • 21 aug 2020
  • 04 sep 2020

On that day i first want to see if it can be extended to 30 days, it seems you can purchase an extension so just try..

If it does not work, or after the extension just try to purchase a year (or months). This will at least make clear what price this package will be.

Note that it is likely that the price will be linked to the number of trucks, so use the first 15 day to do some large fleet plannings first. The smaller ones can be done with the cheaper license.

price vs quality

Note, this webapp costs 68 euro ex-btw and it can only handle 1 truck !!! It can however do pickups and deliveries and timewindows.

first 15 days

It only does 1 truck, try to get most out of the 15 day trial, then fix your own algorithms and only then do a free (60 day) trial of Xserver !!

Let's just get some useful info from the interface :

vehicles

The types presented are rather interesting to note down. T must mean Tons.

  • 12T city distribution | 2 axles | Euro 5
  • 20T | 2 axles | Euro 5
  • 40T | 5 axles | Euro 5
  • 40T ADR | 5 axles | Euro 5
  • Eco-Combi (LHV) | 7 axles | Euro 5
  • Private vehicle | 2 axles | Euro 5
  • Van | 2 axles | Euro 5

What the Euro 5 denotes is emissie klasse, just note they are all the Same. You can create more types in the vehicle management menu.

You can set these parameters :

  • cost profile
  • salary profile
  • times (dep + arr)

Cost profiles

PTV Clearly does split the costs in driver (salary profile) and km (cost profile) and also has the option for more drivers per vehicle.

vehicle management

If you 'click down' the planning you get the menu to select vehicle management. It looks like only vehicle types are listed there, but you can notice the kenteken1/2 field so it means you probably have to copy one of the default template trucks and alter it and give it a name and kenteken.

In 'bewerken' you will see that the yellow/locked ones do not have an option to change them, and the others have.

vehicle export

At least the profiles can be exported to xml format, but it is kind of a large chunk. This the 40Ton version:

40 ton
<?xml version="1.0" encoding="utf-8"?>
<Profile xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" dataCompatibilityVersion="2">
  <FeatureLayer majorVersion="1" minorVersion="0">
    <GlobalSettings enableTimeDependency="false" enableVehicleDependency="true">
      <Parameter name="preferredRouteBonus" value="-75" />
      <Parameter name="avoidedRouteMalus" value="2500" />
    </GlobalSettings>
    <Themes>
      <Theme id="PTV_TruckAttributes" enabled="false" priorityLevel="100">
        <PropertyValue id="hazardousGoods" value="0" />
        <PropertyValue id="hazardousToWaters" value="0" />
        <PropertyValue id="combustibles" value="0" />
      </Theme>
      <Theme id="PTV_RestrictionZones" enabled="false" priorityLevel="100" />
    </Themes>
  </FeatureLayer>
  <Routing majorVersion="2" minorVersion="0">
    <Waypoint linkType="ROAD" maximumDistanceToSegment="50000" maximumDistanceToCombinedTransport="100">
      <LinkTypeConfiguration>
        <Road maximumDistanceForNetworkClass0="100" onlyReachableRoads="true" minimumNetworkClass="0" maximumNetworkClass="7" headingTolerance="360" />
        <Smart maximumDistanceToMainNode="100" maximumDistanceToMainNodeForNetworkClass0="1500" checkNetworkClassOnlyForVias="true" />
        <TollStation maximumDistance="1000" />
        <RoadName maximumDistance="3000" maximumDistanceToMainNode="2000" />
      </LinkTypeConfiguration>
    </Waypoint>
    <Algorithm routingAlgorithm="BIDIRECTIONAL_KSTAR" aStarAggressiveness="1.2" useFastTurningBanHeuristic="true">
      <LevellingScopeByNetworkClass searchSpace="-1" />
      <LevellingScopeByNetworkClass searchSpace="-1" />
      <LevellingScopeByNetworkClass searchSpace="-1" />
      <LevellingScopeByNetworkClass searchSpace="-1" />
      <LevellingScopeByNetworkClass searchSpace="20" />
      <LevellingScopeByNetworkClass searchSpace="10" />
      <LevellingScopeByNetworkClass searchSpace="10" />
      <LevellingScopeByNetworkClass searchSpace="10" />
      <GeographicRestrictions>
        <BoundingBox restrictionMode="AUTO" boundingBoxExtension="300000" />
      </GeographicRestrictions>
    </Algorithm>
    <Course distanceTimeWeighting="91" enforceShortestRoute="false">
      <BasicDataRules>
        <VehicleSpecific>
          <AuthorizedVehicles turningBanCost="2500" />
          <DeliveryVehicles segmentMalus="0" />
          <EmergencyVehicles turningBanCost="2500" segmentMalus="2501" />
          <ProjectSpecificVehicles turningBanCost="0" blockedSegmentMalus="2500" openSegmentMalus="0" />
        </VehicleSpecific>
        <Blockings blockedInWinterMalus="0" blockedTimeDependentMalus="0" oppositeDirectionInOneWayRoadMalus="2501" blockedMalus="2501" />
        <Network rampMalus="10">
          <MalusByNetworkClass malus="0" />
          <MalusByNetworkClass malus="10" />
          <MalusByNetworkClass malus="15" />
          <MalusByNetworkClass malus="35" />
          <MalusByNetworkClass malus="40" />
          <MalusByNetworkClass malus="90" />
          <MalusByNetworkClass malus="0" />
          <MalusByNetworkClass malus="2500" />
        </Network>
        <Toll tollMalus="0" extraTollMalus="0" vignetteMalus="0">
          <NamedTollMalus countryCode="0" malus="0" />
        </Toll>
        <SpecialAreas residentialMalus="0" urbanMalus="0" minimumUrbanNetworkClass="2" forbiddenLowEmissionZoneMalus="2500" />
        <CombinedTransport ferryMalus="100" blockedFerryMalus="2501" piggybackMalus="100" />
      </BasicDataRules>
      <AdditionalDataRules enabled="true" layerName="TruckAttributes">
        <SegmentSpecific useSegmentLength="true" useFerryLength="true" useFerryDuration="true" useUrbanAttribute="true" useRampAttribute="true" useSpeed="true" useBlockedForCarsAttribute="true" useBlockedForTrucksAttribute="true" useTollForCarsAttribute="true" useTollForTrucksAttribute="true" />
        <VehicleSpecific enabled="true">
          <Malus vehiclesWithTrailer="2501" hazardousGoods="2501" hazardousToWaters="2501" combustibles="2501" residential="0" delivery="0" maintenanceTrucks="2500" preferredForTrucks="0" preferredForHazardousGoods="0" restrictedTunnel="2501" />
        </VehicleSpecific>
        <Legacy>
          <KeyValue key="HeavyLoad" enabled="true" threshold="0" malus="2501" />
          <KeyValue key="DirOptCondMalus2" enabled="false" threshold="0" malus="2501" />
          <KeyValue key="OptMalus1" enabled="false" threshold="0" malus="2000" />
          <KeyValue key="OptMalus2" enabled="false" threshold="0" malus="1000" />
          <KeyValue key="OptMalus3" enabled="false" threshold="0" malus="-50" />
          <KeyValue key="OptMalus4" enabled="false" threshold="0" malus="-99" />
          <KeyValue key="OptMalus5" enabled="true" threshold="0" malus="2000" />
          <KeyValue key="OptMalus6" enabled="true" threshold="0" malus="1000" />
          <KeyValue key="OptMalus7" enabled="false" threshold="0" malus="-50" />
          <KeyValue key="OptMalus8" enabled="false" threshold="0" malus="-99" />
          <KeyValue key="OptMalus20" enabled="false" threshold="0" malus="-95" />
          <KeyValue key="DirOptCondMalus1" enabled="false" threshold="0" malus="2501" />
          <KeyValue key="DirOptCondMalus5" enabled="false" threshold="0" malus="2501" />
          <KeyValue key="ResidentialTrucks" enabled="false" threshold="0" malus="2501" />
          <KeyValue key="OptMalus9" enabled="true" threshold="0" malus="0" />
          <KeyValue key="OptMalus10" enabled="true" threshold="0" malus="0" />
          <KeyValue key="OptMalus13" enabled="true" threshold="0" malus="0" />
          <KeyValue key="OptMalus14" enabled="true" threshold="0" malus="0" />
          <KeyValue key="OptMalus15" enabled="true" threshold="0" malus="0" />
          <KeyValue key="OptMalus16" enabled="true" threshold="0" malus="0" />
        </Legacy>
      </AdditionalDataRules>
      <Maneuver uTurnCost="5000" considerTurningBans="true" />
      <Violations>
        <SegmentBlockingViolations enabled="true" cost="50000" />
      </Violations>
    </Course>
    <Vehicle>
      <Physical>
        <Drive driveType="MOTORIZED">
          <Emissions emissionTechnology="EXHAUST_GAS_RECIRCULATION" particleFilterInstalled="false" particleReductionClass="0" emissionClass="EURO_5" lowEmissionZoneType="GREEN" />
          <Engine cylinderCapacity="12000" fuelType="DIESEL" bioFuelRatio="0" fuelConsumption="0.0001" />
        </Drive>
        <Weight emptyWeight="8200" totalPermittedWeight="40000" loadWeight="25500" />
        <Axle axleLoad="11500" numberOfAxles="5" />
        <Trailer emptyWeight="6300" />
        <Passenger maximumPermittedNumberOfPassengers="1" />
        <Dimension height="400" heightAboveFrontAxle="400" length="1650" width="254" />
      </Physical>
      <Legal yearOfManufacture="2005">
        <LegalCondition isMaintenance="false" isAuthorized="true" isEmergency="true" isProject="false" isDelivery="true" />
      </Legal>
      <Load hazardousGoodsType="NONE" loadType="GOODS" tunnelRestrictionCode="NONE" />
      <Speed speedForAirLineDistance="36" maximumSpeed="80">
        <SpeedRangeByNetworkClass minimumSpeed="55" maximumSpeed="85" />
        <SpeedRangeByNetworkClass minimumSpeed="35" maximumSpeed="78" />
        <SpeedRangeByNetworkClass minimumSpeed="30" maximumSpeed="70" />
        <SpeedRangeByNetworkClass minimumSpeed="20" maximumSpeed="62" />
        <SpeedRangeByNetworkClass minimumSpeed="15" maximumSpeed="51" />
        <SpeedRangeByNetworkClass minimumSpeed="10" maximumSpeed="36" />
        <SpeedRangeByNetworkClass minimumSpeed="5" maximumSpeed="10" />
        <SpeedRangeByNetworkClass minimumSpeed="4" maximumSpeed="9" />
      </Speed>
    </Vehicle>
  </Routing>
  <BreakAndRestRules majorVersion="1" minorVersion="0" considerOnlyDrivingAsWorkingHours="false">
    <BreakRules enabled="false" maximumDrivingTimeBeforeBreak="0" totalBreakPeriod="0" minimumDurationOfFirstBreak="0" minimumDurationOfAdditionalBreaks="0" />
    <RestRules enabled="false" durationOfShift="0" maximumWorkingHoursDuringShift="0" restPeriod="0" minimumStayAtStopForRest="10800" />
  </BreakAndRestRules>
</Profile>

All profiles have been saved as .xml in google drive : work/ptv

orders

You can import orders via csv file, so i first created a generator for orders. That way i can see what works best for PTV and then create an importer for klopt that can use the same format..

We need a testset for.

  • netherlands
  • europe

See in both cases how the performance keeps up.

Order import/export

There are two formats you can use, csv and BCR. One csv line would be:

csv
NL;3151AW;Hoek van Holland;Prins Hendrikstraat 248;0;;;;;;;comment;459340;6788361;10000;11000;0;town;3151AWHoekvanHolland,PrinsHendrikstraat248|413094|5197699;;;;;;;12;EUR;NONE;info
NL;2691GK;'s-Gravenzande;Oranje Nassaustraat 24;0;;;;;;;;464303;6792386;0;0;;town;2691GK's-Gravenzande,OranjeNassaustraat24|417558|5199928;;;;;;;;;UNCHANGED;

All fields are present and nu header line.

There is also an option 'weergave' which dumps a report like this for the same data:

weergave
1
2
3
"stationnumberer";"orderId";"postCode";"city";"hitType";"street";"sellingPrice";"cost";"costComment";"loadEvents";"cargo"
"1";"";"3151AW";"Hoek van Holland";"";"Prins Hendrikstraat 248";"-";"12,00 EUR";"info";"Laadhoeveelheid: 10 t Loshoeveelheid: 11 t";"-1 t (5,49 t)"
"2";"";"2691GK";"'s-Gravenzande";"";"Oranje Nassaustraat 24";"-";"0,00 EUR";"";"";"-1 t (5,49 t)"

It seems to be only the filled fields with a header above.

The BCR file is a pure PTV format and looks like this :

bcr file
[CLIENT]
ROUTENAME=Hoek van Holland - 's-Gravenzande
TIME=44069.31984953704
DEPARTURE=0
VEHICLE=keestruck
VEHICLEPROFILEVERSION=undefined
STATION1=town,3151AWHoekvanHolland,PrinsHendrikstraat248|413094|5197699
STATION2=town,2691GK's-Gravenzande,OranjeNassaustraat24|417558|5199928

[COORDINATES]
STATION1=459340,6788361
STATION2=464303,6792386

[DESCRIPTION]
STATION1=NL 3151AW,Hoek van Holland,Prins Hendrikstraat 248,,,,,-1.000,,,,,,0,,0,,,,,,,,
STATION2=NL 2691GK,'s-Gravenzande,Oranje Nassaustraat 24,,,,,0.000,,,,,,0,,0,,,,,,,,

[LINKTYPES]
STATION1=0
STATION2=0

[CARGO]

[SOFT VIAPOINTS]

[COMMENT]
STATION1=comment
STATION2=

[STAYTIME]

[TIMEWINDOW]

[TIMEWINDOW2]

[TIMEWINDOW3]

[TIMEWINDOWDATE]

[TIMEWINDOWDATE2]

[TIMEWINDOWDATE3]

[ORDERDETAILS]
STATION1=|NONE|12|EUR|info
STATION2=|UNCHANGED|||

[ORDERS]

[SELLINGPRICE]
STATION1=
STATION2=

[STAYWITHINTIMEWINDOW]

These formats can also be imported.

These formats work with a pickup line and a delivery line per 'opdracht'. So for an order from hvh to haarlem you get something like

output
NL;3151AW;;;0;;;;;;;;;;4000;0;;;order 1;;;;;;;;;UNCHANGED;
NL;2021RB;;;0;;;;;;;;;;0;4000;;;order 1;;;;;;;;;UNCHANGED;

First comes the pickup amount then