#
Einleitung #
Willkommen beim Benutzerhandbuch zu unserer Routing- und Terminierungs-API!
In Version 1.1 wurde die Unterstützung für Routenvorlagen hinzugefügt
v1.2: Unterstützung für flexible Fahrzeugkapazitätskonfiguration hinzugefügt
Unsere API wurde entwickelt, um die Routenplanung und Terminierung für Fahrzeugflotten zu optimieren und dabei wichtige Einschränkungen wie Zeitfenster für die Dienstleistung, Kapazitätsgrenzen und Verkehrsbedingungen zu berücksichtigen. Durch den Einsatz unserer API können Unternehmen die Effizienz ihrer Lieferungen erheblich steigern, Betriebskosten senken und durch optimierte Routen- und Terminierungslösungen wertvolle Zeit sparen.
Im Kern löst die API das Fahrzeug-Routing-Problem (VRP) im Zusammenhang mit Abhol- und Lieferfahrten. Bei diesem Problem geht es darum, die effizientesten Routen für eine Fahrzeugflotte zu berechnen, die mehrere Standorte anfährt, um Abhol- und Lieferaufträge auszuführen, wobei Einschränkungen wie Zeitfenster, Fahrzeugkapazität und Verfügbarkeit berücksichtigt werden müssen.
Darüber hinaus unterstützt unsere API dynamische Anpassungen oder eine Neuoptimierung des Fahrplans. Wenn Sie einen bestehenden Fahrplan ändern müssen – sei es aufgrund neuer Aufträge, Stornierungen oder anderer Änderungen –, können Sie ein aktuelles Bild Ihres Fahrplans bereitstellen, indem Sie die Auftragsstatus und Fahrzeugstandorte angeben. Die API optimiert den Fahrplan dann neu, um diese Änderungen zu berücksichtigen, und gewährleistet so eine kontinuierliche Effizienz Ihrer Betriebsabläufe.
Informationen dazu, wie Sie sich schnell einarbeiten und mit der Nutzung der API beginnen können, finden Sie unter „Erste Schritte“. Im Abschnitt „Tutorials“ stehen Ihnen außerdem mehrere kurze Anleitungen zur Verfügung.
Erste Schritte #
Die API bietet zwei wichtige Methoden zur Optimierung von Routenplanung und Terminierung:
Optimierung (POST) – Verwenden Sie diese Methode, um ein Routing- und Terminplanungs-Optimierungsproblem einzureichen. Nach dem Absenden der POST-Methode erhalten Sie eine eindeutige Referenz-ID.
Optimierung (GET) – Verwenden Sie diese Methode, um den Status eines eingereichten Problems anhand der eindeutigen Referenz-ID abzurufen, die Sie bei der POST-Methode erhalten haben. Wenn die Optimierungslösung bereitsteht, können Sie die Lösung des Optimierungsproblems abrufen.
Optimierung der POST-Methode #
POST: https://iq.ui.scheduledroutes.ddswireless.net
Verwenden Sie diese Methode, um Ihr Routen- und Terminplanungs-Optimierungsproblem an die API zu übermitteln. Sobald eine POST-Anfrage zur Optimierung erfolgreich übermittelt wurde, gibt die API in der Bestätigungsantwort eine eindeutige Referenz-ID zurück. Verwenden Sie diese eindeutige ID, um die eigentliche Lösung mithilfe der GET-Methode zur Optimierung abzurufen ( siehe nächster Abschnitt).
Ein Beispiel für die Übermittlung eines Optimierungsproblems mittels der POST-Methode unter Verwendung eines Beispiel-Tokens und einer Beispiel-Nutzlast:
curl -X POST "https://iq.scheduledroutes.ddswireless.net/raas/optimization"
-H "Content-Type: application/json"
-H "Authorization: Bearer fgJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJhZWU2MDQyZC0zN2E3LTQxNDYtODRlYy04YWU3M2ViODQ4YTgiLCJmaXJzdE5hbWUiOiJUZWMiLCJsYXN0TmFtZSI6IlRyYW5zaXQiLCJzZXF1ZW5jZU51bWJlciI6MSwicm9sZU5hbWVzIjpbImFkbWluIl0sInByb3ZpZGVyTmFtZXMiOlsiQUxMIl0sInVzZXJUZW5hbnRzIjpbMl0sInBlcm1pc3Npb25zIjpbMCwxNjYsMTcwLDE4MSwxODYsMTkxLDIwMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwxNTgsMTU5LDE2MywxNjgsMTgyLDE4OSwxNTcsMTE4LDExOSwxMjAsMTIxLDEyMiwxMjMsMTc1LDE3NiwxOTcsMTk1LDIwNSwyMDIsMjAzLDIwNiwyMTcsMjE5LDE5NiwyMDcsMTk0LDIxNCwyMTgsMjIwLDI5LDMwLDMxLDMyLDMzLDM0LDM1LDM2LDM3LDM4LDM5LDQwLDQxLDQyLDQzLDQ0LDQ1LDQ2LDQ3LDQ4LDQ5LDUwLDUxLDUyLDUzLDU0LDU1LDU2LDU3LDU4LDU5LDYwLDYxLDYzLDY0LDY1LDY2LDY3LDY4LDY5LDcwLDcxLDcyLDczLDc0LDc1LDc2LDc3LDgyLDgzLDg2LDg3LDg4LDg5LDkxLDkyLDkzLDk0LDk1LDk2LDEwMCwxMDEsMTAyLDEwMywxMDQsMTA1LDEwNiwxMDcsMTA4LDEwOSwxMTAsMTExLDExMiwxMTMsMTE0LDExNSwxMTYsMTE3LDEyNCwxMjUsMTI2LDEyNywxMjgsMTI5LDEzMCwxMzEsMTMyLDEzMywxMzQsMTM1LDEzNiwxMzcsMTM4LDEzOSwxNDAsMTQxLDE0MiwxNDMsMTQ0LDE0NSwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTIsMTUzLDE1NCwxNTUsMTU2LDE2MiwxNjUsMTcxLDE4NCwxODcsMTkyLDE5OSwxNzMsMTk4LDE2MCwxNjEsMTY5LDE4MywxODgsODQsOTcsOTgsOTksMTY3LDE3MiwxODAsMTg1LDE5MCwxOTMsMTc0LDE2NCwyMDQsMjE1XSwicGFzc3dvcmRVcGRhdGVkQXQiOiIiLCJ0ZW5hbnQiOnsiaWQiOjIsIm5hbWUiOiJ0ZWNUcmFuc2l0Iiwic2l0ZUlkIjoiOTQiLCJ0aW1lem9uZSI6IkFtZXJpY2EvTG9zX0FuZ2VsZXMiLCJ0eXBlIjoiUmFhUyIsInNlc1VybCI6Imh0dHA6Ly9zdHJhdGVneS1lbmdpbmUtbXVsdGktdGVuYW50LTM6MTYwMDAiLCJkaXNwbGF5TmFtZSI6IlRlYyBUcmFuc2l0In0sInJvbGVzIjpbMjBdLCJpYXQiOjE3NDE5MDU2ODIsImV4cCI6MTc0NDQ5NzY4MiwiaXNzIjoiaXEuc2NoZWR1bGVkcm91dGVzLmRkc3dpcmVsZXNzLm5ldCJ9.fmdXyIylp604DCewvtuKCqLGhh-GFPfJNC9p2v4D-kHxhN2ZmRkHfknpTjiWZOZnB7AnWTUAh6BfZztNR_KLpQDPXcEpNL01lrw7ypIuwIf6CwA3Kwh916mNX-kgvPsyRQvAnvkyd-YO8M6zd_lsVD8oRnb-g07Vta3s3U-Y5uyWnQzv9PEeRf2IizflzlMkM7f1q472_3FQAEmomqMrSreK-YwUP9YxzD-QOW4GaaIUK5pgnzFYgEH2DFNU8KtDPeRdEk1cXL8aACFeawZnYzndvNcuv5fxd-9r-Y4-Tr8NiUwerdhRX3CuD5L5E6JVQdYOUJMFtSVpCbV7smaOJa"
-d @payload.json
Im obigen Beispiel sind wir davon ausgegangen, dass sich das Eingabeproblem in einer Datei namens payload.json. Du musst das Beispiel-Token ersetzen <strong>fgJhbGciOiJSUzI1N</strong>..... mit Ihrem eigenen Token. Das Schema für die Eingabeaufgabe ist im Abschnitt „Problem“ definiert.
Nach dem Absenden der POST-Anfrage erhalten Sie eine Antwortnachricht im folgenden Format:
Antwortschema für die POST-Methode:
{
"id": "string",
"message": "string",
"status": "string",
"error" : "string"
}
Wenn die Übermittlung erfolgreich war, wird die status wird „202“ lauten, wobei die message mit der Angabe „angenommen“ und der id die eindeutige Referenznummer für den asynchronen Vorgang darstellt. Diese ID dient dazu, den Status des Vorgangs zu verfolgen und die Ergebnisse später abzurufen. Tritt ein Fehler auf, wird die status zeigt einen Fehlercode an, der id entweder null oder leer sein, das message wird „Misserfolg“ sein und das error beschreibt den Fehler. Weitere Informationen finden Sie in den unten aufgeführten POST-Statuscodes.
POST-Beispiel (Windows PowerShell):
Das folgende Skript zeigt, wie man in Windows PowerShell eine POST-Anfrage mit einer Beispiel-Nutzlast durchführt. Es wird davon ausgegangen, dass die Eingabe-Nutzlast in einer Datei namens payload.json, und das API-Zugriffstoken wird gespeichert in token.txt. Bei der Ausführung wird die generierte ID in id.txt. Um PowerShell zu starten, geben Sie einfach „PowerShell“ im Startmenü oder in der Befehlszeile ein.
$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-Statuscodes #
| Antwortcode | Beschreibung | Weitere Hinweise |
|---|---|---|
| 202 | Der Antrag wurde zur Bearbeitung angenommen. | Es wird eine Referenz-ID zurückgegeben, mit der Sie die Lösung mittels einer GET-Anfrage abrufen können, sobald sie fertig ist. |
| 400 | Die Eingabevalidierung ist fehlgeschlagen (Ungültige Anfrage). | Fehlender/ungültiger Parameter oder falscher Werttyp. Überprüfen Sie die Eingabedaten und versuchen Sie es erneut. |
| 403 | Unzulässige Anfrage. | Dies geschieht, wenn die Authentifizierung fehlschlägt. |
| 404 | Der angeforderte Pfad wurde nicht gefunden. | Dies geschieht, wenn ein falscher Pfad verwendet wird. |
| 429 | Zu viele Anfragen. | Ratenlimit überschritten (Anfragen pro Minute oder Kontingent erreicht). |
| 500 | Interner Dienstfehler. | Das Problem liegt bei uns. Bitte wenden Sie sich an support@ddswireless.com. |
Optimierung der GET-Methode #
GET: https://iq.ui.scheduledroutes.ddswireless.net/{id}
Verwenden Sie diese Methode, um die optimierte Lösung für die Optimierungsaufgaben abzurufen, die mit der POST-Methode „Optimierung“ erstellt wurden. Dazu müssen Sie die Referenz-ID angeben, die Sie von der POST-Methode erhalten haben.
Ein Beispiel für den Abruf der Antwort der API mithilfe der GET-Methode unter Angabe einer ID:
curl -X GET "https://iq.scheduledroutes.ddswireless.net/raas/optimization/ID"
-H "Content-Type: application/json"
-H "Authorization: Bearer fgkhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJhZWU2MDQyZC0zN2E3LTQxNDYtODRlYy04YWU3M2ViODQ4YTgiLCJmaXJzdE5hbWUiOiJUZWMiLCJsYXN0TmFtZSI6IlRyYW5zaXQiLCJzZXF1ZW5jZU51bWJlciI6MSwicm9sZU5hbWVzIjpbImFkbWluIl0sInByb3ZpZGVyTmFtZXMiOlsiQUxMIl0sInVzZXJUZW5hbnRzIjpbMl0sInBlcm1pc3Npb25zIjpbMCwxNjYsMTcwLDE4MSwxODYsMTkxLDIwMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwxNTgsMTU5LDE2MywxNjgsMTgyLDE4OSwxNTcsMTE4LDExOSwxMjAsMTIxLDEyMiwxMjMsMTc1LDE3NiwxOTcsMTk1LDIwNSwyMDIsMjAzLDIwNiwyMTcsMjE5LDE5NiwyMDcsMTk0LDIxNCwyMTgsMjIwLDI5LDMwLDMxLDMyLDMzLDM0LDM1LDM2LDM3LDM4LDM5LDQwLDQxLDQyLDQzLDQ0LDQ1LDQ2LDQ3LDQ4LDQ5LDUwLDUxLDUyLDUzLDU0LDU1LDU2LDU3LDU4LDU5LDYwLDYxLDYzLDY0LDY1LDY2LDY3LDY4LDY5LDcwLDcxLDcyLDczLDc0LDc1LDc2LDc3LDgyLDgzLDg2LDg3LDg4LDg5LDkxLDkyLDkzLDk0LDk1LDk2LDEwMCwxMDEsMTAyLDEwMywxMDQsMTA1LDEwNiwxMDcsMTA4LDEwOSwxMTAsMTExLDExMiwxMTMsMTE0LDExNSwxMTYsMTE3LDEyNCwxMjUsMTI2LDEyNywxMjgsMTI5LDEzMCwxMzEsMTMyLDEzMywxMzQsMTM1LDEzNiwxMzcsMTM4LDEzOSwxNDAsMTQxLDE0MiwxNDMsMTQ0LDE0NSwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTIsMTUzLDE1NCwxNTUsMTU2LDE2MiwxNjUsMTcxLDE4NCwxODcsMTkyLDE5OSwxNzMsMTk4LDE2MCwxNjEsMTY5LDE4MywxODgsODQsOTcsOTgsOTksMTY3LDE3MiwxODAsMTg1LDE5MCwxOTMsMTc0LDE2NCwyMDQsMjE1XSwicGFzc3dvcmRVcGRhdGVkQXQiOiIiLCJ0ZW5hbnQiOnsiaWQiOjIsIm5hbWUiOiJ0ZWNUcmFuc2l0Iiwic2l0ZUlkIjoiOTQiLCJ0aW1lem9uZSI6IkFtZXJpY2EvTG9zX0FuZ2VsZXMiLCJ0eXBlIjoiUmFhUyIsInNlc1VybCI6Imh0dHA6Ly9zdHJhdGVneS1lbmdpbmUtbXVsdGktdGVuYW50LTM6MTYwMDAiLCJkaXNwbGF5TmFtZSI6IlRlYyBUcmFuc2l0In0sInJvbGVzIjpbMjBdLCJpYXQiOjE3NDE5MDU2ODIsImV4cCI6MTc0NDQ5NzY4MiwiaXNzIjoiaXEuc2NoZWR1bGVkcm91dGVzLmRkc3dpcmVsZXNzLm5ldCJ9.fmdXyIylp604DCewvtuKCqLGhh-GFPfJNC9p2v4D-kHxhN2ZmRkHfknpTjiWZOZnB7AnWTUAh6BfZztNR_KLpQDPXcEpNL01lrw7ypIuwIf6CwA3Kwh916mNX-kgvPsyRQvAnvkyd-YO8M6zd_lsVD8oRnb-g07Vta3s3U-Y5uyWnQzv9PEeRf2IizflzlMkM7f1q472_3FQAEmomqMrSreK-YwUP9YxzD-QOW4GaaIUK5pgnzFYgEH2DFNU8KtDPeRdEk1cXL8aACFeawZnYzndvNcuv5fxd-9r-Y4-Tr8NiUwerdhRX3CuD5L5E6JVQdYOUJMFtSVpCbV7smaOJs"
Ersetzen Sie im obigen Beispiel ID in der URL durch die URL ersetzen, die Sie über die POST-Methode erhalten haben. Wenn zum Beispiel ID ist gleich 5, verwende Folgendes:
curl -X GET "https://iq.scheduledroutes.ddswireless.net/raas/optimization/5"
-H "Content-Type: application/json"
-H "Authorization: Bearer fgkhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJhZWU2MDQyZC0zN2E3LTQxNDYtODRlYy04YWU3M2ViODQ4YTgiLCJmaXJzdE5hbWUiOiJUZWMiLCJsYXN0TmFtZSI6IlRyYW5zaXQiLCJzZXF1ZW5jZU51bWJlciI6MSwicm9sZU5hbWVzIjpbImFkbWluIl0sInByb3ZpZGVyTmFtZXMiOlsiQUxMIl0sInVzZXJUZW5hbnRzIjpbMl0sInBlcm1pc3Npb25zIjpbMCwxNjYsMTcwLDE4MSwxODYsMTkxLDIwMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwxNTgsMTU5LDE2MywxNjgsMTgyLDE4OSwxNTcsMTE4LDExOSwxMjAsMTIxLDEyMiwxMjMsMTc1LDE3NiwxOTcsMTk1LDIwNSwyMDIsMjAzLDIwNiwyMTcsMjE5LDE5NiwyMDcsMTk0LDIxNCwyMTgsMjIwLDI5LDMwLDMxLDMyLDMzLDM0LDM1LDM2LDM3LDM4LDM5LDQwLDQxLDQyLDQzLDQ0LDQ1LDQ2LDQ3LDQ4LDQ5LDUwLDUxLDUyLDUzLDU0LDU1LDU2LDU3LDU4LDU5LDYwLDYxLDYzLDY0LDY1LDY2LDY3LDY4LDY5LDcwLDcxLDcyLDczLDc0LDc1LDc2LDc3LDgyLDgzLDg2LDg3LDg4LDg5LDkxLDkyLDkzLDk0LDk1LDk2LDEwMCwxMDEsMTAyLDEwMywxMDQsMTA1LDEwNiwxMDcsMTA4LDEwOSwxMTAsMTExLDExMiwxMTMsMTE0LDExNSwxMTYsMTE3LDEyNCwxMjUsMTI2LDEyNywxMjgsMTI5LDEzMCwxMzEsMTMyLDEzMywxMzQsMTM1LDEzNiwxMzcsMTM4LDEzOSwxNDAsMTQxLDE0MiwxNDMsMTQ0LDE0NSwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTIsMTUzLDE1NCwxNTUsMTU2LDE2MiwxNjUsMTcxLDE4NCwxODcsMTkyLDE5OSwxNzMsMTk4LDE2MCwxNjEsMTY5LDE4MywxODgsODQsOTcsOTgsOTksMTY3LDE3MiwxODAsMTg1LDE5MCwxOTMsMTc0LDE2NCwyMDQsMjE1XSwicGFzc3dvcmRVcGRhdGVkQXQiOiIiLCJ0ZW5hbnQiOnsiaWQiOjIsIm5hbWUiOiJ0ZWNUcmFuc2l0Iiwic2l0ZUlkIjoiOTQiLCJ0aW1lem9uZSI6IkFtZXJpY2EvTG9zX0FuZ2VsZXMiLCJ0eXBlIjoiUmFhUyIsInNlc1VybCI6Imh0dHA6Ly9zdHJhdGVneS1lbmdpbmUtbXVsdGktdGVuYW50LTM6MTYwMDAiLCJkaXNwbGF5TmFtZSI6IlRlYyBUcmFuc2l0In0sInJvbGVzIjpbMjBdLCJpYXQiOjE3NDE5MDU2ODIsImV4cCI6MTc0NDQ5NzY4MiwiaXNzIjoiaXEuc2NoZWR1bGVkcm91dGVzLmRkc3dpcmVsZXNzLm5ldCJ9.fmdXyIylp604DCewvtuKCqLGhh-GFPfJNC9p2v4D-kHxhN2ZmRkHfknpTjiWZOZnB7AnWTUAh6BfZztNR_KLpQDPXcEpNL01lrw7ypIuwIf6CwA3Kwh916mNX-kgvPsyRQvAnvkyd-YO8M6zd_lsVD8oRnb-g07Vta3s3U-Y5uyWnQzv9PEeRf2IizflzlMkM7f1q472_3FQAEmomqMrSreK-YwUP9YxzD-QOW4GaaIUK5pgnzFYgEH2DFNU8KtDPeRdEk1cXL8aACFeawZnYzndvNcuv5fxd-9r-Y4-Tr8NiUwerdhRX3CuD5L5E6JVQdYOUJMFtSVpCbV7smaOJs"
Denken Sie auch daran, Ihr eigenes API-Zugriffstoken zu verwenden.
Antwortschema für die GET-Methode:
{
status: "string",
message: "string",
error: "string",
"solution": {
"statistics": {},
"routes": []
"unassigned": [],
}
}
Wenn die Lösung fertig ist, statistics, routesund unassignedwird auf der Grundlage der erhaltenen Lösung ausgefüllt. Andernfalls, ähnlich wie bei der POST-Methode, status, messageund errorzeigt den Status oder den Fehler an. Das Schema für die Ausgabelösung ist im Abschnitt „Lösung“ definiert.
GET-Beispiel (Windows PowerShell):
Das folgende Skript zeigt, wie man in Windows PowerShell eine GET-Anfrage unter Verwendung einer ID erstellt, die mit der POST-Methode generiert wurde. Es wird davon ausgegangen, dass die ID in einer Datei namens id.txt, und das API-Zugriffstoken wird gespeichert in token.txt. Bei der Ausführung wird die generierte Antwort in response.txt. Um PowerShell zu starten, geben Sie einfach „PowerShell“ im Startmenü oder in der Befehlszeile ein.
$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
GET-Statuscodes #
| Antwortcode | Beschreibung | Weitere Hinweise |
|---|---|---|
| 200 | Die Anfrage war erfolgreich. | Die Lösung wird über statistics, routesund unassigned. |
| 202 | Die Anfrage wurde angenommen, ist jedoch noch nicht abgeschlossen. | Der Status lautet „In Bearbeitung“. Bitte schauen Sie später noch einmal nach, ob eine Lösung bereitsteht. |
| 400 | Die Anfrage konnte nicht verarbeitet werden (Ungültige Anfrage). | Aufgrund ungültiger Eingaben oder Parameter konnte keine brauchbare Lösung ermittelt werden. |
| 401 | Unzulässige Anfrage. | Eine Benutzerauthentifizierung ist erforderlich. Es wurden keine gültigen Anmeldedaten empfangen. |
| 500 | Interner Dienstfehler. | Auf unserer Seite ist ein Fehler aufgetreten. Kontakt support@ddswireless.com. Felder wie statistics, routesund unassigned wird leer sein. |
Begriffe #
Um ein Routen- und Terminplanungs-Optimierungsproblem für eine Fahrzeugflotte zu lösen, gehen Sie wie folgt vor:
-
Problemdefinition: Beginnen Sie damit, Ihr Problem anhand des im Abschnitt „Problem“ angegebenen Formats zu skizzieren.
-
Problem übermitteln: Verwenden Sie die POST-Methode, wie im Abschnitt „Erste Schritte“ beschrieben, um Ihr Problem an die API zu senden.
-
Lösung abrufen: Rufen Sie die Lösung für Ihr Optimierungsproblem mithilfe der GET-Methode ab, die im Abschnitt „Erste Schritte“ beschrieben ist. Das Format der Lösung wird im Abschnitt „Lösung“ erläutert.
Weitere Informationen zu den verschiedenen Begriffen, die in der API verwendet werden, finden Sie im Abschnitt „Glossar“. Eine Liste mit häufig gestellten Fragen finden Sie im Abschnitt „FAQ“.
Problem Nr.
Die Problem Dieses System stellt ein Routing- und Terminierungsproblem dar. Wie in der folgenden Abbildung dargestellt, besteht es aus vier Hauptkomponenten: fleet, jobs, objectiveund configuration. Von diesen vier Komponenten fleet und jobs, sind obligatorisch, während objective und configuration sind optional.

Um einen Standort oder eine Adresse in der API anzugeben, verwenden Sie WGS84-Geokoordinaten mit mindestens 5 Dezimalstellen, um eine hohe Genauigkeit zu gewährleisten.
Wenn Sie beispielsweise eine Adresse wie „1600 Amphitheatre Parkway, Mountain View, CA“, die zugehörige Geokoordinate wäre der Breitengrad
37.423021 und Längengrad -122.083739. Daher geben Sie es entweder wie folgt an:
"location": {"lat": 37.423021, "lng": -122.083739} oder [37.423021, -122.083739].
Hinweis:
Die API verwendet das ISO-8601-Format für Zeitstempel, einschließlich Zeitzonenangaben, um die Ortszeit für das Gebiet zu definieren, für das Sie eine optimierte Routenplanung und Terminierung benötigen.
Beispiel:
2024-07-31T14:45:30-08:00 entspricht dem 31. Juli 2024 um 14:45:30 Uhr PST, was einer Zeitverschiebung von 8 Stunden gegenüber der koordinierten Weltzeit (UTC) entspricht.
Außerdem müssen Sie in der Eingabe-API-Nutzlast durchgehend dieselbe lokale Zeitzone verwenden. Werden mehrere Zeitzonen erkannt, gibt die API einen Fehler zurück. Die Zeiten für geplante Stopps in der Ausgabeantwort werden in demselben Format bereitgestellt, wie es in der Eingabe-API-Nutzlast angegeben wurde.
Beispiel:
Wenn Sie angeben, dass 2024-07-31T14:45:30-08:00 in Ihrer Eingabe-Nutzlast enthalten sind, werden die optimierten Fahrzeiten in der Ausgabe ebenfalls enthalten sein 2024-07-31T14:45:30-08:00 Format.
Wenn Sie 2024-07-31T14:45:30+05:30 Wenn die Eingabe in ist, lautet die Ausgabe 2024-07-31T14:45:30+05:30.
Hinweis:
Alle optionalen Attribute können in der Nutzlast weggelassen werden. Leere Arrays (z. B. []) kann auch für optionale Attribute verwendet werden, die ein Array akzeptieren.
Hinweis:
Stellen Sie sicher, dass die an die API gesendeten Daten keine vertraulichen oder personenbezogenen Informationen enthalten. Vermeiden Sie beispielsweise die Verwendung realer Identifikatoren wie Kfz-Kennzeichen als Fahrzeug-ID oder Auftrags-/Aufgaben-IDs.
Im Folgenden werden wir jede dieser Komponenten ausführlich beschreiben:
fleet: [erforderlich] Es enthält eine Liste von Fahrzeugen sowie die dazugehörigen Informationen, wie z. B. Schichtpläne, Start- und Endorte, Pausen, Kapazitäten und Qualifikationen.
Für jedes Fahrzeug können Sie einen oder mehrere Schichtpläne definieren, indem Sie die Start- und Endzeiten sowie die entsprechenden Standorte angeben. Um diese Standorte zu identifizieren, müssen Sie deren Geokoordinaten angeben, die aus Breiten- und Längengrad bestehen.
Jedes Fahrzeug kann eine oder mehrere Pausen haben. Für jede Pause können Sie ein Zeitfenster definieren, in dem sie eingelegt werden kann, sowie den Ort und die Dauer der Pause.
Für jedes Fahrzeug können Sie einen oder mehrere Kapazitätstypen sowie die verfügbaren Einheiten für jeden Typ definieren. Die Fahrzeugkapazität kann anhand mehrdimensionaler Maßeinheiten wie Volumen, Masse oder Größe dargestellt werden.
Für jedes Fahrzeug können Sie eine oder mehrere Fähigkeiten angeben, die es befähigen, bestimmte Aufgaben auszuführen. Beispielsweise könnten Sie „Schweißgerät“ und „Sauerstoffflasche“ als Fähigkeiten für ein Fahrzeug und „Hebebühne“ als Fähigkeit für ein anderes Fahrzeug zuweisen. Wenn ein Auftrag eine Hebebühne erfordert, kann nur das mit dieser Fähigkeit ausgestattete Fahrzeug den Auftrag ausführen. Sie können für jedes Fahrzeug auch Grenzwerte festlegen, wie beispielsweise die maximale Anzahl an Stopps und die maximale Fahrstrecke (in Meilen).
jobs: [erforderlich] Hier wird eine Liste der Aufträge angegeben, die von den in der fleet Objekt. Jeder Auftrag kann eine Reihe von Aufgaben umfassen, bei denen es sich ausschließlich um Abholungen, ausschließlich um Zustellungen oder um beides (Abholungen und Zustellungen) handeln kann. Aufträge vom Typ „Besuch“, bei denen wir einen Standort aufsuchen müssen, um eine Arbeit auszuführen (z. B. Reparaturen, Installation eines Modems usw.), können Sie als Lieferaufgabe mit oder ohne Kapazitätsbedarf betrachten. Für jede Aufgabe können Sie verschiedene Attribute definieren, wie z. B. Standort, Zeitfenster, Dauer, Kapazitätsanforderungen und erforderliche Fähigkeiten.
Um den Standort einer Aufgabe anzugeben, müssen Sie deren Geokoordinaten angeben, die aus Breiten- und Längengrad bestehen.
Wenn Sie für eine Aufgabe ein Zeitfenster festlegen, plant der Optimierer die Ausführung der Aufgabe innerhalb dieses Zeitraums. Mit anderen Worten: Die voraussichtliche Ankunftszeit (ETA) für die Aufgabe in der API-Antwort liegt innerhalb des angegebenen Zeitfensters. Wenn der Optimierer keine geeignete ETA für eine Aufgabe innerhalb des angegebenen Zeitfensters finden kann, bleibt die Aufgabe unzugewiesen. Für Aufgaben, die flexibel oder nicht zeitkritisch sind, können Sie ein breiteres Zeitfenster mit einer maximalen Spanne von 24 Stunden festlegen. Die API verwendet die zuvor beschriebenen ISO-Zeitstempel.
Sie können für jede Aufgabe eine Dauer (in Sekunden) angeben. Dies ist die Zeit, die an einem bestimmten Standort entweder für das Be- oder Entladen eines Artikels oder für die Ausführung der Aufgabe aufgewendet wird.
Sie können die Kapazitätsanforderungen für jede Aufgabe unter Verwendung mehrdimensionaler Maßeinheiten wie Volumen, Masse oder Größe angeben. Darüber hinaus können Sie benutzerdefinierte Namen für Ihre Kapazitätstypen erstellen, z. B. „Sitzplatz“, „Container“, „Palette“ oder „Behälter“. Für jeden Kapazitätstyp können Sie zudem die genaue Menge festlegen, die zur Ausführung der Aufgabe benötigt wird.
Sie können für jede Aufgabe auch eine Liste der erforderlichen Fähigkeiten definieren. Nur Fahrzeuge mit den entsprechenden Fähigkeiten kommen für die Ausführung dieser Aufgabe in Frage. Wenn Sie beispielsweise „Schweißgerät“ und „Sauerstoffflasche“ als erforderliche Fähigkeiten für eine Aufgabe angeben, werden nur Fahrzeuge ausgewählt, die über diese Fähigkeiten verfügen, um die Aufgabe zu erledigen.
objective: [optional] Hiermit wird das Optimierungsziel oder die Optimierungsstrategie festgelegt. Derzeit werden von der API die folgenden drei Ziele unterstützt:
Gesamtfahrzeit minimieren: Dies ist die Standard-Optimierungsstrategie, die darauf abzielt, die Gesamtfahrzeit der Flotte bei der Erledigung der vorgegebenen Aufträge zu minimieren.
Anzahl der Routen minimieren: Diese Optimierungsstrategie konzentriert sich darauf, die Anzahl der Fahrzeuge zu reduzieren, die zur Erledigung der festgelegten Aufträge benötigt werden. Dies kann jedoch als Kompromiss zu einer erhöhten Gesamtfahrzeit für die Flotte oder einer höheren Auslastung einzelner Fahrzeuge führen.
Auslastung auf die Routen verteilen: Diese Optimierungsstrategie zielt darauf ab, die Auslastung gleichmäßig auf alle Fahrzeuge der Flotte zu verteilen. Diese Verteilung kann jedoch zu einer erhöhten Gesamtfahrzeit für die Flotte führen.
configuration: [optional] Über die Konfiguration können Sie die API-Einstellungen anpassen oder die Standardoptionen ändern. So können Sie beispielsweise festlegen, ob die API-Antwort eine Zusammenfassung der Optimierungsstatistiken (wie Gesamtfahrzeit und -strecke) oder eine Liste der nicht zugewiesenen Aufgaben enthalten soll.
Schema für Eingabeanfragen: #
Das Schema der Eingabeanfrage zur Lösung eines Routenoptimierungsproblems sieht wie folgt aus:
"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
}
Um ein Problem über die API zu melden, muss diese Anfrage gemäß der Beschreibung im Abschnitt „Erste Schritte“ in der POST-Methode enthalten sein.
Bei einem Routenoptimierungsproblem soll eine Fahrzeugflotte eine Reihe von Aufträgen effizient abwickeln. Das obige Schema ermöglicht es Benutzern, ihre Flotte und ihre Aufträge zu definieren. In der aktuellen Version der API kann jeder Auftrag:
-
Nur Abholaufträge: Bei diesen Aufträgen müssen Gegenstände entlang der Route abgeholt und zum Endpunkt der Route geliefert werden.
-
Nur Lieferaufträge: Bei diesen Aufträgen müssen Waren ausgeliefert werden, die zu Beginn der Route auf das Fahrzeug verladen werden.
-
Abhol- und Zustellaufgaben (P/D): Diese Aufgaben umfassen sowohl die Abholung als auch die Zustellung. Dabei wird etwas an einem Ort abgeholt und an einen anderen Ort gebracht.
Für das Problem müssen mindestens ein Auftrag und ein Fahrzeug angegeben werden.
Behandeln Sie „Besuchs“-Aufträge, bei denen ein Vor-Ort-Einsatz erforderlich ist (z. B. Reparaturen, Modem-Installationen usw.), als Lieferaufträge – mit oder ohne Kapazitätsanforderung.
Außerdem:
-
Wird für einen Auftrag nur das Objekt „Abholungen“ angegeben, gilt dieser als reiner Abholauftrag.
-
Wird für einen Auftrag nur das Objekt „Lieferungen“ angegeben, gilt dieser als reiner Lieferauftrag.
-
Wenn für einen Auftrag sowohl eine „Abholung“ als auch eine „Zustellung“ vorgesehen sind, wird dieser als Abhol- und Zustellauftrag eingestuft.
Die API tut nicht Unterstützung von Aufträgen mit mehreren Abholungen und mehrere Lieferungen.
Mit anderen Worten: Wenn Sie einen „Abhol- und Zustellauftrag“ definieren möchten:
- Die
"pickups"Das Array darf nur enthalten eins Abholauftrag. - Die
"deliveries"Das Array darf nur enthalten eins Lieferauftrag.
Die API unterstützt zudem keine Aufträge ohne Abholung und ohne Zustellung.
Klassifizierungsregeln:
- Wenn nur
"pickups"ist definiert, wird der Auftrag als an der Tonabnehmerhalterung befestigt Stelle. - Wenn nur
"deliveries"ist definiert, wird der Auftrag als lieferungsgebunden Stelle. - Wenn sowohl Abholung als auch Zustellung definiert sind, ist der Anker derjenige, der ein Zeitfenster enthält.
- Wenn sowohl für die Abholung als auch für die Zustellung Zeitfenster angegeben sind, gilt der Auftrag als abholungsgebunden.
Für jede Aufgabe können verschiedene Attribute und Einschränkungen definiert werden, wie beispielsweise Kapazitätsanforderungen, Zeitfenster für die Erbringung der Dienstleistung und erforderliche Fähigkeiten. Besuchsaufträge, bei denen wir bestimmte Orte aufsuchen müssen, um Aufgaben (z. B. Reparaturen) auszuführen, können in der Tat als eine spezielle Form von Lieferaufträgen betrachtet werden (mit oder ohne Kapazitätsanforderungen). Aufgaben werden Fahrzeugen zugewiesen, deren Kapazitäten oder Qualifikationen den Anforderungen der Aufgabe entsprechen. Wenn für eine Aufgabe beispielsweise eine Hebebühne oder eine Leiter benötigt wird, werden nur Fahrzeuge eingesetzt, die mit einer Hebebühne oder einer Leiter ausgestattet sind.
Lassen Sie uns nun die einzelnen Elemente der Payload der Input-API genauer betrachten.
Problem [erforderlich]: Hier wird das Routing- und Terminierungsoptimierungsproblem angegeben, das Sie lösen möchten. Es besteht aus den folgenden Attributen:
Flotte [erforderlich]: Definiert die Flotteninformationen. Es handelt sich um ein Array von Flottenobjekten. Jedes Flottenobjekt besteht aus den folgenden Attributen:
id: [erforderlich] eine eindeutige Kennung (Ganzzahl) für das Fahrzeug.
shifts: [optional] ein Array von Schicht-Objekten; jedes Schicht-Objekt enthält die Daten für den Start- und Endort sowie die Start- und Endzeit der Schicht sowie ein Array von Pausen-Objekten, die jeweils den Start- und Endort sowie die Start- und Endzeit der Pause enthalten. Es können mehrere Schicht-Objekte definiert werden, diese dürfen sich jedoch nicht überschneiden. Elemente in jedem Schicht-Objekt:
start: die Startzeit und der Startort der Schicht
time: [optional]. Hiermit wird die Startzeit der Schicht festgelegt. Wird kein Wert angegeben, wird standardmäßig 00:00:00 (Mitternacht) des aktuellen Datums verwendet.
location: [optional]. Hiermit werden die Geokoordinaten (Breiten- und Längengrad) des Startortes angegeben. Sie können diese als Array angeben, zum Beispiel [A,B] in dem A steht für den Breitengrad und B steht für den Längengrad. Alternativ kannst du ihn wie folgt angeben: {"lat": A,"lng": B}.
end: die Endzeit der Schicht und der Endort
time: [optional]. Hiermit wird die Endzeit der Schicht festgelegt. Wird kein Wert angegeben, wird standardmäßig 23:59:00 Uhr des aktuellen Datums verwendet.
location: [optional]. Hiermit werden die Geokoordinaten (Breiten- und Längengrad) des Zielortes angegeben. Sie können diese als Array angeben, zum Beispiel [A,B] in dem A steht für den Breitengrad und B steht für den Längengrad. Alternativ kannst du ihn wie folgt angeben: {"lat": A,"lng": B}.
breaks: [optional] ein Array von Break-Objekten
serviceWindow: [erforderlich, wenn „breaks“ verwendet wird]: der Zeitraum, in dem die Pause stattfinden kann
duration: [erforderlich, wenn „breaks“ verwendet wird]: eine Ganzzahl, die die Dauer der Pause in Sekunden angibt
location: [optional]: Die Position des Zeilenumbruchs. Sie können diese als Array angeben, zum Beispiel [A,B] in dem A steht für den Breitengrad und B steht für den Längengrad. Alternativ kannst du ihn wie folgt angeben: {"lat": A,"lng": B}.Der Ort ist optional. Wird der Ort nicht angegeben, handelt es sich um eine „flexible“ Pause, was bedeutet, dass sie nach Belieben des Fahrers an einem beliebigen Ort eingelegt werden kann.
Beispiel:
"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}
}
]
}]
Kapazitäten: [erforderlich] ein Array von Kapazitätsobjekten. Jedes Kapazitätsobjekt ist ein Schlüssel-Wert-Objekt, das mit den folgenden Schlüsseln definiert ist:
name: [erforderlich] eine Zeichenfolge, die den Namen des Kapazitätstyps angibt (z. B. „Rollstuhl“, „Kiste“, „Sitzplatz“, „Ablagefach“)
units: [erforderlich] eine ganze Zahl, die die verfügbaren Einheiten des Kapazitätstyps angibt
Wenn ein Fahrzeug beispielsweise Platz für 2 Personen und 20 Pakete bietet, können Sie seine Kapazität wie folgt definieren:
"capacities": [
{
"name": "seat",
"units": 2,
},
{
"name": "package",
"units": 20,
}
]
Fähigkeiten: [optional] Eine Liste von Fahrzeugfähigkeiten oder Ausrüstungsgegenständen, die jeweils durch eine für Ihre Anwendung spezifische beliebige Zeichenfolge dargestellt werden. Auf diese Weise können Sie die Fähigkeiten Ihrer Fahrzeuge an die Anforderungen der jeweiligen Einsätze anpassen. Beispiel:
"skills": ["lift","fridge","oxygen tank"]
Einschränkungen: [optional] gibt die für das Fahrzeug geltenden Einschränkungen an
maxDistance: [optional] eine ganze Zahl, die die maximale Reichweite des Fahrzeugs in Meilen angibt
maxStops: [optional] eine ganze Zahl, die die maximale Anzahl an Stopps (Abhol- oder Zustellaufträge) angibt, die das Fahrzeug in einer Schicht bedienen kann
lifoDepth: [optional] eine Ganzzahl, die die LIFO-Tiefe (Last In First Out) des Fahrzeugs angibt
"limits": {
"lifoDepth" : 1,
"maxDistance": 3000,
"maxStops" : 20,
}
lastKnownLocation: [optional, wird nur für die Neuoptimierung verwendet] Gibt den letzten bekannten Standort des Fahrzeugs zum angegebenen Zeitpunkt an. Diese Information ist entscheidend für die Neuoptimierung einer laufenden Route, um neuen Änderungen Rechnung zu tragen, wie z. B. Fahrzeugausfälle, verspätete Aufträge, neue Aufträge oder stornierte Aufträge. Die API nutzt diese Daten, um den Plan effizient neu zu optimieren. Daher müssen Sie bei der Neuoptimierung eines bestehenden Fahrplans den Standort aller beteiligten Fahrzeuge angeben.
Beispiel:
"lastKnownLocation": {
"location": {"lat":53.45612, "lng":12.65421},
"time" : "2020-07-04T12:00:05-08:00"
}
routeTemplateId: [optional] Dies ist eine eindeutige Kennung zur Definition einer Routenvorlage. Die API unterstützt das Konzept der „Routenvorlagen“, mit denen Sie die Spezifikationen für einen bestimmten Fahrzeugtyp festlegen und die API anweisen können, eine bestimmte Anzahl solcher Fahrzeuge zur Optimierung der Routenplanung und Disposition zu generieren. Eine Routenvorlage enthält dieselben Informationen wie eine Route oder ein Fahrzeug, Sie können jedoch einen „Größen“-Parameter namens maxInstances dafür angeben. Angenommen, Sie haben 100 Fahrzeuge. Sie könnten 2 oder 3 Routenvorlagen definieren:
- Schicht 6:00–18:00 Uhr, Kapazität 4, Größe=60
- Schicht 13:00–01:00 Uhr, Kapazität 4, Größe = 50
- Schicht 6:00–20:00 Uhr, Kapazität 10, Größe=35
Das bedeutet, dass die API bei Bedarf automatisch bis zu 60 Fahrzeuge anhand von Vorlage 1, 5 anhand von Vorlage 2 und 35 anhand von Vorlage 3 instanziieren kann.
maxInstances: [optional] Wenn routeTemplateId wird bereitgestellt, maxInstances legt fest, wie viele Routenvorlagen auf der Grundlage der angegebenen Routenvorlage generiert werden sollen.
Bei der Konfiguration von Routen mithilfe von
id, routeTemplateIdund maxInstances:
Genau eins von id oder routeTemplateId muss verwendet werden – niemals beides.
id und maxInstances kann nicht zusammen verwendet werden.
Wenn beide routeTemplateId und maxInstances sind vorhanden, verwendet die API die Routenvorlagenmodell um Routen zu erstellen.
jobs: ein Array von Job-Objekten [mindestens ein Job ist erforderlich]:
id: [erforderlich] eine eindeutige Kennung (Ganzzahl) für den Auftrag
pickups: [ optional] ein Array von Task-Objekten, von denen jedes eine Abholaufgabe definiert
deliveries: [optional] ein Array von Task-Objekten, von denen jedes eine Liefer- (oder Abgabe-)Aufgabe definiert
Die API unterliegt strengen Regeln hinsichtlich der Konfiguration der Auftragsabholung und -zustellung:
- Die API unterstützt keine Aufträge mit mehreren Abholungen und mehreren Zustellungen.
- Die API unterstützt keine Aufträge ohne Abholung und ohne Zustellung.
- Wenn nur
"pickups"Wenn dies angegeben ist, wird der Auftrag als Auftrag mit Abholung. - Wenn nur
"deliveries"Wenn dies angegeben ist, wird der Auftrag als leistungsorientierte Stelle. - Wenn ein Auftrag sowohl eine Abholung als auch eine Zustellung umfasst, richtet sich der Anker nach der Aufgabe, für die ein Zeitfenster festgelegt wurde.
- Wenn beide Aufgaben Zeitfenster haben, wird der Auftrag als auf eine Abholung bezogener Auftrag behandelt.
Jedes Aufgabenobjekt besteht aus den folgenden Attributen:
id: [erforderlich] eine eindeutige Kennung (Ganzzahl) für die Aufgabe
Ort: [erforderlich] Es handelt sich um ein Schlüssel-Wert-Objekt, das die Geokoordinaten (Breiten- und Längengrad) des Ortes angibt, an dem die Aufgabe ausgeführt werden soll. Sie können es als Array angeben, zum Beispiel [A,B] in dem A steht für den Breitengrad und B steht für den Längengrad. Alternativ kannst du ihn wie folgt angeben: {"lat": A,"lng": B}.
Beispiel:
"location": {"lat": 52.46642, "lng": 13.28124}
"location": [52.46642, 13.28124]
serviceWindows: [optional oder erforderlich, je nach Anwendungsfall; siehe die obige Definition von Abholungen und Zustellungen] Hier wird das Zeitfenster für die Ausführung der Aufgabe festgelegt. Das Zeitfenster ist ein Array mit folgendem Format: [A, B] wobei A und B die Start- und Endzeit des Zeitfensters für die Dienstleistung sind. Die API versucht, eine voraussichtliche Ankunftszeit (ETA) innerhalb des angegebenen Zeitfensters für diese Aufgabe zu ermitteln. Ist dies nicht möglich, wird die Aufgabe als „nicht zugewiesen“ aufgeführt. Mit anderen Worten: Die Zeiten „A“ und „B“ definieren den frühesten und spätesten Zeitpunkt, zu dem eine Aufgabe von einem Fahrzeug erledigt werden muss. Verwenden Sie für Aufgaben, die flexibel oder nicht zeitkritisch sind, ein beliebig großes Zeitfenster (max. 24 Stunden), um der API mehr Flexibilität bei der Planung anderer Aufgaben zu geben. Die aktuelle Version der API unterstützt nur ein Zeitfenster pro Aufgabe.
Für Aufträge, die ausschließlich die Abholung oder ausschließlich die Lieferung betreffen, ist das Zeitfenster erforderlich. Beispiel:
"serviceWindows": ["2024-08-30T09:00:00-08:00",
"2024-08-30T21:00:00-08:00"]
Dauer: [erforderlich] Gibt die Dauer der Aufgabe in Sekunden an. Es kann sich entweder um eine Ganzzahl oder um ein Schlüssel-Wert-Objekt mit den folgenden Schlüsseln handeln:
"fixed": die festgelegte Dauer (in Sekunden) für den Vorgang (z. B. zum Suchen eines Parkplatzes, zum Herunterfahren des Aufzugs usw.)
"service": die Dauer (in Sekunden) für die Ausführung des Auftrags.
Beispiele:
"duration": 1950
OR
"duration": {"fixed":150, "service": 1800}
Nachfrage: [ optional] ein Array mit Kapazitätsanforderungen für die Aufgabe. Die Struktur jedes Nachfrageobjekts entspricht der des Kapazitätsobjekts in der oben definierten Flottenentität. Jeder Kapazitätsposten besteht aus einem Namen (Zeichenkette) und der Anzahl der verfügbaren Einheiten (Ganzzahl). Die angegebenen Namen müssen mit denen übereinstimmen, die im Kapazitätsobjekt der Flottenentität definiert sind. Wenn ein Auftrag beispielsweise Kapazität für zwei Sitzplätze und 20 Pakete benötigt, definieren Sie die Nachfrage wie folgt:
"demand": [
{
"name": "seat",
"units": 2,
},
{
"name": "package",
"units": 20,
}
]
Fähigkeiten: [optional] Ein Array von Fähigkeiten oder Ausrüstungsgegenständen, die zur Ausführung der Aufgabe erforderlich sind; jede davon wird durch eine beliebige, für Ihre Anwendung spezifische Zeichenfolge dargestellt. Nur Fahrzeuge, deren Fähigkeiten mit den für die Aufgabe erforderlichen Fähigkeiten übereinstimmen, kommen für die Ausführung der Aufgabe in Betracht. Diese Fähigkeiten werden mit den Fähigkeiten abgeglichen, die in der oben definierten Flottenentität festgelegt sind. Beispiel:
"skills": ["lift", "ladder", "welding machine"]
Status: [optional, wird nur für die Neuoptimierung verwendet] Dies ist eine Zeichenfolge, die den Status der Aufgabe angibt und eine der folgenden Optionen sein kann: "pending", "in_progress", "performed". Diese Informationen sind entscheidend für die Neuoptimierung einer laufenden Route, um neuen Änderungen Rechnung zu tragen, wie z. B. defekte Fahrzeuge, verspätete Aufträge, neue Aufträge oder stornierte Aufträge. Die API nutzt diese Daten, um den Plan effizient neu zu optimieren. Daher müssen Sie bei der Neuoptimierung eines bestehenden Zeitplans den Wert dieses Attributs angeben. Für neue Aufgaben oder Aufgaben, die noch nicht ausgeführt wurden, setzen Sie ihn auf "pending". Wenn die Aufgabe bereits erledigt ist, setze sie auf "performed". Wenn das Fahrzeug bereits am Einsatzort angekommen ist und der Auftrag bereits ausgeführt wird, stellen Sie es auf "in_progress". Der Standardwert ist "pending".
Beispiel: "status": "pending"
vehicleId: [optional, wird nur für die Neuoptimierung verwendet], gibt die zugewiesene Fahrzeug-ID (Ganzzahl) für die bereits geplanten Aufgaben an. Diese Information ist entscheidend für die Neuoptimierung einer laufenden Route, um neuen Änderungen Rechnung zu tragen, wie z. B. Fahrzeugausfälle, verspätete Aufträge, neue Aufträge oder stornierte Aufträge. Die API nutzt diese Daten, um den Plan effizient neu zu optimieren. Daher müssen Sie bei der Neuoptimierung eines bestehenden Plans den Wert dieses Attributs angeben. Der Standardwert ist Null. Setzen Sie ihn für neue Aufgaben auf Null. Setzen Sie dieses Attribut für bestehende Aufgaben, die bereits einem Fahrzeug zugewiesen sind, auf die zugewiesene Fahrzeug-ID.
Beispiel: "vehicleId": 12
eta: [optional, wird nur für die Neuoptimierung verwendet], gibt die aktuelle ETA (voraussichtliche Ankunftszeit) für die bereits geplanten Aufträge an. Diese Information ist entscheidend für die Neuoptimierung einer laufenden Route, um neue Änderungen wie Fahrzeugausfälle, verspätete Aufträge, neue Aufträge oder stornierte Aufträge zu berücksichtigen. Die API nutzt diese Daten, um den Plan effizient neu zu optimieren. Daher müssen Sie bei der Neuoptimierung eines bestehenden Zeitplans den Wert dieses Attributs angeben. Der Standardwert ist 0. Setzen Sie ihn für neue oder bereits ausgeführte Aufgaben auf 0, für bestehende ausstehende Aufgaben jedoch auf die bestehende ETA.
Beispiel: "eta": "2021-07-04T12:13:00-08:00"
Ziel: [ optional] Eine Ganzzahl, die das Optimierungsziel (die Strategie) angibt: (Standardwert = 1)
1: Gesamtfahrzeit minimieren [Standard]
2: Anzahl der Routen minimieren
3: Auslastung auf die Routen verteilen
Beispiel: "objective": 1
Konfiguration: [ optional] Hier können einige zusätzliche Einstellungen oder Konfigurationen festgelegt werden:
polylineType: [optional] Hiermit wird der Typ der Ausgabepolylinie festgelegt, die für jede geplante Route zurückgegeben werden kann. Es handelt sich um eine Zeichenfolge aus folgenden Optionen: "none", "plain", "encoded". Wenn "none"ausgewählt ist, werden keine Polylinien in die API-Antwort aufgenommen. Wenn "plain" angegeben wird, wird als Polylinie eine geordnete Liste der Schnittpunkte zurückgegeben, die wir zwischen jedem Paar aufeinanderfolgender Haltestellen passieren müssen. Wenn "encoded" wird verwendet, wird die Polylinie in ein Zeichenfolgenformat komprimiert, das Benutzer an Navigations-APIs von Drittanbietern wie Google Maps übergeben können, um detaillierte Wegbeschreibungen zu erhalten. Der Standardwert ist "none".
unassignedTasks: [optional] Dies ist ein Flag, das festlegt, ob nicht zugewiesene Aufgaben in der Antwort enthalten sein sollen oder nicht. Der Standardwert ist „False“. Wenn die API aus irgendeinem Grund eine Aufgabe keiner Route zuweisen kann, wird sie als „nicht zugewiesen“ aufgeführt.
statistics: [ optional] Ein Flag, das festlegt, ob die Optimierungsstatistiken in die Ausgabelösung aufgenommen werden sollen oder nicht. Der Standardwert ist „True“.
Einheiten: [optional] Hier werden die Einheiten für die Ausgabestatistiken sowie die Einheiten für die Flottengrenzen festgelegt. Es kann entweder "metric" oder "imperial". Der Standardwert ist "metric".
maxRideTable: [optional] Hiermit wird die maximale Fahrzeit für alle Fahrten festgelegt. Sie wird durch eine statische Tabelle definiert, in der jede Zeile ein Array mit drei Zeitwerten (in Minuten) enthält: [A, B, C]. Das bedeutet: Liegt die direkte Fahrzeit für eine Fahrt zwischen A und B, entspricht die maximale Fahrzeit „Fahrtzeit + C“. Hier ist zum Beispiel eine einfache Tabelle mit zwei Zeilen: "maxRideTable":[[0, 10, 30], [11, 20, 40]]. Standard ist [[0, 300, 720]]. Überschneidungen und Lücken sind in dieser Tabelle nicht zulässig. Außerdem beträgt die Zeitgranularität Minuten.
Fahrzeugkapazitäten: [optional] Fahrzeugkapazitätsdefinitionen können benannt und anschließend im Abschnitt „Flotte“ verwendet werden. Dies ist besonders nützlich bei komplexen Definitionen, wenn ein Fahrzeug viele verschiedene Konfigurationen haben kann. Wenn ein Fahrzeug beispielsweise entweder (10 gehfähige und 0 Rollstuhlfahrer) ODER (8 gehfähige und 1 Rollstuhlfahrer) befördern kann, könnten Sie Folgendes definieren: "vehicleCapacities":{"flexBus": [[{"name": "ambulatory", "units": 10}], [{"name": "ambulatory", "units": 8},{"name":"wheelchair", "units": 1}]]}. Und dann kannst du in den Flotten-Eigenschaften Folgendes verwenden fleet[<index>].capacities: "flexBus" für jeden FlexBus in der Flotte. Benannte Fahrzeugkapazitäten können auch in Ihrem persönlichen Kundenprofil gespeichert werden, wo sie zur Verwendung bereitstehen, ohne dass sie im Konfigurationsbereich neu definiert werden müssen. Wenn eine benannte Fahrzeugkapazität sowohl in Ihrem persönlichen Profil als auch in der Nutzlast vorhanden ist, hat die Definition in der Nutzlast Vorrang.
freezeWindowLength: [optional] Die Dauer des Einfrierfensters in Minuten. Ein Einfrierfenster ist ein Konzept, das nur bei der Optimierung am selben Tag zur Anwendung kommt und bei der erneuten Optimierung eines Problems nützlich ist. Wenn Sie beispielsweise ein Problem bereits optimiert haben, aber im Laufe des Tages Änderungen vornehmen möchten, könnten Sie das Problem erneut senden (mit einem entsprechenden task.status, der angibt, was bereits erledigt wurde) und ein Freeze-Fenster von 60 Minuten festlegen. Dadurch wird dem Optimierer mitgeteilt, dass der Zeitraum von 60 Minuten ab dem „aktuellen Zeitpunkt“ gesperrt ist. Innerhalb des Freeze-Fensters können keine Aufgaben zu einer Route hinzugefügt oder von dieser entfernt werden.
lifoConstrainedCapacities: [optional] Ein Array von Kapazitätstypen, für die die LIFO-Regel (Last In, First Out) gilt. Beispiel: "lifoConstrainedCapacities": ['wheelchair', 'scooter']
Beispiel:
"configuration":
{
"polylineType": "plain",
"unassignedTasks": False,
"statistics": True,
}
Version: [ optional]: Gibt die Version der API an. Der Standardwert ist 1.0.
Um verschiedene Beispiele für ein
Problem und erfahren Sie, wie Sie die API in verschiedenen Anwendungsfällen (z. B. bei der Neuoptimierung) nutzen können, siehe Anleitungen.Hinweis:
1. Eindeutige Kennungen
-
- Alle Aufträge müssen über eindeutige IDs verfügen.
- Alle Aufgaben müssen über eindeutige IDs verfügen.
- Alle Fahrzeuge müssen über eine eindeutige Kennung verfügen.
- Ein Auftrag kann dieselbe ID wie eine Aufgabe oder ein Fahrzeug haben – das ist zulässig.
2. Zeitliche Einschränkungen
Jede Aufgabe kann mehrere zeitbezogene Elemente enthalten, wie beispielsweise Zeitfenster für die Erledigung von Aufgaben und Fahrzeugschichten.
Die API ermittelt die Mindestzeit über alle Werte hinweg. Wenn das Minimum beispielsweise lautet:
2024-09-18T04:32:00-08:00Der Höchstwert wird wie folgt berechnet:
- Ermittlung der Mitternachtszeit an dem Tag, an dem das Minimum auftritt.
- Zu diesem Zeitstempel werden 33 Stunden addiert.
In diesem Beispiel beträgt die maximal zulässige Zeit also:
2024-09-19T09:00:00-08:00Wenn eine beliebige Zeitspanne innerhalb des Problems (z. B. Fahrzeugschicht oder Aufgabenfenster) diesen Wert überschreitet, gibt die API einen 400 Fehler.
Lösung Nr.
Wie im Abschnitt „Erste Schritte“ erläutert, erhalten Sie eine eindeutige Referenz-ID, sobald Sie ein Problem über die POST-Methode übermitteln. Mit dieser Referenz-ID können Sie über die GET-Methode den Status des übermittelten Problems abrufen. Sobald die Optimierungslösung vorliegt, können Sie darauf zugreifen in der "solution" Entität der empfangenen Antwort. Wie in der folgenden Abbildung dargestellt, ist die "solution" Die Einheit besteht aus drei Hauptteilen:
"statistics": Es umfasst verschiedene Statistiken (Kennzahlen), die einen Überblick über die gesamte Lösung über alle Routen hinweg bieten und es Ihnen ermöglichen, deren Wirksamkeit zu bewerten. Zu diesen Kennzahlen gehört beispielsweise die Gesamtfahrstrecke aller optimierten Routen. Durch die Analyse dieser Statistiken können Sie die Qualität und Effizienz der erarbeiteten Lösung messen. Diese Erkenntnisse helfen dabei, die Leistung und die Auswirkungen des Optimierungsprozesses zu verstehen.
"routes": Es enthält die optimierten Routen samt ihren Haltestellen und der voraussichtlichen Ankunftszeit (ETA). Außerdem kann es die Polylinie jeder Route enthalten.
"unassigned": Sie enthält die Liste der nicht zugewiesenen Aufgaben. Wenn die API eine Aufgabe während des Optimierungsprozesses keiner Route zuweisen kann, wird sie als nicht zugewiesen aufgeführt. Darüber hinaus können Gründe dafür angegeben werden, warum die jeweilige Aufgabe nicht zugewiesen wurde, was Aufschluss über mögliche Einschränkungen oder Probleme gibt, die einer Zuweisung im Wege standen.

Schema der Ausgabelösung: #
Die Vorlage für die Lösung des Optimierungsproblems, die in der Antwort der API bereitgestellt wird, sieht wie folgt aus:
"solution": {
"statistics": {},
"routes": []
"unassigned": [],
}
Die "solution" Die Entität stellt die Lösung des Routenoptimierungsproblems dar und umfasst die folgenden Attribute:
Statistik: Sie enthält die Statistiken der gesamten Lösung und besteht aus den folgenden Eigenschaften:
„Entfernung“:
„totalDistance“: Die Gesamtstrecke, die von der gesamten Flotte zurückgelegt wurde. Diese Messgröße umfasst die Strecke vom Startort jedes Fahrzeugs bis zu seinem Zielort.
„revenueDistance“: Die gesamte von der gesamten Flotte zurückgelegte Umsatzstrecke. Diese Kennzahl umfasst die Strecke vom ersten bis zum letzten Halt für jedes Fahrzeug. Nicht enthalten sind die Strecke vom Startort des Fahrzeugs zum ersten Halt sowie die Strecke vom letzten Halt zum Endort des Fahrzeugs.
„Fahrzeuge“:
„Eingesetzt“: Die Anzahl der Fahrzeuge, die im Rahmen der Lösung zur Ausführung der geplanten Aufträge/Aufgaben eingesetzt werden.
„unbenutzt“: Die Anzahl der unbenutzten Fahrzeuge
„Stellenangebote“:
„scheduledTasks“: Die Anzahl der geplanten Aufgaben
„unassignedTasks“: Die Anzahl der nicht zugewiesenen Aufgaben
„Zeiten“:
„totalHours“: die Gesamtfahrzeit der gesamten Flotte. Diese Kennzahl umfasst die Zeit, die jedes Fahrzeug für die Fahrt vom Startort zum Zielort benötigt.
„revenueHours“:Die Gesamtzahl der Fahrstunden, die von der gesamten Flotte zurückgelegt wurden. Diese Kennzahl umfasst die Zeit vom ersten bis zum letzten Halt für jedes Fahrzeug. Nicht enthalten ist die Zeit, die für die Fahrt vom Startort des Fahrzeugs zum ersten Halt oder vom letzten Halt zum Endort des Fahrzeugs benötigt wird.
Beispiel:
"statistics": {
"distance": {
"totalDistance": 42,
"revenueDistance": 25
},
"vehicles": {
"used": 2,
"unused": 0
},
"jobs": {
"scheduledTasks": 3,
"unassignedTasks": 0
},
"times": {
"totalHours": 11.6,
"revenueHours": 10.8
}
}
Routen: Es liefert ein Array mit den geplanten Routen für jedes Fahrzeug. Jede geplante Route enthält die folgenden Daten:
„vehicleId“: eine Ganzzahl, die die ID des zugewiesenen Fahrzeugs angibt
„Schichten“: ein Array von Schicht-Objekten. Beachten Sie, dass die API mehrere Schichten pro Fahrzeug unterstützt. Jedes Schicht-Objekt besteht aus den folgenden Elementen:
„index“: der Index der Verschiebung (Ganzzahl)
„Haltestellen“: Hier wird ein Array aller Haltestellen bereitgestellt, die das Fahrzeug in dieser Schicht anfahren soll. Jede Haltestelle weist die folgenden Eigenschaften auf:
„ordinal“: Die Position der Haltestelle im Fahrplan, dargestellt durch ihren Index (Ganzzahl).
„jobId“: Die Job-ID, die zu diesem Stopp gehört (Ganzzahl)
„taskId“: Die Aufgaben-ID für diesen Stopp (Ganzzahl)
„type“: Der Typ (Zeichenkette) der Aufgabe, die an dieser Haltestelle ausgeführt werden muss („Abholung“ oder „Zustellung“)
„Standort“: Die Geokoordinaten des Standorts der Haltestelle
„eta“: Die voraussichtliche Ankunftszeit (ETA) für den Halt (in derselben Zeitzone wie die eingegebene Nutzlast)
„timeToNext“: Diesist die Fahrzeit bis zur nächsten Haltestelle. Wenn Sie beispielsweise um 9:00 Uhr einen Fahrgast absetzen und Ihr nächster Auftrag um 10:00 Uhr ist, gibt diese Angabe an, dass die Fahrzeit von der aktuellen Haltestelle zur nächsten Haltestelle 20 Minuten beträgt.
„distanceToNext“: Dies ist die Fahrstrecke bis zur nächsten Haltestelle. Je nach den in der „Konfiguration“ gewählten Einheiten kann dies Meilen oder Meter sein.
„waitTime“: Die Wartezeit gibt an, wie lange der Fahrer an der nächsten Haltestelle warten sollte, wenn er jetzt losfährt.
„polyline“:Die Polylinie, die die Haltestelle mit der vorhergehenden Haltestelle verbindet. Wenn in der „Konfiguration“ eine „einfache“ Polylinie angegeben ist, handelt es sich bei der Polylinie um eine geordnete Liste der Schnittpunkte, die zwischen der vorhergehenden und der aktuellen Haltestelle durchlaufen werden müssen. Wenn in der „Konfiguration“ eine „codierte“ Polylinie angegeben ist, wird die einfache Polylinie codiert und als codierte Zeichenkette zurückgegeben.
„break“: Wenn es sich bei dem geplanten Stopp um eine Pause handelt, gibt dieses Element die ID der Pause an. Andere Stopps enthalten dieses Element nicht. Die API schreibt nicht vor, dass die Pausen (oder Aufträge) in chronologischer Reihenfolge aufgelistet werden müssen.
Beispiel:
"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
}
]
}
]
}
]
Nicht zugewiesen: Die optionale Liste der nicht zugewiesenen Aufgaben enthält Aufgaben, die aufgrund bestimmter Einschränkungen nicht zugewiesen werden können. Jeder Eintrag besteht aus einer Auftrags-ID, einer Aufgaben-ID und möglichen Gründen für die Nichtzuweisung (ein Code sowie eine Beschreibung):
„id“:
„job“: die Job-ID (Ganzzahl) der noch nicht zugewiesenen Aufgabe
„Aufgabe“: die ID (Ganzzahl) der noch nicht zugewiesenen Aufgabe
„Grund“: ein Array mit möglichen Gründen für die noch nicht zugewiesenen Aufgaben
„code“: der Code (Ganzzahl) des möglichen Grundes
„description“: die Beschreibung (Zeichenkette) des möglichen Grundes
{
"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"
}
]
}
]
}
Glossar #
|
|---|
Anleitungen #
Auf dieser Seite finden Sie verschiedene Beispiele, die veranschaulichen, wie die API in verschiedenen Szenarien eingesetzt werden kann. Die API unterstützt im Wesentlichen zwei Hauptanwendungsfälle:
-
Planung und Terminierung: Erstellt einen optimierten Fahrplan für die Touren einer Flotte unter Berücksichtigung der auftrags- und fahrzeugspezifischen Einschränkungen.
-
Neuoptimierung: Passt einen bestehenden oder laufenden Fahrplan an, um Änderungen wie neue Aufträge oder Stornierungen sowie Fahrzeugausfälle zu berücksichtigen.
Sehen Sie sich die bereitgestellten Beispiele an, um zu erfahren, wie diese Anwendungsfälle umgesetzt werden:
Beispiel 1: Planung eines einfachen Abhol- und Zustellungsszenarios
Beispiel 2: Ein einfaches Szenario zur Neuoptimierung, bei dem neue Aufträge zu einem bestehenden Zeitplan hinzugefügt werden
Beispiel 3: Neuoptimierung mit stornierten Aufträgen
Beispiel 4: Neuoptimierung bei defekten Fahrzeugen
Die in den folgenden Beispielen genannten Orte sind fiktiv und zufällig generiert und entsprechen keinen realen Orten.
Beispiel 1: Planung eines einfachen Abhol- und Zustellungsszenarios #
In diesem Beispiel besteht unsere Flotte aus zwei Fahrzeugen, und wir haben drei Abhol- und Lieferaufträge, die von diesen beiden Fahrzeugen erledigt werden müssen. Hier sind die Details zu den einzelnen Fahrzeugen:
Fahrzeug 1:
Schichtdetails: Die Schicht beginnt am 01.10.2024 um 8:00 Uhr PST am Standort (50.67293, -120.34195) und endet um 18:00 Uhr am selben Standort. Beachten Sie, dass die Zeitzone PST ist, sodass die Startzeit wie folgt erfasst wird: 2024-10-01T08:00:00-08:00, und die Endzeit wird 2024-10-01T18:00:00-08:00.
Pausen: Das Fahrzeug hat zwei Pausen, die jeweils 15 Minuten dauern:
Erste Pause: Zwischen 10:00 Uhr und 10:30 Uhr am Standort (50.6531, -120.38393).
Zweite Pause: Zwischen 14:00 Uhr und 14:30 Uhr am Standort (50.6531, -120.38393).
Kapazität: 15 Sitzplätze und 5 Gepäckplätze.
Ausstattung: Mit Aufzug und Klimaanlage ausgestattet.
Fahrzeug 2:
Schichtdetails: Die Schicht beginnt am 01.10.2024 um 8:00 Uhr PST am Standort (50.7117, -120.39286) und endet um 18:00 Uhr am Standort (50.67698, -120.32012).
Pausen: Das Fahrzeug hat eine 15-minütige Pause:
Pause: Zwischen 11:00 Uhr und 11:30 Uhr am Standort (50.6531, -120.38393).
Kapazität: 10 Sitzplätze und 8 Gepäckstücke.
Ausstattung: Nur mit Aufzug.
Außerdem haben wir drei „Abhol- und Lieferaufträge“ in Kamloops, British Columbia, Kanada. Hier sind die Einzelheiten zu den einzelnen Aufträgen:
Aufgabe 1:
Abholort: Standort (50.65391, -120.37365)
Zeitfenster: 9:00 bis 9:30 Uhr (der Auftrag ist an die Abholung gebunden; die Abholung muss innerhalb dieses Zeitfensters erfolgen)
Dauer: 10 Minuten
Anforderungen: 1 Sitzplatz, 2 Ladegut, Fahrzeug mit Hebebühne
Lieferort: (50.69409, -120.35425)
Dauer: 5 Minuten
Hiob 2:
Abholort: Standort (50.70816, -120.37796)
Dauer: 5 Minuten
Voraussetzungen: 1 Sitzplatz, Fahrzeug mit Hebebühne und Klimaanlage
Lieferort: (50.66559, -120.36924)
Zeitfenster: 12:45 Uhr bis 13:30 Uhr (der Auftrag ist an die Lieferung gebunden, und die Lieferung muss innerhalb dieses Zeitfensters erfolgen)
Dauer: 5 Minuten
Hiob 3:
Abholort: Standort (50.70393, -120.37263)
Zeitfenster: 14:00 bis 14:30 Uhr (der Auftrag ist an die Abholung gebunden; die Abholung muss innerhalb dieses Zeitfensters erfolgen)
Dauer: 10 Minuten
Anforderungen: 1 Sitzplatz, 3 Ladegut, keine spezielle Ausrüstung erforderlich
Lieferort: (50.69028, -120.39028)
Dauer: 5 Minuten
Unser Ziel ist es, diese Aufträge den definierten Fahrzeugen so zuzuweisen, dass die Gesamtfahrzeit minimiert wird. Mit anderen Worten: Unser Optimierungsziel ist gleich 1. Nun formulieren wir unser Ausgangsproblem wie folgt:
Eingabe (Nutzlast):
{
"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
}
}
}
Nachdem wir dieses Problem mithilfe der POST-Methode übermittelt haben (wie im Abschnitt „Erste Schritte“ beschrieben), erhalten wir mithilfe der GET-Methode die folgende Lösung:
Ausgabe:
{
"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"
}
Beispiel 2: Ein einfaches Szenario zur Neuoptimierung, bei dem neue Aufträge zu einem bestehenden Zeitplan hinzugefügt werden #
Betrachten wir nun das vorherige Beispiel. Nehmen wir an, Sie haben seit dem Morgen mit der Ausführung des erstellten Zeitplans begonnen, und es ist jetzt 11:36:34 Uhr, und Sie erhalten folgenden neuen Arbeitsauftrag:
Job 4: ( ein neuer Job)
Abholort: Standort (50.65187, -120.40052)
Zeitfenster: 15:45 bis 16:15 Uhr (es handelt sich um einen Auftrag mit Abholung)
Dauer: 15 Minuten
Anforderungen: 1 Sitzplatz, 1 Frachtstück
Lieferort: (50.69262, -120.35412)
Dauer: 10 Minuten
Übrigens: Auftrag 1 haben Sie bereits ausgeführt, aber Auftrag 2 und Auftrag 3 sind noch in Bearbeitung. Hier die Details:
Aufgabe 1: (erledigt)
Auftrag 2: (in Bearbeitung)
Abholung:
Aktuelle Fahrzeug-ID: 1
Voraussichtliche Ankunftszeit: 10 :30 Uhr
Lieferung:
Aktuelle Fahrzeug-ID: 1
Voraussichtliche Ankunftszeit: 12:45 Uhr
Hiob 3: (in Arbeit)
Abholung:
Aktuelle Fahrzeug-ID: 2
Voraussichtliche Ankunftszeit: 14 :00 Uhr
Lieferung:
Aktuelle Fahrzeug-ID: 2
Voraussichtliche Ankunftszeit: 14:29 Uhr
Beachten Sie, dass die Aufträge 2 und 3 derzeit in Bearbeitung sind und daher über eine zugehörige Fahrzeug-ID und eine voraussichtliche Ankunftszeit verfügen. Um Ihren Zeitplan neu zu optimieren und den neuen Auftrag (d. h. Auftrag 4) einzubeziehen, müssen Sie über die API eine aktualisierte Ansicht Ihres aktuellen Zeitplans bereitstellen. Diese sollte folgende Angaben zu Ihren Aufträgen enthalten:
Aufgabe 1: Da dieser Auftrag bereits ausgeführt wurde, können Sie den Status der Abhol- und Lieferaufgaben für diesen Auftrag auf "status":"performed" . Beachten Sie, dass Sie für diese Aufgaben die aktuelle Fahrzeug-ID und die voraussichtliche Ankunftszeit nicht angeben müssen, da diese bereits erfasst wurden und nicht mehr geändert werden können.
Auftrag 2: Dieser Auftrag ist noch in Bearbeitung und wurde Fahrzeug 2 zugewiesen, mit einer voraussichtlichen Abholzeit um 10:30 Uhr und einer voraussichtlichen Lieferzeit um 12:45 Uhr. Daher musst du für die Abholaufgabe das folgende Objekt hinzufügen:
"status": "in_progress",
"vehicleId": 1,
"eta": "2024-10-01T10:30:00-08:00"
Außerdem müssen Sie das folgende Objekt für dessen Lieferauftrag hinzufügen:
"status": "in_progress",
"vehicleId": 1,
"eta": "2024-10-01T12:45:00-08:00"
"status": "in_progress",
"vehicleId": 2,
"eta": "2024-10-01T14:00:00-08:00"
Außerdem müssen Sie das folgende Objekt für dessen Lieferauftrag hinzufügen:
"status": "in_progress",
"vehicleId": 2,
"eta": "2024-10-01T14:29:00-08:00"
Hiob 4: Da es sich um einen neuen Auftrag handelt, der noch nicht eingeplant ist, setzen Sie einfach seinen Status auf "status":"pending". Sie müssen für diesen Auftrag keine Fahrzeug-ID oder Ankunftszeit angeben, da er noch nicht geplant ist und Ihnen diese Informationen noch nicht vorliegen. Nach der Neuoptimierung erhalten Sie für jede Aufgabe dieses Auftrags eine Fahrzeug-ID und eine Ankunftszeit.
Außerdem müssen Sie den letzten bekannten Standort Ihrer Fahrzeuge angeben, damit die API einen aktuellen Überblick über Ihren aktuellen Fahrplan erhält und die Optimierung effizient durchführen kann. Angenommen, der letzte bekannte Standort Ihrer Fahrzeuge zum Zeitpunkt 11:36:34 (d. h. dem Zeitpunkt, zu dem wir die Neuoptimierung durchführen möchten) lautet wie folgt:
- Fahrzeug 1: ( 50,66692; -120,35293)
- Fahrzeug 2: ( 50,65324; -120,37398)
Zu diesem Zweck müssen Sie für Fahrzeug 1 das folgende Objekt einbinden:
"lastKnownLocation":{
"location":[50.66692,-120.35293],
"time":"2024-10-01T11:36:34-08:00"
}
Ebenso müssen Sie das folgende Objekt für Fahrzeug 2 einfügen:
"lastKnownLocation":{
"location":[50.65324,-120.37398],
"time":"2024-10-01T11:36:34-08:00"
}
Um eine erneute Optimierung durchzuführen, können Sie Ihr neues Optimierungsproblem nun wie folgt einreichen:
{
"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
}
}
}
Beispiel 3: Neuoptimierung mit stornierten Aufträgen #
Wenn Sie ein Optimierungsproblem für eine Reihe von Aufträgen eingereicht haben und bereits über einen Zeitplan verfügen, einige Aufträge jedoch storniert wurden, können Sie Ihren Zeitplan neu optimieren, indem Sie die stornierten Aufträge aus dem Problem entfernen. Dazu müssen Sie Folgendes tun:
- Geben Sie einen aktuellen Überblick über Ihre verbleibenden Aufträge und die letzten bekannten Standorte Ihrer Fahrzeuge, ähnlich wie in Beispiel 2.
- Erstellen Sie eine überarbeitete Aufgabenstellung, die diese Änderungen berücksichtigt, und reichen Sie sie ein.
Nach dem Absenden erhalten Sie einen neuen Zeitplan, der die aktualisierten Aufträge und den aktuellen Flottenstatus berücksichtigt.
Beispiel 4: Neuoptimierung mit defekten Fahrzeugen #
Angenommen, es ist 8:00 Uhr morgens und Sie nutzen die API, um einen optimierten Fahrplan für Ihre Aufträge mit 10 Fahrzeugen zu erstellen. Sie beginnen mit der Ausführung des Fahrplans, doch um 9:14 Uhr erfahren Sie, dass eines Ihrer Fahrzeuge eine Panne hat und die ihm zugewiesenen Aufträge nicht mehr ausführen kann.
Um den Zeitplan neu zu optimieren, gehen Sie wie folgt vor:
-
Flotteninformationen aktualisieren: Entferne das defekte Fahrzeug aus deinem Flottenobjekt.
-
Fahrzeugstandorte angeben: Geben Sie die letzten bekannten Standorte der verbleibenden Fahrzeuge an, ähnlich wie in Beispiel 2.
-
Aufgabenstatus aktualisieren:
-
Geben Sie den Status aller Aufgaben an. Sie müssen angeben, welche Aufgaben bereits erledigt sind, welche gerade bearbeitet werden und welche neu oder noch ausstehend (noch nicht geplant) sind.
-
Geben Sie bei laufenden Aufträgen die zugehörige Fahrzeug-ID und die voraussichtliche Ankunftszeit (ETA) an.
-
-
Maßnahmen bei einer Fahrzeugpanne:
-
Ändern Sie den Status aller Aufgaben, die zuvor dem defekten Fahrzeug zugewiesen waren, auf „ausstehend“. Dadurch kann die API diese Aufgaben anderen verfügbaren Fahrzeugen zuweisen und deren voraussichtliche Ankunftszeiten neu berechnen.
-
-
Zur erneuten Optimierung übermitteln: Übermitteln Sie das aktualisierte Problem an die API, um eine neue Terminoptimierung durchzuführen.
Wie testet man geplante Routen? #
Schritt 1: Erstellen Sie einen Zugriffstoken
Senden Sie zunächst eine POST-Anfrage an die folgende URL, um mit den folgenden Anmeldedaten einen Zugriffstoken für Vancouver (Mandant 2) abzurufen:
Beitrags-URL: https://iq.aiqwhite.ddsdeploytest.com/sso/auth-token
POST-Anfrage – Hauptteil für Vancouver (Mieter 2):
{
"plugin": "internal;basic",
"internal": {
"email": "tenant2@ddswireless.com",
"password": "AdM5I0N09ToS$IlJ",
"tenantId": 2
},
"basic": {
"username": "tenant2@ddswireless.com",
"password": "AdM5I0N09ToS$IlJ",
"tenantId": 2
}
}
POST-Anfrage – Body für Finnland (Tenant3):
{
"plugin": "internal;basic",
"internal": {
"email": "tenant3@ddswireless.com",
"password": "AdM5I0N09ToS$IlJ",
"tenantId": 3
},
"basic": {
"username": "tenant3@ddswireless.com",
"password": "AdM5I0N09ToS$IlJ",
"tenantId": 3
}
}
Kopieren Sie anschließend das generierte Token. Hier ist ein Screenshot dieses Schritts:

Schritt 2: Senden Sie eine Eingabedatenlast (Optimierungsproblem) an die API
Um eine Eingabedatenlast an die API zu senden und eine Referenz-ID zu erhalten, fügen Sie das generierte Token in den Abschnitt „Authorization“ der folgenden POST-Anfrage ein und die Eingabedatenlast in den Abschnitt „Body“ der Anfrage:
Beitrags-URL: https://iq.aiqwhite.ddsdeploytest.com/raas/optimization
Ein Beispiel für eine Eingabe-Nutzlast:
{
"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
}
}
}
Wenn die POST-Methode erfolgreich ist, erhalten Sie eine Referenz-ID, mit der Sie die Antwort des API-Aufrufs über die GET-Methode abrufen können. Unten sehen Sie einen Screenshot dieses Schritts:

Schritt 3: Rufen Sie die Antwort des API-Aufrufs ab
Um die Antwort auf den API-Aufruf unter Verwendung der erhaltenen Referenz-ID abzurufen, fügen Sie das Zugriffstoken in den Abschnitt „Authorization“ der folgenden GET-Anfrage ein und nehmen Sie die Referenz-ID wie folgt in die URL auf:
GET URL: https://iq.aiqwhite.ddsdeploytest.com/raas/optimization/{ID}
Hier ist ein Screenshot dieses Schritts:

API-Fehler #
Wie im Abschnitt „Erste Schritte“ beschrieben, unterstützt die API sowohl die POST- als auch die GET-Methode. Je nach Methode gibt sie in der Antwort einen Statuscode zurück. Hier finden Sie eine Beschreibung der verschiedenen Statuscodes für diese beiden Methoden.
POST-Statuscodes #
|
|---|
GET-Statuscodes #
|
|---|
FAQ Nr.
|