Scheduled Routes

Scheduled Routes -sovellusliittymän yleiskatsaus

Suunnittele ja optimoi ajoneuvokannan reitit ottaen huomioon palvelun aikarajat, kapasiteettirajoitukset, liikenneolosuhteet ja kuljettajien tauot. Lähetä ongelma ja hanki optimoitu ratkaisu.

Tämä sovellusliittymä on suunniteltu parantamaan ajoneuvokantojen reittisuunnittelua ja aikataulutusta ottaen huomioon keskeiset rajoitteet, kuten palvelun aikarajat, kapasiteettirajoitukset ja liikenneolosuhteet. Sovellusliittymän avulla yritykset voivat merkittävästi parantaa toimitusten tehokkuutta, alentaa toimintakustannuksia ja säästää arvokasta aikaa optimoitujen reittisuunnittelu- ja aikataulutusratkaisujen avulla.

API ratkaisee pohjimmiltaan ajoneuvoreititysongelman (VRP), johon sisältyy tavaroiden nouto ja toimitus. Tässä ongelmassa lasketaan ajoneuvokannalle tehokkaimmat reitit, joilla se voi käydä useissa kohteissa suorittamassa nouto- ja toimitustehtäviä samalla kun noudatetaan rajoituksia, kuten aikavälejä, ajoneuvon kapasiteettia ja saatavuutta.

Lisäksi sovellusliittymä tukee aikataulun dynaamisia muutoksia tai uudelleenoptimointia. Jos joudut muuttamaan olemassa olevaa aikataulua uusien tilausten, peruutusten tai muiden muutosten vuoksi, voit toimittaa päivitetyn kuvan aikataulustasi määrittelemällä toimeksiantojen tilat ja ajoneuvojen sijainnit. Sovellusliittymä optimoi tämän jälkeen aikataulun uudelleen näiden muutosten mukaisesti, mikä varmistaa toiminnan jatkuvan tehokkuuden.

Lisätietoja siitä, miten pääset nopeasti alkuun ja aloitat API:n käytön, löydät kohdasta Aloitus. Opetusohjelmat-osiosta löytyy myös useita lyhyitä opetusohjelmia.

Julkaisuhistoria
  • Versiossa 1.1 lisättiin tuki reittimallien käytölle.
  • Versiossa 1.2 lisättiin tuki joustavalle ajoneuvokapasiteetin määrittelylle.
Aloita tästä

Pikaopas

Scheduled Routes on asynkroninen sovellusliittymä: lähetä reititys- ja aikataulutusongelma, vastaanota viitetunnus ja tarkista kyseistä tunnusta, kunnes optimoitu ratkaisu on valmis.

1. Kirjaudu sisään

Lähetä pyynnöt siten, että Authorization-otsikossa on API-käyttöoikeustunnus.

2. Ilmoita ongelmasta

Käyttö POST /raas/optimization ja problem hyötykuorma.

3. Hae ratkaisu

Käyttö GET /raas/optimization/{id} kunnes ratkaisu palautetaan.

Turvallisuus

Todentaminen

Pyynnöt käyttävät kantajan pääsytunnusta Authorization otsikko. Korvaa YOUR_ACCESS_TOKEN käyttämällä luomaasi API-käyttötunnusta.

HTTP-otsikko
Authorization: Bearer YOUR_ACCESS_TOKEN
Julkaisukelpoisia esimerkkejä

Alkuperäisessä lähdekoodissa oli esimerkkejä kantajatunnuksista ja testitunnuksista. Tässä WordPress-yhteensopivassa tiedostossa on säilytetty esimerkit ja ohjeet, mutta siinä käytetään paikkamerkkejä, kuten YOUR_ACCESS_TOKEN, YOUR_EMAIL, ja YOUR_PASSWORD jotta tunnistetietoja ei julkaista vahingossa.

API:n elinkaari #

API tarjoaa kaksi keskeistä menetelmää reitityksen ja aikataulujen optimoinnin hallintaan:

  • Optimointi-POST — Lähetä reititys- ja aikataulutusoptimointiongelma. Kun olet lähettänyt POST-pyynnön, saat yksilöllisen viitetunnuksen.
  • Optimointi GET — Hae lähetetyn ongelman tila käyttämällä POST-menetelmällä saatua yksilöllistä viitetunnusta. Jos optimointiratkaisu on valmis, voit hakea optimointiongelman ratkaisun.
Käsitteet

Miten optimointi toimii #

Ratkaise ajoneuvokannan reititys- ja aikataulutusoptimointiongelma seuraavasti:

  1. Määritä ongelma. Aloita hahmottelemalla ongelmasi ongelma-osiossa määritetyn mallin mukaisesti.
  2. Lähetä ongelma. Käytä POST-menetelmää, kuten kohdassa Aloitus on kuvattu, lähettääksesi ongelmasi sovellusrajapinnalle.
  3. Hae ratkaisu. Hae optimointiongelmasi ratkaisu GET-menetelmällä. Ratkaisun muoto on kuvattu kohdassa Ratkaisu.

Lisätietoja sovellusrajapinnassa käytetyistä termeistä löytyy sanastosta. Luettelo usein kysytyistä kysymyksistä löytyy UKK-osiosta.

POST /raas/optimization #

Käytä tätä menetelmää reitti- ja aikataulutusoptimointiongelman lähettämiseen sovellusrajapinnalle. Kun optimointia koskeva POST-pyyntö on lähetetty onnistuneesti, sovellusrajapinta palauttaa vahvistusvastauksessa yksilöllisen viitetunnuksen. Käytä tätä yksilöllistä tunnusta varsinaisen ratkaisun hakemiseen optimoinnin GET-menetelmällä (katso seuraava luku).

Esimerkkipyyntö (cURL)

Esimerkki optimointiongelman lähettämisestä POST-menetelmällä, jossa käytetään esimerkkitunnusta ja -dataa. Tässä esimerkissä syötettävä ongelma on tiedostossa nimeltä payload.json. Korvaa esimerkkitunnus YOUR_ACCESS_TOKEN omalla tunnuksellasi. Syöttöongelman rakenne on määritelty tiedostossa Ongelma osio.

POSTbash · curl
curl -X POST "https://iq.scheduledroutes.ddswireless.net/raas/optimization" 
     -H "Content-Type: application/json" 
     -H "Authorization: Bearer YOUR_ACCESS_TOKEN" 
     -d @payload.json

Vastausmalli

Kun olet lähettänyt POST-menetelmän, saat seuraavanlaisen vastausviestin:

json · vastaus
{
 "id": "string",
 "message": "string",
 "status": "string",
 "error" : "string"
}

Jos lähetys onnistuu, status tulee olemaan 202, jossa message jossa lukee ”hyväksytty” ja id joka edustaa asynkronisen toiminnon yksilöllistä tunnistenumeroa. Tätä tunnusta käytetään toiminnon tilan seuraamiseen ja tulosten hakemiseen myöhemmin.

Jos virhe ilmenee, status ilmoittaa virhekoodin, id on nolla tai tyhjä, message on ”epäonnistuminen”, ja error kuvailee virheen. Lisätietoja on alla olevissa POST-tilakoodeissa.

Esimerkkipyyntö (Windows PowerShell)

Alla oleva komentosarja osoittaa, miten POST-pyyntö tehdään käyttämällä esimerkkihyötykuormaa Windows PowerShellissä. Se olettaa, että syötehyötykuorma on tallennettu tiedostoon nimeltä payload.json, ja API-käyttöoikeustunnus tallennetaan token.txtSuorituksen jälkeen luotu tunnus kirjoitetaan kohteeseen id.txtSuorittaaksesi PowerShellin, kirjoita PowerShell Käynnistä-valikkoon tai komentoriville.

POSTpowershell
$token = Get-Content token.txt -Raw
$headers = @{
    Authorization = "Bearer $token"
    "Content-Type" = "application/json"
}
$body = Get-Content payload.json -Raw
$response = Invoke-RestMethod -Uri "https://iq.scheduledroutes.ddswireless.net/raas/optimization" -Method Post -Headers $headers -Body $body
$response.id | Out-File -Encoding utf8 id.txt
Write-Output $response

POST-tilakoodit

KoodiKuvausLisähuomautukset
202Pyyntö hyväksyttiin käsiteltäväksi.Palautetaan viitetunnus, jota voit käyttää GET-pyynnön kanssa ratkaisun hakemiseen, kun se on valmis.
400Syötteen validointi epäonnistui (Huono pyyntö).Puuttuva/virheellinen parametri tai väärä arvotyyppi. Tarkista syötetyt tiedot ja yritä uudelleen.
403Luvaton pyyntö.Tämä tapahtuu, kun todennus epäonnistuu.
404Pyydettyä polkua ei löydy.Tämä tapahtuu, kun käytetään väärää polkua.
429Liian monta pyyntöä.Nopeusraja ylitetty (kyselyitä minuutissa tai kiintiö ylitetty).
500Sisäinen palveluvirhe.Ongelma meidän puolellamme. Ota yhteyttä osoitteeseen support@ddswireless.com .

GET /raas/optimization/{id} #

Tällä menetelmällä voit hakea optimoidun ratkaisun optimointitehtäville, jotka on luotu Optimization POST -menetelmällä. Tätä varten sinun on määritettävä POST-menetelmästä saatu viitetunnus.

Esimerkkipyyntö (cURL)

Esimerkki API:n vastauksen hakemisesta GET-menetelmällä käyttämällä tunnusta. Korvaa ID URL-osoitteeseen POST-menetelmällä saamasi tunnisteen ja muista käyttää omaa API-käyttöoikeustunnustasi.

HAEbash · curl
curl -X GET "https://iq.scheduledroutes.ddswireless.net/raas/optimization/ID" 
     -H "Content-Type: application/json" 
     -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Esimerkiksi, jos ID on yhtä suuri kuin 5, käytä tätä:

HAEbash · curl
curl -X GET "https://iq.scheduledroutes.ddswireless.net/raas/optimization/5" 
     -H "Content-Type: application/json" 
     -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Vastausmalli

json · vastaus
 {
  status: "string",
  message: "string",
  error: "string",
 "solution": {
      "statistics": {},
      "routes": []
      "unassigned": [],
      }  
}

Jos ratkaisu on valmis, statistics, routes, ja unassigned täytetään saadun ratkaisun perusteella. Muuten, samalla tavalla kuin POST-menetelmässä, status, message, ja error näyttää tilan tai virheen.

Tulostusratkaisun rakenne on määritelty Ratkaisu -osiossa.

Esimerkkipyyntö (Windows PowerShell)

Alla oleva skripti osoittaa, kuinka tehdään GET-pyyntö käyttämällä POST-menetelmällä luotua tunnusta. Siinä oletetaan, että tunnus on tallennettu tiedostoon nimeltä id.txt, ja API-käyttöoikeustunnus tallennetaan token.txtSuorituksen jälkeen luotu vastaus kirjoitetaan kohteeseen response.txt.

HAKUpowershell
$token = Get-Content token.txt -Raw
$id = Get-Content id.txt -Raw
$headers = @{
    Authorization = "Bearer $token"
    "Content-Type" = "application/json"
}

$url = "https://iq.scheduledroutes.ddswireless.net/raas/optimization/$id"

$response = Invoke-RestMethod -Uri $url -Method Get -Headers $headers
$response | ConvertTo-Json -Depth 10 | Out-File -Encoding utf8 response.txt

Hae tilakoodit

KoodiKuvausLisähuomautukset
200Pyyntö on onnistunut.Ratkaisu palautetaan kautta statistics, routes, ja unassigned.
202Pyyntö hyväksyttiin, mutta sitä ei ole vielä käsitelty.Tila on odottamassa. Tarkista ratkaisun valmius myöhemmin uudelleen.
400Pyyntöä ei voitu käsitellä (Bad Request).Toteutettavaa ratkaisua ei voitu luoda virheellisten syötteiden tai parametrien vuoksi.
401Luvaton pyyntö.Käyttäjän todennus vaaditaan. Kelvollisia tunnistetietoja ei vastaanotettu.
500Sisäinen palveluvirhe.Jokin meni pieleen meidän puolellamme. Ota yhteyttä support@ddswireless.comKentät, kuten statistics, routes, ja unassigned tulee olemaan tyhjä.
Esimerkkejä

Koodimuodot

Käytä samaa päätepisteen prosessia haluamassasi muodossa. Näissä esimerkeissä on säilytetty API-viitteen mukainen pyynnön rakenne ja käytetty julkaisukelpoisia paikkamerkkejä.

Lähetä optimointiongelma

cURL
curl -X POST "https://iq.scheduledroutes.ddswireless.net/raas/optimization" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -d @payload.json
Python
import json
import requests

url = "https://iq.scheduledroutes.ddswireless.net/raas/optimization"
headers = {
    "Content-Type": "application/json",
    "Authorization": "Bearer YOUR_ACCESS_TOKEN",
}

with open("payload.json", "r", encoding="utf-8") as payload_file:
    payload = json.load(payload_file)

response = requests.post(url, headers=headers, json=payload, timeout=60)
response.raise_for_status()
print(response.json())
PowerShell
$token = Get-Content token.txt -Raw
$headers = @{
    Authorization = "Bearer $token"
    "Content-Type" = "application/json"
}
$body = Get-Content payload.json -Raw
$response = Invoke-RestMethod -Uri "https://iq.scheduledroutes.ddswireless.net/raas/optimization" -Method Post -Headers $headers -Body $body
$response.id | Out-File -Encoding utf8 id.txt
Write-Output $response

Hae optimointitulokset

cURL
curl -X GET "https://iq.scheduledroutes.ddswireless.net/raas/optimization/ID" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"
Python
import requests

optimization_id = "ID"
url = f"https://iq.scheduledroutes.ddswireless.net/raas/optimization/{optimization_id}"
headers = {
    "Content-Type": "application/json",
    "Authorization": "Bearer YOUR_ACCESS_TOKEN",
}

response = requests.get(url, headers=headers, timeout=60)
response.raise_for_status()
print(response.json())
Viite

Esineet

Pyyntöobjekti keskittyy problem. Vastausobjekti on keskitetty solution. Alkuperäiset kenttäviitteet, esimerkit, kaaviot, huomautukset ja säännöt on säilytetty alla.

Ongelma-objekti #

The Ongelma Tämä kokonaisuus edustaa reititys- ja aikataulutusongelmaa. Kuten alla olevasta kuvasta näkyy, se koostuu neljästä pääosasta: fleet, jobs, objective, ja configuration. Näistä fleet ja jobs ovat pakollisia, kun taas objective ja configuration ovat valinnaisia.

Kaavio Problem-objektin rakenteesta
Sijaintien määrittäminen

Kun määrität sijainnin tai osoitteen sovellusrajapinnassa, käytä WGS84-maantieteellisiä koordinaatteja, joissa on tarkkuuden varmistamiseksi vähintään viisi desimaalia. Esimerkiksi osoite "1600 Amphitheatre Parkway, Mountain View, Kalifornia" jonka leveysaste on 37.423021 ja pituusaste -122.083739. Voit määrittää sen seuraavasti: "location": {"lat": 37.423021, "lng": -122.083739} tai kuten [37.423021, -122.083739].

Aikaleimat ja aikavyöhykkeet

API käyttää aikaleimoissa ISO 8601 -muotoa, joka sisältää aikavyöhyketiedot, jotta voidaan määrittää paikallinen aika alueelle, jolle reititys ja aikataulutus on optimoitava. Esimerkiksi, 2024-07-31T14:45:30-08:00 tarkoittaa 31. heinäkuuta 2024 klo 14.45.30 PST, joka on 8 tuntia jäljessä koordinoidusta maailmanaikasta (UTC).

Syötteen datakentässä on käytettävä johdonmukaisesti samaa paikallista aikavyöhykettä. Jos järjestelmä havaitsee useita aikavyöhykkeitä, sovellusrajapinta palauttaa virheilmoituksen. Tulostusvastauksessa olevat aikataulun mukaisten pysähdysten ajat ilmoitetaan samassa muodossa kuin syötteen datakentässä on määritetty. Esimerkiksi, jos määrität 2024-07-31T14:45:30-08:00 syöttämissäsi tiedoissa myös tulosteessa näkyvät optimoidut reittiajat perustuvat -08:00; jos käytät +05:30 syötteenä käytetään +05:30.

Valinnaiset attribuutit

Kaikki valinnaiset attribuutit voidaan jättää pois hyötykuormasta. Tyhjät taulukot (esim. []) voidaan käyttää myös valinnaisille attribuuteille, jotka hyväksyvät taulukon.

Älä lähetä luottamuksellisia tietoja

Varmista, ettei API:lle lähetettävissä tiedoissa ole luottamuksellisia tai henkilökohtaisia tietoja. Vältä esimerkiksi käyttämästä todellisia tunnisteita, kuten ajoneuvon rekisterinumeroita, ajoneuvon tunnisteena tai työn/tehtävän tunnisteina.

Komponenttien yhteenveto

kalustoVaaditaan

Määrittää ajoneuvojen luettelon sekä niihin liittyvät tiedot, kuten työvuorosuunnitelmat, lähtö- ja päätepisteet, tauot, kapasiteetit ja taidot. Jokaiselle ajoneuvolle voi määrittää yhden tai useamman työvuorosuunnitelman (alku- ja loppuajat sekä paikat), yhden tai useamman tauon (aikaväli, paikka ja kesto), yhden tai useamman kapasiteettityypin käytettävissä olevine yksiköineen (moniulotteiset yksiköt, kuten tilavuus, massa tai koko) sekä yhden tai useamman taidon, joiden avulla ajoneuvo pystyy suorittamaan tiettyjä tehtäviä. Voit esimerkiksi määrittää yhdelle ajoneuvolle taitoiksi ”hitsauskone” ja ”happisäiliö” ja toiselle ajoneuvolle taidoksi ”nostin”; jos työ vaatii nostinta, vain tällä taidolla varustettu ajoneuvo voi suorittaa sen. Voit myös asettaa rajoituksia, kuten pysähdysten enimmäismäärän ja enimmäismatkan (mailina).

työpaikatVaaditaan

Määrittää luettelon tehtävistä, jotka ajoneuvot suorittavat fleet. Jokainen työtehtävä voi koostua useista osatehtävistä, jotka voivat olla joko pelkästään noutoja, pelkästään toimituksia tai sekä noutoja että toimituksia. Niitä ”käyntitehtäviä”, joissa sinun on käytävä paikan päällä suorittamassa työ (esim. korjaukset, modeemin asennus), käsitellään toimitustehtävinä, riippumatta siitä, onko niissä kapasiteettivaatimusta vai ei. Jokaiselle tehtävälle voit määrittää ominaisuuksia, kuten sijainnin, aikavälin, keston, kapasiteettivaatimukset ja tarvittavat taidot. Jos optimointiohjelma ei löydä sopivaa arvioitua saapumisaikaa (ETA) tehtävälle määritetyn aikavälin sisällä, tehtävä jää osoittamatta. Joustaville tai ajallisesti epäkiireellisille tehtäville määritä laajempi aikaväli (enintään 24 tuntia).

tavoiteValinnainen

Määrittää optimoinnin tavoitteen tai strategian. Tällä hetkellä tuetaan kolmea tavoitetta:

  • Matkustusaikojen minimointi — oletusstrategia; minimoi ajoneuvokannan kokonaismatkustusaikaa samalla, kun määritetyt toimeksiannot suoritetaan.
  • Reittien määrän minimointi — vähentää töiden suorittamiseen tarvittavien ajoneuvojen määrää. Vastineeksi tämä voi pidentää kokonaiskuljetusaikaa tai lisätä yksittäisten ajoneuvojen kuormitusta.
  • Työmäärän tasapainottaminen reittien välillä — jakaa työmäärän tasaisesti koko ajoneuvokannan kesken. Tämä tasapainottaminen voi pidentää kokonaisajoaikaa.
asetuksetValinnainen

Muokkaa API-asetuksia tai oletusarvoja. Voit esimerkiksi määrittää, sisällytetäänkö API-vastaukseen yhteenveto optimointitilastoista (kuten kokonaismatka-aika ja -matka) tai luettelo määrittämättömistä tehtävistä.

Syöttöpyyntökaavio #

Reitinoptimointiongelman ratkaisemista koskevan syöttöpyynnön rakenne on seuraava. Ongelman lähettämiseksi tämä pyyntö on sisällytettävä POST-menetelmään, kuten kohdassa ”Aloitus” on kuvattu.

json · pyynnön rakenne
 "problem": {
      "fleet": required 
        [
          "shifts": [optional]
          "capacities": [required]
          "limits": {optional}
          "skills" : [optional]
          "id": required
          "routeTemplateId" : optional
          "maxInstances": optional   
        ],
      "jobs": required
        [
          "pickups": [...] 
          "deliveries": [...]
          "id" : required
        ]
      "objective": optional
      "configuration": {optional}
      "version": optional
    }

Reitinoptimointiongelmassa ajoneuvokanta pyrkii hoitamaan joukon toimeksiantoja tehokkaasti. Yllä olevan kaavion avulla voit määritellä ajoneuvokantasi ja toimeksiantosi. API:n nykyisessä versiossa kukin toimeksianto voi olla:

  1. Pelkästään nouto-tehtävät — näihin kuuluu tavaroiden nouto reitin varrelta ja niiden toimittaminen reitin päätepisteeseen.
  2. Pelkästään jakelutehtävät — edellyttävät sellaisten tavaroiden jakelua, jotka on lastattu ajoneuvoon reitin alussa.
  3. Nouto- ja toimitustehtävät yhdessä – yhdistää molemmat toimet: tavaran noutamisen yhdestä paikasta ja sen viemisen toiseen paikkaan.
Työvaatimukset

Tehtävälle on määritettävä vähintään yksi työtehtävä ja yksi ajoneuvo. Niitä ”käyntitehtäviä”, joissa on mentävä paikan päälle (esim. korjaukset, modeemien asennukset), on pidettävä jakelutehtävinä riippumatta siitä, onko niille asetettu kapasiteettivaatimuksia.

Lisäksi:

  1. Jospa vain pickups Jos työhön toimitetaan esine, sitä pidetään noutotyönä.
  2. Jospa vain deliveries Jos työhön toimitetaan esine, sitä pidetään pelkästään toimitustyönä.
  3. Kun molemmat pickups ja deliveries jos nämä tiedot on annettu, toimitus luokitellaan nouto- ja toimitustyöksi.
Nouto- ja toimitussäännöt

Sovellusliittymä (API) ei tue toimeksiantoja, joissa on useita noutoja ja useita toimituksia. Toisin sanoen, kun kyseessä on ”nouto ja toimitus” -toimeksianto:

  • The pickups taulukon on sisällettävä vain yksi noutotehtävä.
  • The deliveries taulukon on sisällettävä vain yksi toimitustehtävä.

API ei myöskään tue toimeksiantoja, joissa ei ole noutoja eikä toimituksia. Luokittelusäännöt:

  • Jos vain pickups on määritelty, työ luokitellaan pickup-ankkuroitu Job.
  • Jos vain deliveries on määritelty, työ luokitellaan toimitusankkuroitu Job.
  • Jos sekä nouto että toimitus on määritelty, ankkuri on se, joka sisältää palveluikkunan .
  • Jos sekä noudolla että toimituksella on palveluikkunat, työtä pidetään nouto-ankkuroituna .

Jokaiselle tehtävälle voidaan määritellä erilaisia ominaisuuksia ja rajoituksia, kuten kapasiteettivaatimukset, palvelun aikarajat ja vaadittavat taidot. Käyntitehtävät, joissa sinun on käytävä tietyissä paikoissa suorittamassa tehtäviä (esim. korjauksia), voidaan nähdä erikoistuneena toimitustehtävänä (kapasiteettivaatimuksilla tai ilman). Tehtävät osoitetaan ajoneuvoille, joiden kapasiteetti tai osaaminen vastaa tehtävän vaatimuksia. Esimerkiksi, jos tehtävä vaatii nostinta tai tikkaita, vain ajoneuvoja, joissa on nostin tai tikkaat, käytetään kyseisen tehtävän suorittamiseen.

problem — kenttäviite

ongelma Pakollinen Määrittää reititys- ja aikataulutusoptimointiongelman, jonka haluat ratkaista. Se koostuu seuraavista attribuuteista.

fleet

vaadittu laivasto Määrittää laivastotiedot. Se on laivasto-objektien taulukko. Jokainen laivasto-objekti koostuu seuraavista attribuuteista:

idkokonaislukuPakollinen

Ajoneuvon yksilöllinen tunniste.

vuorottaulukkoValinnainen

Työvuoro-objektien taulukko. Jokainen työvuoro-objekti sisältää tiedot työvuoron alkamis- ja päättymispaikoista sekä -ajoista, samoin kuin taulukon tauko-objekteja, joista kukin sisältää tauon alkamis- ja päättymispaikat sekä -ajat. Työvuoro-objekteja voidaan määritellä useita, mutta niiden on oltava toisistaan erillisiä. Kunkin työvuoro-objektin osat:

aloitus

Vuoron alkamisaika ja aloituspaikka.

  • timevalinnainen. Määrittää työvuoron alkamisajan. Jos aikaa ei ole määritetty, oletusarvona on nykyisen päivän kello 00:00:00 (keskiyö).
  • locationvalinnainen. Lähtöpaikan maantieteelliset koordinaatit (leveys- ja pituusaste). Määritä taulukkomuodossa [A,B] (A = leveysaste, B = pituusaste) tai muodossa {"lat": A,"lng": B}.
loppu

Vuoron päättymisaika ja -paikka.

  • timevalinnainen. Määrittää työvuoron päättymisajan. Jos aikaa ei ole määritetty, oletusarvona on nykyisen päivän kello 23:59:00.
  • locationvalinnainen. Päätepisteen maantieteelliset koordinaatit. Määritä seuraavasti: [A,B] tai {"lat": A,"lng": B}.
katkokset taulukko Valinnainen
  • serviceWindowvaaditaan, jos breaks-ominaisuutta käytetään. Aikajakso, jonka aikana tauko voi tapahtua.
  • durationvaaditaan, jos breaks-ominaisuutta käytetään. Kokonaisluku, joka määrittää tauon keston sekunteina.
  • locationvalinnainen. Murtumakohdan sijainti, kuten [A,B] tai {"lat": A,"lng": B}. Jos sijaintia ei mainita, tauko on ”vapaa”, eli kuljettaja voi pitää sen missä tahansa itselleen sopivana ajankohtana.

Esimerkki — shifts

json
"shifts": [{
  "start": {
    "time": "2020-07-04T09:00:00-08:00",
    "location": {"lat": 52.46642, "lng": 13.28124}
  },
  "end": {
    "time": "2020-07-04T18:00:00-08:00",
    "location": [54.21981, 14.01237]
  },
  "breaks": [
    {
      "serviceWindow": ["2020-07-04T12:00:05-08:00","2020-07-04T14:05:05-08:00"],
      "duration": 1200,
      "location": {"lat": 53.70645, "lng": 12.34156}
    },
    {
      "serviceWindow": ["2020-07-04T16:00:00-08:00","2020-07-04T16:45:00-08:00"],
      "duration": 600,
      "location": {"lat": 51.46642, "lng": 12.28124}
    }
    ]
  }]
kapasiteetittaulukkoVaadittu

Kapasiteettiobjektien taulukko. Jokainen kapasiteettiobjekti on avain-arvo-objekti, joka on määritelty seuraavilla avaimilla:

  • namevaaditaan. Merkkijono, joka määrittää kapasiteettityypin nimen (esim. "pyörätuoli", "laatikko", "istuin", "roskakori").
  • unitsvaaditaan. Kokonaisluku, joka määrittää kyseisen kapasiteettityypin käytettävissä olevat yksiköt.

Jos ajoneuvoon mahtuu esimerkiksi 2 istumapaikkaa ja 20 pakettia, voit määrittää sen kapasiteetin seuraavasti:

json
    "capacities": [
        {
        "name": "seat",
        "units": 2,
        },
        {
        "name": "package",
        "units": 20,
        }        
      ]
taidotmerkkijonojen taulukkoValinnainen

Luettelo ajoneuvojen ominaisuuksista tai varusteista, joista kukin on merkitty sovelluksellesi ominaisella merkkijonolla. Tämän avulla voit mukauttaa ajoneuvojen ominaisuuksia vastaamaan niiden tehtävien vaatimuksia. Esimerkki: "skills": ["lift","fridge","oxygen tank"]

rajoituksetobjektiValinnainen

Määrittää ajoneuvoon sovellettavat rajoitukset.

  • maxDistancevalinnainen. Kokonaisluku, joka ilmaisee ajoneuvon suurimman sallitun etäisyyden mailina.
  • maxStopsvalinnainen. Kokonaisluku, joka määrittää sen, kuinka monta pysähdystä (nouto- tai toimitustehtävää) ajoneuvo voi suorittaa yhden työvuoron aikana.
  • lifoDepthvalinnainen. Kokonaisluku, joka määrittää ajoneuvon LIFO-syvyyden (Last In First Out).
json
  "limits": {
    "lifoDepth" : 1,
    "maxDistance": 3000,
    "maxStops" : 20,
  }
viimeisinTunnettuSijaintiobjektiVain uudelleenoptimointi

Ilmoittaa ajoneuvon viimeisen tunnetun sijainnin määritettynä ajankohtana. Tämä tieto on ratkaisevan tärkeää, kun käynnissä olevaa reittiä optimoidaan uudelleen uusien muutosten, kuten ajokelvottomien ajoneuvojen, myöhästyneiden toimeksiantojen, uusien toimeksiantojen tai peruutettujen toimeksiantojen, huomioon ottamiseksi. Kun olemassa olevaa aikataulua optimoidaan uudelleen, sinun on ilmoitettava kaikkien mukana olevien ajoneuvojen sijainti.

json
"lastKnownLocation": {
      "location": {"lat":53.45612, "lng":12.65421},
      "time" : "2020-07-04T12:00:05-08:00"
      }
reittimallitunnuskokonaislukuValinnainen

Reittimallin määrittämiseen käytettävä yksilöllinen tunniste. API tukee ”reittimallien” käsitettä, jonka avulla voit määrittää tietyn ajoneuvotyypin tekniset tiedot ja pyytää API:ta luomaan tietyn määrän tällaisia ajoneuvoja optimointia varten. Reittimalli sisältää samat tiedot kuin reitti tai ajoneuvo, mutta voit määrittää ”koko”-parametrin, jota kutsutaan maxInstances sitä varten. Oletetaan esimerkiksi, että sinulla on 100 ajoneuvoa. Voit määrittää 2 tai 3 reittimallia:

  1. Vuoro klo 6–18, kapasiteetti 4, koko = 60
  2. Vuoro klo 13–01, kapasiteetti 4, koko = 50
  3. Vuoro klo 6–20, kapasiteetti 10, koko = 35

Tämä tarkoittaa, että sovellusliittymä voi tarvittaessa luoda automaattisesti jopa 60 ajoneuvoa mallin 1 avulla, 5 ajoneuvoa mallin 2 avulla ja 35 ajoneuvoa mallin 3 avulla.

maxInstanceskokonaislukuValinnainen

Jos routeTemplateId on tarjottu, maxInstances määrittää, kuinka monta reittimallia tulisi luoda määritetyn reittimallin perusteella.

Säännöt tunnuksille id, routeTemplateId ja maxInstances
  • Tasan yksi jostakin id tai routeTemplateId on käytettävä, ei koskaan molempia.
  • id ja maxInstances ei voi käyttää yhdessä.
  • Jos molemmat routeTemplateId ja maxInstances tarjotaan, API käyttää reittimallin malli reittien luomiseksi.

jobs

työpaikat Vähintään yksi vaaditaan Työpaikkaobjektien joukko. Jokaisella työpaikkaobjektilla on seuraavat ominaisuudet:

idkokonaislukuPakollinen

Työn yksilöllinen tunniste.

anturittehtäväobjektien taulukkoValinnainen

Taulukko, joka koostuu tehtäväobjekteista, joista kukin edustaa nouto-tehtävää.

toimituksetTask-objektien taulukkoValinnainen

Taulukko, joka koostuu tehtäväobjekteista, joista kukin edustaa toimitus- (tai palautus-)tehtävää.

Työn nouto- ja toimitusasetukset
  • API ei tue töitä, joissa on useita noutoja ja toimituksia .
  • API ei tue töitä, joissa ei ole noutoja eikä toimituksia .
  • Jos vain pickups on määritelty, työ luokitellaan nouto-ankkuroitu työ.
  • Jos vain deliveries on määritelty, työ luokitellaan toimitusankkuroitu työ.
  • Jos työhön kuuluu sekä nouto että toimitus, ankkuri määräytyy palveluikkunan määrittävän tehtävän mukaan.
  • Jos molemmilla tehtävillä on palveluikkunat, työtä käsitellään nouto-ankkuroituna työnä .

Tehtäväobjekti

Jokainen tehtäväobjekti koostuu seuraavista attribuuteista:

idkokonaislukuPakollinen

Tehtävän yksilöllinen tunniste.

sijaintiobjekti tai taulukkoPakollinen

Avain-arvo-objekti, joka määrittää sen paikan maantieteelliset koordinaatit (leveys- ja pituusaste), jossa tehtävä on suoritettava. Määritä taulukkomuodossa [A,B] (A = leveysaste, B = pituusaste) tai muodossa {"lat": A,"lng": B}.

json
"location": {"lat": 52.46642, "lng": 13.28124}
"location": [52.46642, 13.28124]
palveluWindowstaulukkoValinnainen / Pakollinen

Määrittää tehtävän suorittamisen aikavälin (pakollinen tai valinnainen käyttötapauksesta riippuen; ks. edellä mainitut nouto- ja toimituspalvelut). Aikaväli on muodoltaan seuraavanlainen taulukko [A, B] jossa A ja B ovat aloitus- ja lopetusaika. API pyrkii laskemaan arvioidun saapumisajan (ETA) määritetyn aikavälin sisällä; jos tämä ei ole mahdollista, tehtävä merkitään määrittelemättömäksi. Ajat A ja B määrittelevät aikaisimman ja myöhäisimmän ajan, johon mennessä ajoneuvon on saatava tehtävä valmiiksi. Joustavien tai aikataulultaan joustavien tehtävien osalta käytä mielivaltaisen suurta ikkunaa (enintään 24 tuntia), jotta API:lla on enemmän joustavuutta muiden tehtävien aikatauluttamisessa. API:n nykyinen versio tukee vain yhtä palveluaikaa tehtävää kohti. Pelkästään noutoja tai pelkästään toimituksia koskevien tehtävien osalta palveluaika on pakollinen.

json
"serviceWindows": ["2024-08-30T09:00:00-08:00",
                   "2024-08-30T21:00:00-08:00"]
kestokokonaisluku tai objektiPakollinen

Määrittää tehtävän keston sekunteina. Se voi olla joko kokonaisluku tai avain-arvo-objekti, jossa on seuraavat avaimet:

  • fixed — tehtävän kiinteä kesto (sekunteina) (esim. pysäköintipaikan etsiminen, hissin laskeminen).
  • service — tehtävän suorittamiseen kuluva aika (sekunteina).
json
"duration": 1950
   OR
"duration": {"fixed":150, "service": 1800}
kysyntätaulukkoValinnainen

Tehtävän kapasiteettivaatimusten joukko. Kunkin vaatimuksen objektin rakenne on identtinen laivastotietueen kapasiteettiobjektin rakenteen kanssa. Jokainen kapasiteettikohde koostuu name (merkkijono) ja sen units (kokonaisluku). Määritettyjen nimien on vastattava niitä, jotka on määritelty laivue-entiteetin kapasiteettiobjektissa. Esimerkiksi jos työ vaatii kapasiteettia kahdelle matkustajapaikalle ja 20 paketille:

json
"demand": [
    {
    "name": "seat",
    "units": 2,
    },
    {
    "name": "package",
    "units": 20,
    }        
  ]
taidotmerkkijonojen taulukkoValinnainen

Tehtävän suorittamiseen tarvittavien taitojen tai varusteiden joukko, joista kukin on merkitty sovelluksellesi ominaisella mielivaltaisella merkkijonolla. Tehtävän suorittamiseen otetaan huomioon vain ne ajoneuvot, joiden taitojoukko vastaa tehtävän taitojoukkoa. Nämä taidot täsmäytetään ajoneuvokannan entiteetissä määriteltyihin taitoihin. Esimerkki: "skills": ["lift", "ladder", "welding machine"]

tilamerkkijonoVain uudelleenoptimointi

Merkkijono, joka kuvaa tehtävän tilaa: pending, in_progresstai performed. Tämä on ratkaisevan tärkeää käynnissä olevan reitin uudelleenoptimoinnin kannalta. Uusien tai vielä suorittamattomien tehtävien kohdalla aseta se arvoon pending. Jos tehtävä on jo suoritettu, aseta se tilaan performed. Jos ajoneuvo on jo saapunut paikalle ja tehtävä on käynnissä, aseta se tilaan in_progressOletusarvo on pending. Esimerkki: "status": "pending"

ajoneuvotunnuskokonaislukuVain uudelleenoptimointi

Määrittää jo aikataulutettujen tehtävien ajoneuvotunnuksen. Tämä on ratkaisevan tärkeää käynnissä olevan reitin uudelleenoptimoinnin kannalta. Oletusarvo on nolla. Aseta arvoksi nolla uusille tehtäville. Jos kyseessä on jo ajoneuvolle osoitettu tehtävä, aseta tämän attribuutin arvoksi kyseisen ajoneuvon tunnus. Esimerkki: "vehicleId": 12

etaaikaleimaVain uudelleenoptimointi

Määrittää jo aikataulutettujen töiden nykyisen arvioidun saapumisajan (ETA). Tämä on ratkaisevan tärkeää käynnissä olevan reitin uudelleenoptimoinnin kannalta. Oletusarvo on 0. Aseta arvoksi 0 uusille tai jo suoritettujen töiden osalta; olemassa olevien odottavien töiden osalta aseta arvoksi nykyinen ETA. Esimerkki: "eta": "2021-07-04T12:13:00-08:00"

objective

tavoite kokonaisluku Valinnainen   Määrittää optimointitavoitteen (strategian). Oletusarvo on 1.

ArvoStrategia
1Minimoi kokonaismatka-aika (oletusasetus)
2Reittien määrän minimointi
3Työmäärän tasapainottaminen reittien välillä

Esimerkki: "objective": 1

configuration

asetukset Valinnainen Käytetään lisäasetusten tai -määritysten määrittämiseen.

polylineTypemerkkijonoValinnainen

Määrittää kunkin reitin osalta palautettavan tulostepolyn tyypin. Yksi seuraavista: none, plain, encodedJos none, polylinjoja ei ole mukana. Jos plain, palautetaan järjestetty luettelo risteyksistä, joiden kautta kuljetaan peräkkäisten pysäkkien välillä. Jos encoded, polylinja pakataan merkkijonomuotoon, jonka voit syöttää kolmansien osapuolten navigointirajapintoihin, kuten Google Mapsiin, vaiheittaisten reittiohjeiden saamiseksi. Oletusarvo on none.

määrittelemättömät tehtävätbooleanValinnainen

Lippu, joka määrittää, onko tulostusvasteeseen sisällytettävä määrittelemättömiä tehtäviä. Oletusarvo on False. Jos API ei jostain syystä pysty osoittamaan tehtävää reitille, se merkitsee sen osoittamattomaksi.

tilastotbooleanValinnainen

Lippu, joka määrittää, onko optimointitilastot sisällytettävä tuloksena saatavaan ratkaisuun. Oletusarvo on True.

yksikötmerkkijonoValinnainen

Määrittää tulosteiden tilastojen ja laivaston rajoitusten yksiköt. Joko metric tai imperialOletusarvo on metric.

maxRideTabletaulukkoValinnainen

Määrittää kaikkien töiden enimmäiskeston laitteella. Se määritetään staattisessa taulukossa, jossa jokainen rivi on taulukko, joka sisältää kolme aika-arvoa (minuutteina): [A, B, C]. Tämä tarkoittaa, että jos työn suora matka-aika on pisteiden A ja B välillä, enimmäismatka-aika on yhtä suuri kuin "rideTime + C". Esimerkiksi yksinkertainen taulukko, jossa on kaksi riviä: "maxRideTable":[[0, 10, 30], [11, 20, 40]]. Oletusarvo on [[0, 300, 720]]. Tässä taulukossa ei saa olla päällekkäisyyksiä tai aukkoja, ja aikaväli on minuutteja.

enforceLockedTasksbooleanValinnainen

Määrittää, miten optimointimoottori käsittelee aiemmin määritettyjä tehtäviä uudelleenoptimoinnin aikana. Oletusarvo on false.

Kun asetuksena on true, kaikki uudelleenoptimointipaketin ajoneuvoille jo osoitetut toimeksiannot käsitellään lukittuina, ja niiden on pysyttävä nykyisellä ajoneuvollaan. Moottori optimoi ja osoittaa vain uusia toimeksiantoja, joille ei ole vielä osoitettu ajoneuvoa.

Kun asetuksena on false, järjestelmä voi muuttaa olemassa olevia tehtävänmäärityksiä uudelleenoptimoinnin yhteydessä. Aiemmin määritetyt tehtävät voidaan poistaa alkuperäisestä ajoneuvosta, jos tehtävänmääritys ei ole enää voimassa tai optimaalinen. Esimerkiksi alun perin klo 8.00 ajalle suunniteltu tehtävä voidaan poistaa klo 10.00 suoritettavan uudelleenoptimoinnin yhteydessä, koska tehtävää ei voida enää suorittaa asetettujen rajoitusten puitteissa.

ajoneuvon kapasiteettiobjektiValinnainen

Ajoneuvokapasiteetin määritelmille voidaan antaa nimi, ja niitä voidaan sitten käyttää ajoneuvokanta-osiossa. Tämä on erityisen hyödyllistä monimutkaisten määritelmien yhteydessä, kun ajoneuvolla voi olla useita kokoonpanoja. Jos ajoneuvoon mahtuu esimerkiksi joko (10 kävelevää matkustajaa ja 0 pyörätuolimatkustajaa) TAI (8 kävelevää matkustajaa ja 1 pyörätuolimatkustaja), voit määritellä "vehicleCapacities":{"flexBus": [[{"name": "ambulatory", "units": 10}], [{"name": "ambulatory", "units": 8},{"name":"wheelchair", "units": 1}]]}. Sitten laivaston ominaisuuksissa voit käyttää fleet[<index>].capacities: "flexBus" jokaiselle kaluston flexBus-ajoneuvolle. Ajoneuvojen nimelliskapasiteetit voidaan myös tallentaa henkilökohtaiseen asiakasprofiiliisi, jolloin ne ovat käytettävissä ilman, että niitä tarvitsee määritellä konfigurointiosassa. Jos ajoneuvon nimelliskapasiteetti löytyy sekä henkilökohtaisesta profiilistasi että kuormatiedoista, kuormatiedoissa oleva määritelmä on ensisijainen.

freezeWindowLengthkokonaisluku (minuutteina)Valinnainen

Jäähdytysikkunan kesto minuutteina. Jäähdytysikkuna on käsite, jota sovelletaan vain saman päivän optimointiin ja joka on hyödyllinen ongelman uudelleenoptimoinnissa. Jos olet esimerkiksi jo optimoinut ongelman, mutta haluat tehdä muutoksia päivän aikana, voit lähettää ongelman uudelleen (sopivilla task.status (jotta se heijastaisi jo tehtyjä toimia) ja määritä 60 minuutin jäädytysohjelma. Tämä ohjeistaa optimointiohjelmaa, että 60 minuutin ajanjakso ”nykyhetkestä” eteenpäin on kielletty: jäädytysohjelman aikana reiteille ei voi lisätä tai poistaa tehtäviä.

lifoRajoitetutKapasiteetittaulukkoValinnainen

Joukko kapasiteettityyppejä, joihin sovelletaan LIFO-rajoitusta (Last In, First Out). Esimerkki: "lifoConstrainedCapacities": ['wheelchair', 'scooter']

Esimerkki — configuration

json
"configuration": 
{
      "polylineType": "plain",
      "unassignedTasks": False,
      "statistics": True,
}

version

versio Valinnainen   Määrittää sovellusliittymän version. Oletusarvo on 1.0.

Lisää esimerkkejä

Nähdäksesi erilaisia esimerkkejä Problem ja opi käyttämään API:a eri käyttötapauksissa (esim. uudelleenoptimointi), katso Oppaat.

Tunnisteet ja aikarajat

1. Ainutlaatuiset tunnisteet. Kaikilla toimeksiannoilla on oltava yksilöllinen tunniste. Kaikilla tehtävillä on oltava yksilöllinen tunniste. Kaikilla ajoneuvoilla on oltava yksilöllinen tunniste. Toimeksianto voi jakaa tunnisteensa tehtävän tai ajoneuvon kanssa – tämä on sallittua.

2. Aikarajoitukset. Jokaiseen ongelmaan voi sisältyä useita aikaan liittyviä tekijöitä, kuten tehtävien palveluaikavälejä ja ajoneuvojen vuoroja. Sovellusliittymä (API) määrittää kaikkien arvojen pienimmän ajan. Esimerkiksi, jos pienin arvo on 2024-09-18T04:32:00-08:00, enimmäisaika lasketaan selvittämällä sen päivän keskiyö, jolloin vähimmäisaika saavutetaan, ja lisäämällä tähän aikaleimaan 33 tuntia. Tässä esimerkissä sallittu enimmäisaika on siis 2024-09-19T09:00:00-08:00. Jos jokin tehtävän vaihe (esim. ajoneuvon vaihto tai tehtävän suoritusaika) ylittää tämän rajan, sovellusliittymä palauttaa 400 virhe.

Ratkaisu

Solution-objekti #

Kun olet lähettänyt ongelman POST-menetelmällä, saat yksilöllisen viitetunnuksen. Käytä tätä viitetunnusta GET-menetelmällä, kun haluat tarkistaa lähetetyn ongelman tilan. Jos optimointiratkaisu on valmis, voit tarkastella sitä solution vastauksen kokonaisuus. Kuten alla olevasta kuvasta näkyy, solution kokonaisuus koostuu kolmesta pääosasta:

tilastot

Sisältää erilaisia mittareita, jotka antavat yleiskuvan koko ratkaisusta kaikkien reittien osalta, jolloin voit arvioida sen tehokkuutta (esimerkiksi kaikkien optimoitujen reittien kokonaismatka). Analysoimalla näitä tilastoja voit mitata tuotetun ratkaisun laatua ja tehokkuutta.

reitit

Sisältää optimoidut reitit sekä niiden pysäkit ja arvioidut saapumisajat (ETA). Se voi sisältää myös kunkin reitin moniviivan.

määrittelemätön

Sisältää luettelon määrittämättömistä tehtävistä. Jos sovellusliittymä ei pysty määrittämään tehtävää reitille optimoinnin aikana, se merkitään määrittämättömäksi. Luettelossa voi olla syyt sille, miksi kukin tehtävä on jäänyt määrittämättä, mikä antaa käsityksen rajoituksista tai ongelmista, jotka estivät tehtävän määrittämisen.

Kaavio Solution-objektin rakenteesta

Tulostusratkaisun rakenne #

API:n vastauksessa toimitettu ratkaisun malli on seuraava:

json · ratkaisu
 "solution": {
      "statistics": {},
      "routes": []
      "unassigned": [],
      }  

The solution Entiteetti edustaa reitinoptimointiongelman ratkaisua ja koostuu seuraavassa kuvatuista attribuuteista.

statistics

Sisältää koko ratkaisun tilastotiedot. Se koostuu seuraavista ominaisuuksista:

etäisyys
  • totalDistance — koko ajoneuvokannan kulkema kokonaismatka, mukaan lukien kunkin ajoneuvon lähtöpaikasta päätepisteeseen kulkema matka.
  • revenueDistance — koko ajoneuvokannan kulkema kokonaismatka, mukaan lukien kunkin ajoneuvon ensimmäisestä pysäkistä viimeiseen pysäkkiin kuljettu matka. Siihen ei sisälly ajoneuvon lähtöpaikasta ensimmäiseen pysäkkiin tai viimeisestä pysäkistä ajoneuvon päätepisteeseen kuljettu matka.
ajoneuvot
  • used — ratkaisussa käytettävien ajoneuvojen määrä suunniteltujen töiden ja tehtävien suorittamiseksi.
  • unused — käyttämättömien ajoneuvojen määrä.
työpaikat
  • scheduledTasks — ajoitettujen tehtävien määrä.
  • unassignedTasks — määrittelemättömien tehtävien määrä.
kertaa
  • totalHours — koko ajoneuvokannan matkustusaika yhteensä, mukaan lukien aika, joka kuluu kunkin ajoneuvon lähtöpaikasta määränpäähän.
  • revenueHours — koko ajoneuvokannan matkustustuntien kokonaismäärä, mukaan lukien kunkin ajoneuvon ensimmäisestä pysäkistä viimeiseen pysäkkiin kuluva aika. Siihen ei lasketa aikaa, joka kuluu ajoneuvon lähtöpaikasta ensimmäiseen pysäkkiin tai viimeisestä pysäkistä ajoneuvon päätepisteeseen.

Esimerkki — statistics

json
"statistics": {
    "distance": {
        "totalDistance": 42,
        "revenueDistance": 25
    },
    "vehicles": {
        "used": 2,
        "unused": 0
    },
    "jobs": {
        "scheduledTasks": 3,
        "unassignedTasks": 0
    },
    "times": {
        "totalHours": 11.6,
        "revenueHours": 10.8
    }
}

routes

Tarjoaa taulukon kunkin ajoneuvon aikataulun mukaisesta reitistä. Jokainen aikataulun mukainen reitti sisältää:

ajoneuvotunnuskokonaisluku

Määritetyn ajoneuvon tunniste.

vuorottaulukko

Vaihtokohteiden joukko. Sovellusliittymä tukee useita vuoroja kullekin ajoneuvolle. Jokainen vuorokohde koostuu seuraavista osista:

  • index — vuoron numero (kokonaisluku).
  • stops — taulukko, joka sisältää kaikki pysäkit, joilla ajoneuvo pysähtyy tällä vuorolla.

Jokaisella pysäkillä on seuraavat ominaisuudet:

  • ordinal — pysäkin sijainti ajoneuvon aikataulussa, jota edustaa sen indeksi (kokonaisluku).
  • jobId — tähän pysähdykseen liittyvä työnumero (kokonaisluku).
  • taskId — tähän pysähdykseen liittyvä tehtävän tunnus (kokonaisluku).
  • type — tällä pysäkillä suoritettavan toimeksiannon tyyppi (”nouto” tai ”toimitus”).
  • location — pysäkin sijainnin maantieteelliset koordinaatit.
  • eta — arvioitu saapumisaika kyseiselle pysäkille (samassa aikavyöhykkeessä kuin syötetty data).
  • timeToNext — ajoaika seuraavalle pysäkille. Jos esimerkiksi jätät matkustajan klo 9.00 ja seuraava kyytisi on klo 10.00, tämä kertoo, että ajoaika nykyiseltä pysäkiltä seuraavalle pysäkille on 20 minuuttia.
  • distanceToNext — ajomatka seuraavalle pysäkille. Asetuksissa valituista mittayksiköistä riippuen tämä voi olla mailia tai metrejä.
  • waitTime — kuinka kauan kuljettajan tulisi odottaa seuraavalla pysäkillä, jos hän lähtee liikkeelle nyt.
  • polyline — moniviiva, joka yhdistää pysäkin sitä edeltävään pysäkkiin. Jos asetuksissa on määritetty arvo "plain", moniviiva on järjestetty luettelo risteyksistä, joiden kautta kuljetaan edeltävän pysäkin ja nykyisen pysäkin välillä. Jos asetuksissa on määritetty arvo "encoded", tavallinen moniviiva koodataan ja palautetaan koodattuna merkkijonona.
  • break — jos aikataulun mukainen pysähdys on tauko, se edustaa tauon tunnusta. Muissa pysähdyksissä tätä elementtiä ei ole. API ei vaadi, että tauot (tai työt) luetellaan aikajärjestyksessä.

Esimerkki — routes

json
       "routes": [
            {
                "vehicleId": 1,
                "shifts": [
                    {
                        "index": 1,
                        "stops": [
                            {
                                "break": 1,
                                "start": "2023-10-01T10:00:00-08:00",
                                "end": "2023-10-01T10:15:00-08:00",
                                "timeToNext": 15,
                                "distanceToNext": 7.3,
                                "waitTime": 0,
                                "polyline": null,
                                "ordinal": 1
                            },
                            {
                                "jobId": 4,
                                "taskId": 5,
                                "type": "pickup",
                                "location": [
                                    50.70816,
                                    -120.37796
                                ],
                                "eta": "2023-10-01T10:30:00-08:00",
                                "timeToNext": 13,
                                "distanceToNext": 5.6,
                                "waitTime": 112,
                                "polyline": null,
                                "ordinal": 2
                            },
                            {
                                "jobId": 4,
                                "taskId": 6,
                                "type": "delivery",
                                "location": [
                                    50.66559,
                                    -120.36924
                                ],
                                "eta": "2023-10-01T12:45:00-08:00",
                                "timeToNext": 4,
                                "distanceToNext": 1.7,
                                "waitTime": 71,
                                "polyline": null,
                                "ordinal": 3
                            },
                            {
                                "break": 2,
                                "start": "2023-10-01T14:00:00-08:00",
                                "end": "2023-10-01T14:15:00-08:00",
                                "timeToNext": 7,
                                "distanceToNext": 3.2,
                                "waitTime": 217,
                                "polyline": null,
                                "ordinal": 4
                            }
                        ]
                    }
                ]
            },
            {
                "vehicleId": 2,
                "shifts": [
                    {
                        "index": 1,
                        "stops": [
                            {
                                "break": 1,
                                "start": "2023-10-01T11:00:00-08:00",
                                "end": "2023-10-01T11:15:00-08:00",
                                "timeToNext": 3,
                                "distanceToNext": 1.2,
                                "waitTime": 267,
                                "polyline": null,
                                "ordinal": 1
                            },
                            {
                                "jobId": 10,
                                "taskId": 11,
                                "type": "pickup",
                                "location": [
                                    50.65187,
                                    -120.40052
                                ],
                                "eta": "2023-10-01T15:45:00-08:00",
                                "timeToNext": 12,
                                "distanceToNext": 6.4,
                                "waitTime": 0,
                                "polyline": null,
                                "ordinal": 2
                            },
                            {
                                "jobId": 10,
                                "taskId": 12,
                                "type": "delivery",
                                "location": [
                                    50.69262,
                                    -120.35412
                                ],
                                "eta": "2023-10-01T16:22:00-08:00",
                                "timeToNext": 6,
                                "distanceToNext": 2.7,
                                "waitTime": 91,
                                "polyline": null,
                                "ordinal": 3
                            }
                        ]
                    }
                ]
            }
        ]

unassigned

Valinnainen määrittelemättömien tehtävien luettelo sisältää tehtäviä, joita ei voida osoittaa tiettyjen rajoitusten vuoksi. Jokainen kohde koostuu työn tunnisteesta, tehtävän tunnisteesta sekä mahdollisista syistä, miksi tehtävää ei ole osoitettu (koodi ja kuvaus):

id
  • job — määrittelemättömän tehtävän tehtävänumero (kokonaisluku).
  • task — määrittelemättömän tehtävän tunniste (kokonaisluku).
syy

Lukuisia mahdollisia syitä tehtävien suorittamatta jäämiselle.

  • code — mahdollisen syyn koodi (kokonaisluku).
  • description — mahdollisen syyn kuvaus (merkkijono).
json
{
  "unassigned": [
    {
      "id": {
        "job": 2,
        "task": 1
      },
      "reason": [
        {
          "code": 2,
          "description": "Not enough capacity for this job"
        }
      ]
    },
    {
      "id": {
        "job": "31",
        "task": "2"
      },
      "reason": [
        {
          "code": 5,
          "description": "The service time of the job is out of the shift hours"
        }
      ]
    }
  ]
}

Virheet ja tilakoodit #

Kuten kohdassa ”Aloitus” on kuvattu, sovellusliittymä tukee sekä POST- että GET-menetelmiä. Menetelmästä riippuen se palauttaa tilakoodin vastauksessa. Seuraavassa on kuvaus näiden kahden menetelmän tilakoodeista.

POST-tilakoodit

KoodiKuvausLisähuomautukset
202Pyyntö hyväksyttiin käsiteltäväksi.Palautetaan viitetunnus, jota voidaan käyttää GET-pyynnön kanssa ratkaisun hakemiseen, kun se on valmis.
400Syötteen validointi epäonnistui (Huono pyyntö).Yksi tai useampi parametri puuttuu, on virheellinen tai kirjoitettu väärin. Korjaa syötetyt tiedot ja lähetä pyyntö uudelleen.
403Virheelliset todennustiedot tai riittämättömät käyttöoikeudet.Pyyntö ymmärrettiin, mutta asiakkaalla ei ole oikeuksia puuttuvien tai virheellisten käyttöoikeuksien vuoksi.
404Pyydettyä polkua ei löydy.Tämä virhe ilmenee, kun pyydetty URL-polku ei vastaa mitään kelvollista päätepistettä.
429Liian monta pyyntöä.QPM (kyselyitä minuutissa) eli pyyntökiintiö on ylitetty. Asiakkaan on hidastettava pyyntöjen tiheyttä.
500Sisäisen palvelun virhe.API:ssa oli palvelinpuolen ongelma. Ota yhteyttä osoitteeseen support@ddswireless.com saadaksesi apua.

Hae tilakoodit

KoodiKuvausLisähuomautukset
200Pyyntö on onnistunut.Ongelma ratkaistiin onnistuneesti. Tulokset palautetaan palvelun kautta statistics, routes, ja unassigned.
202Pyyntö hyväksyttiin, mutta sitä ei ole vielä käsitelty (tila odottaa käsittelyä).Ratkaisu ei ole vielä valmis. Sinun on tarkistettava tilanne myöhemmin uudelleen.
400Pyyntöä ei voitu käsitellä (Bad Request).Annetuille sijainneille tai parametreille ei voitu luoda toteuttamiskelpoista ratkaisua.
401Luvaton pyyntö.Pyyntö vaatii käyttäjän todennuksen. Palvelin ei saanut oikeita tunnistetietoja.
500Sisäisen palvelun virhe.API:ssamme oli palvelinpuolen ongelma. Ota yhteyttä support@ddswireless.comPellot statistics, routes, ja unassigned tulee olemaan tyhjä.
Oppaat

Ohjeet / Oppaat #

Täältä löydät erilaisia esimerkkejä, jotka havainnollistavat API:n käyttöä. API tukee pääasiassa kahta pääasiallista käyttötarkoitusta:

  1. Suunnittelu ja aikataulutus — laatii ajoneuvokannan reiteille optimoidun aikataulun, jossa otetaan huomioon töihin ja ajoneuvoihin liittyvät rajoitukset.
  2. Uudelleenoptimointi — muokkaa olemassa olevaa tai käynnissä olevaa aikataulua vastaamaan muutoksia, kuten uusia toimeksiantoja, peruutuksia tai ajokelvottomia ajoneuvoja.

Tutustu alla oleviin esimerkkeihin ja katso, miten nämä käyttötapaukset on toteutettu:

  • Esimerkki 1 — Yksinkertaisen nouto- ja toimitustilanteen suunnittelu.
  • Esimerkki 2 — Yksinkertainen uudelleenoptimointitilanne, jossa olemassa olevaan aikatauluun lisätään uusia töitä.
  • Esimerkki 3 — Uudelleenoptimointi peruutettujen töiden kanssa.
  • Esimerkki 4 — Uudelleenoptimointi viallisten ajoneuvojen kanssa.
Huomautus

Seuraavissa esimerkeissä mainitut paikat ovat kuvitteellisia ja satunnaisesti luotuja, eivätkä ne vastaa todellisia paikkoja.

Esimerkki 1 · Suunnittelu

Yksinkertaisen nouto- ja toimitustilanteen suunnittelu

Kaksi ajoneuvoa, jotka hoitavat kolme nouto- ja toimituskeikkaa ja joiden reitit on optimoitu kokonaiskuljetusajan minimoimiseksi.

Tässä esimerkissä kalustossamme on 2 ajoneuvoa, ja meillä on 3 nouto- ja jakelutehtävää, jotka näiden kahden ajoneuvon on hoidettava. Seuraavassa on kunkin ajoneuvon tiedot:

Ajoneuvo 1

  • Vuorotiedot: Vuoro alkaa 1.10.2024 klo 8.00 PST sijainnista (50.67293, -120.34195) ja päättyy klo 18.00 samassa sijainnissa. Aikavyöhyke on PST, joten alkamisaika kirjataan muodossa 2024-10-01T08:00:00-08:00 ja lopun ajankohdaksi 2024-10-01T18:00:00-08:00.
  • Tauot: Kaksi 15 minuutin taukoa. Ensimmäinen tauko klo 10.00–10.30 koordinaateissa (50.6531, -120.38393); toinen tauko klo 14.00–14.30 koordinaateissa (50.6531, -120.38393).
  • Kapasiteetti: 15 istumapaikkaa ja 5 rahtipaikkaa.
  • Taidot: Varustettu hissillä ja ilmastoinnilla.

Ajoneuvo 2

  • Vuoron tiedot: Vuoro alkaa 1.10.2024 klo 8.00 PST sijainnissa (50.7117, -120.39286) ja päättyy klo 18.00 sijainnissa (50.67698, -120.32012).
  • Tauot: Yksi 15 minuutin tauko klo 11.00–11.30 koordinaateissa (50.6531, -120.38393).
  • Kapasiteetti: 10 istumapaikkaa ja 8 rahtipaikkaa.
  • Taidot: Varustettu vain hissillä.

Meillä on myös kolme nouto- ja toimitustyötä Kamloopsissa, Brittiläisessä Kolumbiassa, Kanadassa. Tässä ovat kunkin työn tiedot:

Työpaikka 1

  • Nouto: Sijainti (50.65391, -120.37365). Palveluaika klo 9.00–9.30 (tilaus on sidottu noutoon, ja nouto on suoritettava tämän aikavälin sisällä). Kesto 10 minuuttia. Vaatimukset: 1 matkustajapaikka, 2 rahtipaikkaa, nostolaitteella varustettu ajoneuvo.
  • Toimitus: Sijainti (50.69409, -120.35425). Kesto 5 minuuttia.

Job 2

  • Nouto: Sijainti (50.70816, -120.37796). Kesto 5 minuuttia. Vaatimukset: 1 istumapaikka, ajoneuvossa on oltava sekä nostolaite että ilmastointi.
  • Toimitus: Sijainti (50.66559, -120.36924). Toimitusaika klo 12.45–13.30 (toimitus on toimitusajankohtaan sidottu, ja toimitus on suoritettava tämän aikavälin sisällä). Kesto 5 minuuttia.

Job 3

  • Nouto: Sijainti (50.70393, -120.37263). Palveluaika klo 14.00–14.30 (tehtävä on sidottu noutoon). Kesto 10 minuuttia. Vaatimukset: 1 matkustajapaikka, 3 rahtipaikkaa, erityisvarusteita ei tarvita.
  • Toimitus: Sijainti (50.69028, -120.39028). Kesto 5 minuuttia.

Tavoitteenamme on jakaa nämä kuljetukset määritellyille ajoneuvoille siten, että kokonaiskuljetusaika on mahdollisimman lyhyt. Toisin sanoen optimointitavoitteemme on 1. Syöttöongelma on seuraava:

Syöttöongelma (hyötykuorma)

json · hyötykuorma
{
    "problem": {
        "fleet": [
            {
                "id": 1,
                "shifts": [
                    {
                        "start": {
                            "time": "2023-10-01T08:00:00-08:00",
                            "location": {
                                "lat": 50.67293,
                                "lng": -120.34195
                            }
                        },
                        "end": {
                            "time": "2023-10-01T18:00:00-08:00",
                            "location": {
                                "lat": 50.67293,
                                "lng": -120.34195
                            }
                        },
                        "breaks": [
                            {
                                "serviceWindow": [
                                    "2023-10-01T10:00:00-08:00",
                                    "2023-10-01T10:30:00-08:00"
                                ],
                                "duration": 900,
                                "location": {
                                    "lat": 50.6531,
                                    "lng": -120.38393
                                }
                            },
                            {
                                "serviceWindow": [
                                    "2023-10-01T14:00:00-08:00",
                                    "2023-10-01T14:30:00-08:00"
                                ],
                                "duration": 900,
                                "location": {
                                    "lat": 50.6531,
                                    "lng": -120.38393
                                }
                            }
                        ]
                    }
                ],
                "capacities": [
                    {
                        "name": "seat",
                        "units": 15
                    },
                    {
                        "name": "cargo",
                        "units": 5
                    }
                ],
                "skills": [
                    "lift",
                    "air_conditioner"
                ]
            },
            {
                "id": 2,
                "shifts": [
                    {
                        "start": {
                            "time": "2023-10-01T08:00:00-08:00",
                            "location": {
                                "lat": 50.7117,
                                "lng": -120.39286
                            }
                        },
                        "end": {
                            "time": "2023-10-01T18:00:00-08:00",
                            "location": {
                                "lat": 50.67698,
                                "lng": -120.32012
                            }
                        },
                        "breaks": [
                            {
                                "serviceWindow": [
                                    "2023-10-01T11:00:00-08:00",
                                    "2023-10-01T11:30:00-08:00"
                                ],
                                "duration": 900,
                                "location": {
                                    "lat": 50.6531,
                                    "lng": -120.38393
                                }
                            }
                        ]
                    }
                ],
                "capacities": [
                    {
                        "name": "seat",
                        "units": 10
                    },
                    {
                        "name": "cargo",
                        "units": 8
                    }
                ],
                "skills": [
                    "lift"
                ]
            }
        ],
        "jobs": [
            {
                "id": 1,
                "pickups": [
                    {
                        "id": 2,
                        "location": [
                            50.65391,
                            -120.37365
                        ],
                        "serviceWindows": [
                            [
                                "2023-10-01T09:00:00-08:00",
                                "2023-10-01T09:30:00-08:00"
                            ]
                        ],
                        "duration": 600,
                        "demand": [
                            {
                                "name": "seat",
                                "units": 1
                            },
                            {
                                "name": "cargo",
                                "units": 2
                            }
                        ],
                        "skills": [
                            "lift"
                        ]
                    }
                ],
                "deliveries": [
                    {
                        "id": 3,
                        "location": [
                            50.69409,
                            -120.35425
                        ],
                        "duration": 300,
                        "demand": [
                            {
                                "name": "seat",
                                "units": 1
                            },
                            {
                                "name": "cargo",
                                "units": 2
                            }
                        ],
                        "skills": [
                            "lift"
                        ]
                    }
                ]
            },
            {
                "id": 4,
                "pickups": [
                    {
                        "id": 5,
                        "location": [
                            50.70816,
                            -120.37796
                        ],
                        "duration": 300,
                        "demand": [
                            {
                                "name": "seat",
                                "units": 1
                            }
                        ],
                        "skills": [
                            "lift",
                            "air_conditioner"
                        ]
                    }
                ],
                "deliveries": [
                    {
                        "id": 6,
                        "location": [
                            50.66559,
                            -120.36924
                        ],
                        "serviceWindows": [
                            [
                                "2023-10-01T12:45:00-08:00",
                                "2023-10-01T13:30:00-08:00"
                            ]
                        ],
                        "duration": 300,
                        "demand": [
                            {
                                "name": "seat",
                                "units": 1
                            }
                        ],
                        "skills": [
                            "lift",
                            "air_conditioner"
                        ]
                    }
                ]
            },
            {
                "id": 7,
                "pickups": [
                    {
                        "id": 8,
                        "location": [
                            50.70393,
                            -120.37263
                        ],
                        "serviceWindows": [
                            [
                                "2023-10-01T14:00:00-08:00",
                                "2023-10-01T14:30:00-08:00"
                            ]
                        ],
                        "duration": 600,
                        "demand": [
                            {
                                "name": "seat",
                                "units": 1
                            },
                            {
                                "name": "cargo",
                                "units": 3
                            }
                        ]
                    }
                ],
                "deliveries": [
                    {
                        "id": 9,
                        "location": [
                            50.69028,
                            -120.39028
                        ],
                        "duration": 300,
                        "demand": [
                            {
                                "name": "seat",
                                "units": 1
                            },
                            {
                                "name": "cargo",
                                "units": 3
                            }
                        ]
                    }
                ]
            }
        ],
        "objective": 1,
        "configuration": {
            "polylineType": "none",
            "unassignedTasks": true,
            "units": "imperial",
            "statistics": true
        }
    }
}

Kun olemme lähettäneet tämän ongelman POST-menetelmällä (kuten kohdassa Aloitus on kuvattu), saamme seuraavan ratkaisun GET-menetelmällä:

Lopputulos

json · ratkaisu
{
    "id": 8193,
    "status": 200,
    "solution": {
        "statistics": {
            "distance": {
                "totalDistance": 54,
                "revenueDistance": 36
            },
            "vehicles": {
                "used": 2,
                "unused": 0
            },
            "jobs": {
                "scheduledTasks": 3,
                "unassignedTasks": 0
            },
            "times": {
                "totalHours": 9.4,
                "revenueHours": 8.7
            }
        },
        "routes": [
            {
                "vehicleId": 1,
                "shifts": [
                    {
                        "index": 1,
                        "stops": [
                            {
                                "jobId": 1,
                                "taskId": 2,
                                "type": "pickup",
                                "location": [
                                    50.65391,
                                    -120.37365
                                ],
                                "eta": "2023-10-01T09:00:00-08:00",
                                "timeToNext": 10,
                                "distanceToNext": 4.9,
                                "waitTime": 0,
                                "polyline": null,
                                "ordinal": 1
                            },
                            {
                                "jobId": 1,
                                "taskId": 3,
                                "type": "delivery",
                                "location": [
                                    50.69409,
                                    -120.35425
                                ],
                                "eta": "2023-10-01T09:25:00-08:00",
                                "timeToNext": 10,
                                "distanceToNext": 5.4,
                                "waitTime": 25,
                                "polyline": null,
                                "ordinal": 2
                            },
                            {
                                "break": 1,
                                "start": "2023-10-01T10:00:00-08:00",
                                "end": "2023-10-01T10:15:00-08:00",
                                "timeToNext": 15,
                                "distanceToNext": 7.3,
                                "waitTime": 0,
                                "polyline": null,
                                "ordinal": 3
                            },
                            {
                                "jobId": 4,
                                "taskId": 5,
                                "type": "pickup",
                                "location": [
                                    50.70816,
                                    -120.37796
                                ],
                                "eta": "2023-10-01T10:30:00-08:00",
                                "timeToNext": 13,
                                "distanceToNext": 5.6,
                                "waitTime": 112,
                                "polyline": null,
                                "ordinal": 4
                            },
                            {
                                "jobId": 4,
                                "taskId": 6,
                                "type": "delivery",
                                "location": [
                                    50.66559,
                                    -120.36924
                                ],
                                "eta": "2023-10-01T12:45:00-08:00",
                                "timeToNext": 4,
                                "distanceToNext": 1.7,
                                "waitTime": 71,
                                "polyline": null,
                                "ordinal": 5
                            },
                            {
                                "break": 2,
                                "start": "2023-10-01T14:00:00-08:00",
                                "end": "2023-10-01T14:15:00-08:00",
                                "timeToNext": 7,
                                "distanceToNext": 3.2,
                                "waitTime": 217,
                                "polyline": null,
                                "ordinal": 6
                            }
                        ]
                    }
                ]
            },
            {
                "vehicleId": 2,
                "shifts": [
                    {
                        "index": 1,
                        "stops": [
                            {
                                "break": 1,
                                "start": "2023-10-01T11:00:00-08:00",
                                "end": "2023-10-01T11:15:00-08:00",
                                "timeToNext": 13,
                                "distanceToNext": 6.6,
                                "waitTime": 152,
                                "polyline": null,
                                "ordinal": 1
                            },
                            {
                                "jobId": 7,
                                "taskId": 8,
                                "type": "pickup",
                                "location": [
                                    50.70393,
                                    -120.37263
                                ],
                                "eta": "2023-10-01T14:00:00-08:00",
                                "timeToNext": 14,
                                "distanceToNext": 4.6,
                                "waitTime": 0,
                                "polyline": null,
                                "ordinal": 2
                            },
                            {
                                "jobId": 7,
                                "taskId": 9,
                                "type": "delivery",
                                "location": [
                                    50.69028,
                                    -120.39028
                                ],
                                "eta": "2023-10-01T14:29:00-08:00",
                                "timeToNext": 13,
                                "distanceToNext": 3.9,
                                "waitTime": 197,
                                "polyline": null,
                                "ordinal": 3
                            }
                        ]
                    }
                ]
            }
        ],
        "unassigned": []
    },
    "message": "success"
}
Esimerkki 2 · Uudelleenoptimointi

Uusien töiden lisääminen olemassa olevaan aikatauluun

Optimoi osittain toteutettu aikataulu uudelleen klo 11:36:34, jotta siihen voidaan sisällyttää juuri saapunut työtehtävä.

Tarkastellaan nyt edellistä esimerkkiä. Oletetaan, että olet aloittanut tuotetun aikataulun suorittamisen aamusta lähtien, ja nyt kello on 11:36:34, ja saat uuden työmääräyksen seuraavasti:

Työpaikka 4 (uusi työpaikka)

  • Nouto: Sijainti (50.65187, -120.40052). Palveluaika klo 15.45–16.15 (noutoon sidottu toimeksianto). Kesto 15 minuuttia. Vaatimukset: 1 matkustajapaikka, 1 rahtipaikka.
  • Toimitus: Sijainti (50.69262, -120.35412). Kesto 10 minuuttia.

Olet jo suorittanut tehtävän 1, mutta tehtävät 2 ja 3 ovat vielä kesken seuraavin yksityiskohdin:

  • Tehtävä 1: suoritettu.
  • Tehtävä 2: käynnissä. Nouto — ajoneuvon tunnus 1, arvioitu saapumisaika 10.30. Toimitus — ajoneuvon tunnus 1, arvioitu saapumisaika 12.45.
  • Tehtävä 3: käynnissä. Nouto — ajoneuvon tunnus 2, arvioitu saapumisaika klo 14.00. Toimitus — ajoneuvon tunnus 2, arvioitu saapumisaika klo 14.29.

Koska työ 2 ja työ 3 ovat käynnissä, niillä on oma ajoneuvotunnus ja arvioitu saapumisaika. Jos haluat optimoida aikataulusi uudelleen uuden työn (työ 4) huomioon ottamiseksi, toimita API:n kautta päivitetty näkymä nykyisestä aikataulustasi. Tähän sisältyvät seuraavat tiedot töistäsi:

  • Työ 1: on jo suoritettu, joten aseta nouto- ja toimitustehtävien tilaksi "status":"performed". Näiden tehtävien osalta sinun ei tarvitse ilmoittaa ajoneuvon nykyistä tunnusta eikä arvioitua saapumisaikaa, sillä ne on jo määritetty eikä niitä voi muuttaa.
  • Työ 2: vielä käynnissä, osoitettu ajoneuvolle 1, noutoarvio = 10.30 ja toimitusarvio = 12.45. Sisältää "status": "in_progress", "vehicleId": 1ja vastaava eta kuljetus- ja toimitustehtäviinsä.
  • Työ 3: vielä kesken ja osoitettu ajoneuvolle 2, noutoarvio klo 14.00 ja toimitusarvio klo 14.29. Sisällytä "status": "in_progress", "vehicleId": 2ja vastaava eta kuljetus- ja toimitustehtäviinsä.
  • Työ 4: uusi työtehtävä, jota ei ole vielä aikataulutettu, joten aseta sen tilaksi "status":"pending". Sinun ei tarvitse määrittää ajoneuvotunnusta tai arvioitua saapumisaikaa. Uudelleenoptimoinnin jälkeen saat ajoneuvotunnuksen ja arvioidun saapumisajan jokaiselle tämän toimeksiannon tehtävälle.

Sinun on myös ilmoitettava ajoneuvojesi viimeisimmät tunnetut sijainnit, jotta sovellusrajapinta (API) saa ajantasaisen kuvan nykyisestä aikataulustasi. Oletetaan, että viimeisimmät tunnetut sijainnit klo 11:36:34 (ajankohta, jota haluamme optimoida uudelleen) ovat: Ajoneuvo 1: (50.66692, -120.35293) ja Ajoneuvo 2: (50.65324, -120.37398). Lisää lastKnownLocation kohde, jonka sijainti on time jokaiselle ajoneuvolle.

Voit tehdä uudelleenoptimoinnin lähettämällä uuden optimointiongelman seuraavasti:

Hyötykuorman uudelleenoptimointi

json · hyötykuorma
{
    "problem": {
        "fleet": [
            {
                "id": 1,
                "shifts": [
                    {
                        "start": {
                            "time": "2023-10-01T08:00:00-08:00",
                            "location": {
                                "lat": 50.67293,
                                "lng": -120.34195
                            }
                        },
                        "end": {
                            "time": "2023-10-01T18:00:00-08:00",
                            "location": {
                                "lat": 50.67293,
                                "lng": -120.34195
                            }
                        },
                        "breaks": [
                            {
                                "serviceWindow": [
                                    "2023-10-01T10:00:00-08:00",
                                    "2023-10-01T10:30:00-08:00"
                                ],
                                "duration": 900,
                                "location": {
                                    "lat": 50.6531,
                                    "lng": -120.38393
                                }
                            },
                            {
                                "serviceWindow": [
                                    "2023-10-01T14:00:00-08:00",
                                    "2023-10-01T14:30:00-08:00"
                                ],
                                "duration": 900,
                                "location": {
                                    "lat": 50.6531,
                                    "lng": -120.38393
                                }
                            }
                        ]
                    }
                ],
                "capacities": [
                    {
                        "name": "seat",
                        "units": 15
                    },
                    {
                        "name": "cargo",
                        "units": 5
                    }
                ],
                "skills": [
                    "lift",
                    "air_conditioner"
                ],
                "lastKnownLocation":{
                         "location":[50.66692,-120.35293],
                         "time":"2024-10-01T11:36:34-08:00"
               }                 
            },
            {
                "id": 2,
                "shifts": [
                    {
                        "start": {
                            "time": "2023-10-01T08:00:00-08:00",
                            "location": {
                                "lat": 50.7117,
                                "lng": -120.39286
                            }
                        },
                        "end": {
                            "time": "2023-10-01T18:00:00-08:00",
                            "location": {
                                "lat": 50.67698,
                                "lng": -120.32012
                            }
                        },
                        "breaks": [
                            {
                                "serviceWindow": [
                                    "2023-10-01T11:00:00-08:00",
                                    "2023-10-01T11:30:00-08:00"
                                ],
                                "duration": 900,
                                "location": {
                                    "lat": 50.6531,
                                    "lng": -120.38393
                                }
                            }
                        ]
                    }
                ],
                "capacities": [
                    {
                        "name": "seat",
                        "units": 10
                    },
                    {
                        "name": "cargo",
                        "units": 8
                    }
                ],
                "skills": [
                    "lift"
                ],
                "lastKnownLocation":{
                         "location":[50.65324,-120.37398],
                         "time":"2024-10-01T11:36:34-08:00"
               }                 
            }
        ],
        "jobs": [
            {
                "id": 1,
                "pickups": [
                    {
                        "id": 2,
                        "location": [
                            50.65391,
                            -120.37365
                        ],
                        "serviceWindows": [
                            [
                                "2023-10-01T09:00:00-08:00",
                                "2023-10-01T09:30:00-08:00"
                            ]
                        ],
                        "duration": 600,
                        "demand": [
                            {
                                "name": "seat",
                                "units": 1
                            },
                            {
                                "name": "cargo",
                                "units": 2
                            }
                        ],
                        "skills": [
                            "lift"
                        ],
                        "status": "performed"
                    }
                ],
                "deliveries": [
                    {
                        "id": 3,
                        "location": [
                            50.69409,
                            -120.35425
                        ],
                        "duration": 300,
                        "demand": [
                            {
                                "name": "seat",
                                "units": 1
                            },
                            {
                                "name": "cargo",
                                "units": 2
                            }
                        ],
                        "skills": [
                            "lift"
                        ],
                        "status": "performed"
                    }
                ]
            },
            {
                "id": 4,
                "pickups": [
                    {
                        "id": 5,
                        "location": [
                            50.70816,
                            -120.37796
                        ],
                        "duration": 300,
                        "demand": [
                            {
                                "name": "seat",
                                "units": 1
                            }
                        ],
                        "skills": [
                            "lift",
                            "air_conditioner"
                        ],
                        "status": "in_progress",
                        "vehicleId": 1,
                        "eta": "2023-10-01T10:30:00-08:00"
                    }
                ],
                "deliveries": [
                    {
                        "id": 6,
                        "location": [
                            50.66559,
                            -120.36924
                        ],
                        "serviceWindows": [
                            [
                                "2023-10-01T12:45:00-08:00",
                                "2023-10-01T13:30:00-08:00"
                            ]
                        ],
                        "duration": 300,
                        "demand": [
                            {
                                "name": "seat",
                                "units": 1
                            }
                        ],
                        "skills": [
                            "lift",
                            "air_conditioner"
                        ],
                        "status": "in_progress",
                        "vehicleId": 1,
                        "eta": "2023-10-01T12:45:00-08:00"
                    }
                ]
            },
            {
                "id": 7,
                "pickups": [
                    {
                        "id": 8,
                        "location": [
                            50.70393,
                            -120.37263
                        ],
                        "serviceWindows": [
                            [
                                "2023-10-01T14:00:00-08:00",
                                "2023-10-01T14:30:00-08:00"
                            ]
                        ],
                        "duration": 600,
                        "demand": [
                            {
                                "name": "seat",
                                "units": 1
                            },
                            {
                                "name": "cargo",
                                "units": 3
                            }
                        ],
                        "status": "in_progress",
                        "vehicleId": 2,
                        "eta": "2023-10-01T14:00:00-08:00"                        
                    }
                ],
                "deliveries": [
                    {
                        "id": 9,
                        "location": [
                            50.69028,
                            -120.39028
                        ],
                        "duration": 300,
                        "demand": [
                            {
                                "name": "seat",
                                "units": 1
                            },
                            {
                                "name": "cargo",
                                "units": 3
                            }
                        ],
                        "status": "in_progress",
                        "vehicleId": 2,
                        "eta": "2023-10-01T14:29:00-08:00"                       
                    }
                ]
            },
            {
                "id": 10,
                "pickups": [
                    {
                        "id": 11,
                        "location": [
                            50.65187,
                            -120.40052
                        ],
                        "serviceWindows": [
                            [
                                "2023-10-01T15:45:00-08:00",
                                "2023-10-01T16:15:00-08:00"
                            ]
                        ],
                        "duration": 900,
                        "demand": [
                            {
                                "name": "seat",
                                "units": 1
                            },
                            {
                                "name": "cargo",
                                "units": 1
                            }
                        ],
                        "status": "pending"
                    }
                ],
                "deliveries": [
                    {
                        "id": 12,
                        "location": [
                            50.69262,
                            -120.35412
                        ],
                        "duration": 600,
                        "demand": [
                            {
                                "name": "seat",
                                "units": 1
                            },
                            {
                                "name": "cargo",
                                "units": 1
                            }
                        ],
                        "status": "pending"
                    }
                ]
            }

        ],
        "objective": 1,
        "configuration": {
            "polylineType": "none",
            "unassignedTasks": true,
            "units": "imperial",
            "statistics": true
        }
    }
}
Esimerkki 3 · Uudelleenoptimointi

Uudelleenoptimointi peruutettujen töiden kanssa

Poista peruutetut työt nykyisestä aikataulusta ja optimoi jäljellä olevat työt uudelleen.

Jos olet lähettänyt optimointiongelman tiettyä työjoukkoa varten ja aikataulu on jo laadittu, mutta osa töistä on peruutettu, voit optimoida aikataulun uudelleen poistamalla peruutetut työt ongelmasta. Tätä varten sinun on:

  • Anna ajantasainen kuva jäljellä olevista toimeksiannoistasi ja ajoneuvojesi viimeisimmistä tiedossa olevista sijainneista, kuten esimerkissä 2.
  • Luo ja lähetä tarkistettu ongelma, joka heijastaa näitä muutoksia.

Kun lähetät sen, saat uuden aikataulun, jossa on otettu huomioon päivitetyt työt ja kaluston tila.

Esimerkki 4 · Uudelleenoptimointi

Uudelleenoptimointi vaurioituneiden ajoneuvojen kanssa

Järjestä työ uudelleen ajoneuvolle, joka on rikkoutunut työvuoron aikana.

Oletetaan, että kello on 8.00 ja luot API:n avulla optimoidun aikataulun 10 ajoneuvon reiteille. Aloitat aikataulun toteuttamisen, mutta kello 9.14 saat tietää, että yksi ajoneuvoistasi on rikkoutunut eikä voi enää suorittaa sille osoitettuja reittejä. Optimoi aikataulu uudelleen seuraavasti:

  1. Päivitä ajoneuvokannan tiedot. Poista rikkoutunut ajoneuvo ajoneuvokannan kohteesta.
  2. Ilmoita ajoneuvojen sijainnit. Ilmoita jäljellä olevien ajoneuvojen viimeisimmät tiedossa olevat sijainnit, kuten esimerkissä 2.
  3. Päivitä tehtävien tila. Ilmoita kaikkien tehtävien tila: kerro, mitkä tehtävät on jo suoritettu, mitkä ovat kesken ja mitkä ovat uusia tai odottavia. Kesken olevien tehtävien osalta ilmoita niihin liittyvä ajoneuvotunnus ja arvioitu saapumisaika.
  4. Hoida rikkoutuneeseen ajoneuvoon liittyvät asiat. Muuta kaikkien aiemmin kyseiselle rikkoutuneelle ajoneuvolle osoitettujen tehtävien tila seuraavaksi: "pending". Näin API voi osoittaa ne uudelleen muihin käytettävissä oleviin ajoneuvoihin ja laskea niiden arvioidut saapumisajat uudelleen.
  5. Lähetä uudelleenoptimoitavaksi. Lähetä päivitetty ongelma sovellusrajapintaan uutta aikataulun optimointia varten.

Aikataulutettujen reittien testaaminen #

Vaihe 1 — Luo käyttöoikeustunnus

Lähetä ensin POST-pyyntö seuraavaan URL-osoitteeseen saadaksesi käyttöoikeustunnuksen alla olevia tunnistetietoja käyttäen.

Vancouverin (vuokralainen 2) POST-pyynnön runko:

json · pyynnön runko
{
    "plugin": "internal;basic",
    "internal": {
        "email": "YOUR_EMAIL",
        "password": "YOUR_PASSWORD",
        "tenantId": 2
    },
    "basic": {
        "username": "YOUR_EMAIL",
        "password": "YOUR_PASSWORD",
        "tenantId": 2
    }
}

POST-pyynnön runko Suomelle (vuokralainen 3):

json · pyynnön runko
{
    "plugin": "internal;basic",
    "internal": {
        "email": "YOUR_EMAIL",
        "password": "YOUR_PASSWORD",
        "tenantId": 3
    },
    "basic": {
        "username": "YOUR_EMAIL",
        "password": "YOUR_PASSWORD",
        "tenantId": 3
    }
}

Kopioi sitten luotu tunniste. Tässä on kuvakaappaus tästä vaiheesta:

Kuvakaappaus pääsytunnuksen luomisesta

Vaihe 2 — Lähetä syöttötiedot (optimointiongelma) sovellusrajapinnalle

Jos haluat lähettää syötteen API:lle ja saada viitetunnuksen, lisää luotu tunnus seuraavan POST-pyynnön ”Authorization”-kenttään ja syöte pyynnön ”Body”-kenttään.

Esimerkki syötteen hyötykuormasta:

json · hyötykuorma
{
  "problem": {
    "fleet": [
      {
        "id": 1,
        "shifts": [
          {
            "start": {
              "time": "2023-10-01T08:00:00-08:00",
              "location": { "lat": 50.67293, "lng": -120.34195 }
            },
            "end": {
              "time": "2023-10-01T18:00:00-08:00",
              "location": { "lat": 50.67293, "lng": -120.34195 }
            },
            "breaks": [
              {
                "serviceWindow": ["2023-10-01T10:00:00-08:00", "2023-10-01T10:30:00-08:00"],
                "duration": 900,
                "location": { "lat": 50.6531, "lng": -120.38393 }
              },
              {
                "serviceWindow": ["2023-10-01T14:00:00-08:00", "2023-10-01T14:30:00-08:00"],
                "duration": 900,
                "location": { "lat": 50.6531, "lng": -120.38393 }
              }
            ]
          }
        ],
        "capacities": [
          {
            "name": "seat",
            "units": 15
          },
          {
            "name": "baggage",
            "units": 5
          }
        ],
        "skills": ["lift", "air_conditioner"]
      },
      {
        "id": 2,
        "shifts": [
          {
            "start": {
              "time": "2023-10-01T08:00:00-08:00",
              "location": { "lat": 50.7117, "lng": -120.39286 }
            },
            "end": {
              "time": "2023-10-01T18:00:00-08:00",
              "location": { "lat": 50.67698, "lng": -120.32012 }
            },
            "breaks": [
              {
                "serviceWindow": ["2023-10-01T11:00:00-08:00", "2023-10-01T11:30:00-08:00"],
                "duration": 900,
                "location": { "lat": 50.6531, "lng": -120.38393 }
              }
            ]
          }
        ],
        "capacities": [
          {
            "name": "seat",
            "units": 10
          },
          {
            "name": "baggage",
            "units": 8
          }
        ],
        "skills": ["lift"]
      }
    ],
    "jobs": [
      {
        "id": 1,
        "pickups": [
          {
            "id": 2,
            "location": [50.65391, -120.37365],
            "serviceWindows": [["2023-10-01T09:00:00-08:00", "2023-10-01T09:30:00-08:00"]],
            "duration": 600,
            "demand": [
              {
                "name": "seat",
                "units": 1
              },
              {
                "name": "baggage",
                "units": 2
              }
            ],
            "skills": ["lift"]
          }
        ],
        "deliveries": [
          {
            "id": 3,
            "location": [50.69409, -120.35425],
            "duration": 300,
            "demand": [
              {
                "name": "seat",
                "units": 1
              },
              {
                "name": "baggage",
                "units": 2
              }
            ],
            "skills": ["lift"]
          }
        ]
      },
      {
        "id": 4,
        "pickups": [
          {
            "id": 5,
            "location": [50.70816, -120.37796],
            "duration": 300,
            "demand": [
              {
                "name": "seat",
                "units": 1
              }
            ],
            "skills": ["lift", "air_conditioner"]
          }
        ],
        "deliveries": [
          {
            "id": 6,
            "location": [50.66559, -120.36924],
            "serviceWindows": [["2023-10-01T12:45:00-08:00", "2023-10-01T13:30:00-08:00"]],
            "duration": 300,
            "demand": [
              {
                "name": "seat",
                "units": 1
              }
            ],
            "skills": ["lift", "air_conditioner"]
          }
        ]
      },
      {
        "id": 7,
        "pickups": [
          {
            "id": 8,
            "location": [50.70393, -120.37263],
            "serviceWindows": [["2023-10-01T14:00:00-08:00", "2023-10-01T14:30:00-08:00"]],
            "duration": 600,
            "demand": [
              {
                "name": "seat",
                "units": 1
              },
              {
                "name": "baggage",
                "units": 3
              }
            ]
          }
        ],
        "deliveries": [
          {
            "id": 9,
            "location": [50.69028, -120.39028],
            "duration": 300,
            "demand": [
              {
                "name": "seat",
                "units": 1
              },
              {
                "name": "baggage",
                "units": 3
              }
            ]
          }
        ]
      }
    ],
    "objective": 1,
    "configuration": {
        "polylineType": "none",
        "unassignedTasks": true,
        "units" : "imperial",
        "statistics" : true
    }
  }
}

Jos POST-pyyntö onnistuu, saat viitetunnuksen, jonka avulla voit hakea vastauksen GET-pyynnöllä. Alla on kuvakaappaus tästä vaiheesta:

Kuvakaappaus syötteen lähettämisestä

Vaihe 3 — Hae API-kutsun vastaus

Jos haluat saada vastauksen vastaanotetun viitetunnuksen avulla, lisää käyttöoikeustunnus seuraavan GET-pyynnön ”Authorization”-kohtaan ja sisällytä viitetunnus URL-osoitteeseen.

Tässä on kuvakaappaus tästä vaiheesta:

Kuvakaappaus vastauksen hakemisesta
Viite

Sanasto #

TermiMääritelmä
problemReitityksen ja aikataulutuksen optimointiongelma, joka ratkaistaan API:n avulla.
solutionAPI:n tarjoama ratkaisu reitityksen ja aikataulutuksen optimointiongelmaan.
fleetKalusto määrittelee luettelon ajoneuvotyypeistä ja niiden tiedoista.
jobLuettelo toimitus- tai nouto- ja luovutustehtävistä, jotka tietyn ajoneuvon on suoritettava.
taskTehtävä on osa työtä ja se on suoritettava tietyssä paikassa ja tiettyyn aikaan.
breakMäärite, joka määrittää yhden tai useamman taukoajan kuljettajille tietyissä paikoissa.
demandTehtäväkapasiteettivaatimus esitettynä moniulotteisina yksiköinä (esim. tilavuus, massa).
durationTehtävän suorittamiseen tai taukoon käytetty aika.
shiftsMäärittelee ajoneuvojen aikataulut, mukaan lukien aloitus- ja päättymisajat, sijainnit ja mahdolliset tauot.
deliveryTyötehtävä, joka koskee aiemmin kierroksella lastatun esineen toimittamista.
pickup and deliveryTyö, jossa sekä nouto- että toimituspaikka on määritelty.
skillsTiettyjen tehtävien suorittamiseen tarvittavat ajoneuvotaidot (esim. laitteet, kokovaatimukset).
service windowAikaväli, jonka sisällä tehtävä on suoritettava.
start/end locationMistä ajoneuvo lähtee tai mihin se palaa (esim. varikolle tai autotalliin).
start/end timeMäärittää vuorojen, taukojen, lähtöjen tai tehtävien ajoituksen.
locationOsoitteen leveys- ja pituusaste WGS84-muodossa.
re-optimizationAktiivisen aikataulun päivittäminen muutosten, kuten uusien/peruttujen tilausten, vuoksi.
ID (or id)Työn, tehtävän tai ajoneuvon yksilöivä tunniste.
VRPAjoneuvojen reititysongelma.
CVRPKapasitoituneiden ajoneuvojen reititysongelma.
PDPNouto- ja toimitusongelma.
limitsAjoneuvotyypille asetetut rajoitukset.
objectiveOngelman ratkaisemiseen käytetty optimointistrategia.
statisticsRatkaisussa palautettujen optimoitujen reittien tilastot.
stopLuettelo tiettyyn aikaan/paikkaan reitin varrella suoritettavista toiminnoista.
unassigned jobs/tasksTyöt/tehtävät, joita ei voitu määrittää reitille.
ETAArvioitu saapumisaika. Ilmoitetaan kaikille pysähdyksille tulosteessa.
polylineYhdistetty viivapolku, joka edustaa reittiä kartalla.
encoded polylinePakattu merkkijonoversio polyviivasta, jota käytetään datan koon minimoimiseen (esim. _kv~uF|y~wGdkZ~gAx|]t@).
Viite

Usein kysytyt kysymykset #

KysymysVastaa
Tukeeko API nouto- ja toimitusongelman (PDP) ratkaisemista?Kyllä, katso yksityiskohtainen selitys Opastus -osiosta.
Tukeeko API avointa PDP:tä?Kyllä, voit määrittää mielivaltaiset aloitus- ja lopetuspaikat jokaiselle ajoneuvokalustossasi.
Käyttääkö API reaaliaikaista liikennedataa?Kyllä, se käyttää sekä historiallista että reaaliaikaista liikennedataa.
Voinko määrittää ajoneuvojen vuorojen ajat, aloitus- ja lopetuspaikat sekä tauot?Kyllä, katso Ongelma -sivun laivasto-objekti.
Voimmeko määritellä useita mielivaltaisia kapasiteettityyppejä ajoneuvoille?Kyllä, capacity Fleet-objektin attribuutti tukee useita ulottuvuuksia, kuten painoa, tilavuutta ja määrää.
Voimmeko määrittää tehtävien enimmäismäärän ajoneuvoa kohden?Kyllä, tämä voidaan määrittää Ongelma-sivun fleet-objektin avulla.
Tukeeko API useita taukoja ajoneuvoa kohti?Kyllä, tuettu Ongelma-sivun laivasto-objektin kautta.
Tukeeko API noutoja, toimituksia vai molempia?Kyllä, katso jobs-objekti ongelman dokumentaatiosta.
Voinko määrittää tehtävän keston?Kyllä, käytä duration-attribuuttia Problem-tyypin jobs-objektissa.
Voinko määritellä mielivaltaisia tehtävien kapasiteettivaatimuksia?Kyllä, tuettu ongelman määrittelyn jobs-objektin kautta.
Voimmeko määritellä palveluaikaikkunan tehtävää kohden?Kyllä, määritä aikaisin ja myöhäisin aloitusaika käyttämällä työobjektin aikaikkunoita.
Voinko määritellä kullekin tehtävälle vaadittavat taidot tai ominaisuudet?Kyllä, piirteitä tuetaan työpaikkaobjektissa, ja ne auttavat yhdistämään tehtäviä päteviin ajoneuvoihin tai kuljettajiin.
Tukeeko API käynnissä olevien reittien uudelleenoptimointia?Kyllä, katso ohjeet keskeneräisten ratkaisujen uudelleenoptimointiin oppaasta.
Tarjoaako API reitti- ja aikataulutilastoja?Kyllä, katso Ratkaisusta yksityiskohtaiset tilastot, kuten matka-aika, etäisyys ja määräämättömät työt.
Selittääkö API, miksi tehtäviä ei määritetty?Kyllä, katso Ratkaisu syitä määräämättömille töille.
Palauttaako API arvioidut saapumisajat?Kyllä, katso tehtäväkohtaiset arvioidut saapumisajat ratkaisusta .
Voiko API klusteroida töitä sijainnin mukaan?Kyllä, klusterointia tuetaan reittien tehokkuuden parantamiseksi.
Voinko valita eri optimointitavoitteita?Kyllä. Vaihtoehtoja ovat: Matka-ajan minimointi, reittien lukumäärän minimointi ja työmäärän tasapainottaminen reittien välillä. Katso lisätietoja kohdasta Ongelma.

Reittiaikataulut — Reititys- ja aikataulutus-API. Tarvitsetko apua? Ota yhteyttä osoitteeseen support@ddswireless.com.

Versiossa 1.1 lisättiin tuki reittimallien käytölle. Versiossa 1.2 lisättiin tuki ajoneuvojen kapasiteetin joustavalle määrittelylle.