googlemaps-samples / js-route-optimization-app Goto Github PK
View Code? Open in Web Editor NEWSolve vehicle routing problems with Google Optimization AI Cloud Fleet Routing
Home Page: https://cloud.google.com/optimization/
License: Other
Solve vehicle routing problems with Google Optimization AI Cloud Fleet Routing
Home Page: https://cloud.google.com/optimization/
License: Other
follow the Local Environment Setup step by step
after Local Development
open http://localhost:8080/ in browser
Upload sample-scenario.json
Select all shipments and all Vehicles
Click Generate
it not show solution but a error message: 4 DEADLINE_EXCEEDED: Deadline exceeded
and console log
fleetrouting-app-backend: [1] [1680403288300] DEBUG (5076 on PC-home): FleetRoutingService.optimizeTours: begin request
fleetrouting-app-backend: [1] [1680403310014] ERROR (5076 on PC-home): 4 DEADLINE_EXCEEDED: Deadline exceeded
fleetrouting-app-backend: [1] err: {
fleetrouting-app-backend: [1] "type": "Error",
fleetrouting-app-backend: [1] "message": "4 DEADLINE_EXCEEDED: Deadline exceeded",
fleetrouting-app-backend: [1] "stack":
fleetrouting-app-backend: [1] Error: 4 DEADLINE_EXCEEDED: Deadline exceeded
fleetrouting-app-backend: [1] at Object.callErrorFromStatus (D:\code\cfr-4.4.1\application\backend\node_modules\@grpc\grpc-js\build\src\call.js:31:19)
fleetrouting-app-backend: [1] at Object.onReceiveStatus (D:\code\cfr-4.4.1\application\backend\node_modules\@grpc\grpc-js\build\src\client.js:195:52)
fleetrouting-app-backend: [1] at Object.onReceiveStatus (D:\code\cfr-4.4.1\application\backend\node_modules\@grpc\grpc-js\build\src\client-interceptors.js:365:141)
fleetrouting-app-backend: [1] at Object.onReceiveStatus (D:\code\cfr-4.4.1\application\backend\node_modules\@grpc\grpc-js\build\src\client-interceptors.js:328:181)
fleetrouting-app-backend: [1] at D:\code\cfr-4.4.1\application\backend\node_modules\@grpc\grpc-js\build\src\call-stream.js:188:78
fleetrouting-app-backend: [1] at process.processTicksAndRejections (node:internal/process/task_queues:77:11)
fleetrouting-app-backend: [1] for call at
fleetrouting-app-backend: [1] at ServiceClientImpl.makeUnaryRequest (D:\code\cfr-4.4.1\application\backend\node_modules\@grpc\grpc-js\build\src\client.js:163:34)
fleetrouting-app-backend: [1] at ServiceClientImpl.<anonymous> (D:\code\cfr-4.4.1\application\backend\node_modules\@grpc\grpc-js\build\src\make-client.js:105:19)
fleetrouting-app-backend: [1] at D:\code\cfr-4.4.1\application\backend\lib\optimization-api\build\src\v1\fleet_routing_client.js:223:29
fleetrouting-app-backend: [1] at D:\code\cfr-4.4.1\application\backend\node_modules\google-gax\build\src\normalCalls\timeout.js:44:16
fleetrouting-app-backend: [1] at repeat (D:\code\cfr-4.4.1\application\backend\node_modules\google-gax\build\src\normalCalls\retries.js:80:25)
fleetrouting-app-backend: [1] at Timeout._onTimeout (D:\code\cfr-4.4.1\application\backend\node_modules\google-gax\build\src\normalCalls\retries.js:101:25)
fleetrouting-app-backend: [1] at listOnTimeout (node:internal/timers:569:17)
fleetrouting-app-backend: [1] at process.processTimers (node:internal/timers:512:7)
fleetrouting-app-backend: [1] "code": 4,
fleetrouting-app-backend: [1] "details": "Deadline exceeded",
fleetrouting-app-backend: [1] "metadata": {},
fleetrouting-app-backend: [1] "note": "Exception occurred in retry method that was not classified as transient"
fleetrouting-app-backend: [1] }
fleetrouting-app-backend: [1] [1680403310014] INFO (5076 on PC-home): request errored
fleetrouting-app-backend: [1] req: {
fleetrouting-app-backend: [1] "id": 42,
fleetrouting-app-backend: [1] "method": "POST",
fleetrouting-app-backend: [1] "url": "/api/optimization/fleet-routing/optimize-tours",
fleetrouting-app-backend: [1] "query": {},
fleetrouting-app-backend: [1] "params": {},
fleetrouting-app-backend: [1] "headers": {
fleetrouting-app-backend: [1] "host": "localhost:8080",
fleetrouting-app-backend: [1] "connection": "keep-alive",
fleetrouting-app-backend: [1] "content-length": "2496",
fleetrouting-app-backend: [1] "sec-ch-ua": "\"Google Chrome\";v=\"111\", \"Not(A:Brand\";v=\"8\", \"Chromium\";v=\"111\"",
fleetrouting-app-backend: [1] "accept": "application/json, text/plain, */*",
fleetrouting-app-backend: [1] "content-type": "application/json",
fleetrouting-app-backend: [1] "dnt": "1",
fleetrouting-app-backend: [1] "sec-ch-ua-mobile": "?0",
fleetrouting-app-backend: [1] "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36",
fleetrouting-app-backend: [1] "sec-ch-ua-platform": "\"Windows\"",
fleetrouting-app-backend: [1] "origin": "http://127.0.0.1:8080",
fleetrouting-app-backend: [1] "sec-fetch-site": "cross-site",
fleetrouting-app-backend: [1] "sec-fetch-mode": "cors",
fleetrouting-app-backend: [1] "sec-fetch-dest": "empty",
fleetrouting-app-backend: [1] "referer": "http://127.0.0.1:8080/",
fleetrouting-app-backend: [1] "accept-encoding": "gzip, deflate, br",
fleetrouting-app-backend: [1] "accept-language": "en-US,en;q=0.9"
fleetrouting-app-backend: [1] },
fleetrouting-app-backend: [1] "remoteAddress": "::1",
fleetrouting-app-backend: [1] "remotePort": 61184
fleetrouting-app-backend: [1] }
fleetrouting-app-backend: [1] res: {
fleetrouting-app-backend: [1] "statusCode": 500,
fleetrouting-app-backend: [1] "headers": {
fleetrouting-app-backend: [1] "access-control-allow-origin": "*",
fleetrouting-app-backend: [1] "content-type": "text/html; charset=utf-8",
fleetrouting-app-backend: [1] "content-length": "38",
fleetrouting-app-backend: [1] "etag": "W/\"26-tbLX3IrCviffpIQ9DBgTOEg/VrE\""
fleetrouting-app-backend: [1] }
fleetrouting-app-backend: [1] }
fleetrouting-app-backend: [1] responseTime: 21723
fleetrouting-app-backend: [1] err: {
fleetrouting-app-backend: [1] "type": "Error",
fleetrouting-app-backend: [1] "message": "failed with status code 500",
fleetrouting-app-backend: [1] "stack":
fleetrouting-app-backend: [1] Error: failed with status code 500
fleetrouting-app-backend: [1] at ServerResponse.onResFinished (D:\code\cfr-4.4.1\application\backend\node_modules\pino-http\logger.js:107:40)
fleetrouting-app-backend: [1] at ServerResponse.emit (node:events:525:35)
fleetrouting-app-backend: [1] at onFinish (node:_http_outgoing:989:10)
fleetrouting-app-backend: [1] at callback (node:internal/streams/writable:555:21)
fleetrouting-app-backend: [1] at afterWrite (node:internal/streams/writable:500:5)
fleetrouting-app-backend: [1] at afterWriteTick (node:internal/streams/writable:487:10)
fleetrouting-app-backend: [1] at process.processTicksAndRejections (node:internal/process/task_queues:81:21)
fleetrouting-app-backend: [1] }
did anyone know why?
.env environment variable fille have been Create
Bulk editing break requests or frequency constraints will overwrite both fields, setting the edited one to the new value and clearing the property that wasn't edited.
Offer support for miles (and any other imperial units, if necessary) in the app.
This could go in the app configuration itself so it automatically loads with the desired settings. Any place in the application that shows units of measurement would then need to conditionally render the converted units and use appropriate labels.
Known to affect CSV and PDF exports, but may impact other parts of the application due to how it's calculated. The "Time to next stop" column in CSV and PDF exports can drop any differences in days, showing only the hourly difference as it would appear if both stops appeared within the same 24 hour time period. Example:
Stop 1: Visit end at Tue, 28 Feb 2023 16:30:00 GMT
Stop 2: Visit start at Fri, 31 Mar 2023 07:00:00 GMT
Time to next stop: 14:30:00
This is the correct time difference from 16:30:00 to 07:00:00, but not the actual total time difference.
CFR may be used to for purposes other than delivering shipments, such as optimizing routes for carrying passengers. The ability to rename a "Shipment" to something like "Ride" or "Passenger" in the UI would allows users of these other use cases to use clearer and more appropriate terminology.
Updating the application deployment to store a shipment name configuration would allow renaming "Shipment" to any desired value and would persist for all users.
Is there a cloud fleet grouting client for dart to use Optimization API.
We want to use Optimization API for a flutter app. After going through documentation it's not clear how to do it.
Is there some client similar to Java and Python client for this API?
Client Docs
Changes aren't kept when trying to remove all break requests or all frequency constraints from a vehicle. At least one entry for either is always kept when trying to remove all of them.
When editing shipment type requirements, changes are not consistently saved to the data store. This seems to only occur the first time a field is changed after opening the Scenario Settings menu. Subsequent changes to a field (while the window is still open) are saved correctly.
This is caused by the shouldUpdateState
function returning false for the shipment requirements form control the first time values are updated due to the touched
property, one of the requirements for updating state, updating itself after the form updates have run.
Uploading a CSV in an invalid format may result in the application hanging on the "Preview CSVs" step and the console error: Cannot read properties of undefined (reading 'headerCell')
Uploading a scenario that contains an injected solution results in that injected solution more or less being discarded. The data is accepted into the app and maintained in the data store, but generating a solution does not take this injected solution into account and #45 (which may or may not be caused by this same issue) prevents the user from editing the relaxation constraints. This also results in a UI bug where the "iterate on solution" toggle will be on, but disabled.
Upload a scenario with an injected solution constraint, but without any constraint relaxations. Trying to add a relaxation through the UI and saving causes request-settings.reducer.ts
to throw an error at line 112.
On the Shipments planning view, the shipment type is one of the only columns that can't be filtered. This should be added to the list of available filters.
Cloud Run has a hard response body limit of 32MiB. If this limit is reached, the response is blocked and a 500 error is thrown. On the frontend, this can display as a "500 OK" error. Should investigate alternative ways of delivering large solutions or at least throwing a more helpful error to the frontend.
Hi,
I was trying to get this demo running on my local. I had two problems when you click on Upload from CSV:
1. The third bullet option "Vehicle Operators" doesn't show up on this example;
2. The .csv samples that you gave us for the shipments (shipmentsSample.csv) and vehicles (vehiclesSample.csv) give me an error on step 4 "Geocode and Validate" that says: Error validating file: Cannot read properties of null (reading 'error')
Inside the code there's no error that can explains what happening.
Is there anyone with the same problem?
Thanks in advanced.
Regards,
Gabriela
On the Solution page, when navigating away from the Metadata view and back, Metrics per route is always shown first. The app could remember whether you were last viewing Metrics per route or Metrics per shipment to make it easier to go back and forth between the Gantt and Metadata views when looking at a solution.
Attempting to add a start time window to an existing vehicle that has no start time windows throws an error.
Steps to reproduce:
ERROR TypeError: Cannot read properties of undefined (reading 'startTime')
Rather than only having the option to click through the solution day by day, let the user select the date to view using a date picker.
Attempting to export a PDF for a route with no shipments and no start or end location throws an unhelpful error to the user. Variations of the following can appear depending on the exact issue:
Error generating report
Li.path.map is not a function
Expectation:
Vehicle breaks do not count towards costs if they are before vehicle start or after vehicle end.
The schedule part of the interface still displays them in those cases, and also display wait time between the vehicle time window and the "outside" break.
Instead, there should be no waiting time displayed, and outside breaks should either no be displayed or displayed suggesting the break is not performed, for instance in grey.
When opening a saved solution, the assumption should be that the user wants to start in the solution view rather than the scenario planning view.
Create a vehicle and only set the max distance and max duration limits:
The tabular preview of the vehicle will show nothing for Route Distance Limit and partial information for Route Duration Limit, including a default of "00:00" for soft duration max.
Expectation is that fields that are set should be displayed regardless of the presence of unrelated fields and that data that is not set should be excluded from the tabular view.
Attempting to add a precedence rule to a fresh scenario throws the error TypeError: Cannot read properties of null (reading 'id')
and prevents the form from being edited.
When uploading a JSON or ZIP file, the validation error "File is required" appears the moment "Choose a file" is selected, before the user has selected any file. This error should only appear if the user cancels selecting a file and no file is already selected in the input field.
API Keys can now be managed with Terraform via API Keys API. This could eliminate the need to manually create an API Key during project setup.
Reference: https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/apikeys_key
apikeys.googleapis.com
)google_apikeys_key
resource
api_targets
to the following:
key_string
output value in the existing maps_api_key
secretAfter defining an google_apikeys_key
resource:
maps_api_key
input variable from Terraform and Deployment docHi,
I would like to know about how to create an Optimized Route with Cloud Fleet Routing based on Google's CFR GitHub (https://github.com/google/cfr). We already deployed it in our Cloud environment here.
My questions are,
Here is the scenario.json for the questions (https://drive.google.com/file/d/1jGgIAluA3lfYA2vRO7zr5huxAib1Qx93/view?usp=sharing)
Thank you,
Regards,
Yuda Adi
FRA is displaying breaks at the end of a route, after the vehicle is to have gone back to its depo. When I check the solution file no such break is scheduled.
Shown below is a route where a break is scheduled at the end but does not occur in transitions and is not reflected in breakDuration
.
{
"vehicleIndex": 0,
"vehicleLabel": "vehicle_1",
"vehicleStartTime": "2023-06-12T15:59:06.000Z",
"vehicleEndTime": "2023-06-13T00:43:32.000Z",
"visits": [
{
"shipmentIndex": 1106,
"isPickup": true,
"visitRequestIndex": 0,
"startTime": "2023-06-12T16:00:00.000Z",
"detour": "0s",
"visitLabel": "",
"delayBeforeStart": {
"startTime": "2023-06-12T15:59:06.000Z",
"duration": "54s"
},
"shipmentName": ""
},
{
"shipmentIndex": 1109,
"isPickup": true,
"visitRequestIndex": 0,
"startTime": "2023-06-12T16:07:43.000Z",
"detour": "114s",
"visitLabel": "",
"delayBeforeStart": {
"startTime": "2023-06-12T16:05:43.000Z",
"duration": "120s"
},
"shipmentName": ""
},
{
"shipmentIndex": 1110,
"isPickup": true,
"visitRequestIndex": 0,
"startTime": "2023-06-12T16:08:43.000Z",
"detour": "174s",
"visitLabel": "",
"shipmentName": ""
},
{
"shipmentIndex": 1111,
"isPickup": true,
"visitRequestIndex": 0,
"startTime": "2023-06-12T16:17:39.000Z",
"detour": "1059s",
"visitLabel": "",
"delayBeforeStart": {
"startTime": "2023-06-12T16:16:45.000Z",
"duration": "54s"
},
"shipmentName": ""
},
{
"shipmentIndex": 1107,
"isPickup": true,
"visitRequestIndex": 0,
"startTime": "2023-06-12T16:33:37.000Z",
"detour": "1173s",
"visitLabel": "",
"delayBeforeStart": {
"startTime": "2023-06-12T16:32:37.000Z",
"duration": "60s"
},
"shipmentName": ""
},
{
"shipmentIndex": 1106,
"isPickup": false,
"visitRequestIndex": 0,
"startTime": "2023-06-12T16:35:44.000Z",
"detour": "1179s",
"visitLabel": "",
"delayBeforeStart": {
"startTime": "2023-06-12T16:34:37.000Z",
"duration": "67s"
},
"shipmentName": ""
},
{
"shipmentIndex": 1110,
"isPickup": false,
"visitRequestIndex": 0,
"startTime": "2023-06-12T16:36:44.000Z",
"detour": "814s",
"visitLabel": "",
"shipmentName": ""
},
{
"shipmentIndex": 1111,
"isPickup": false,
"visitRequestIndex": 0,
"startTime": "2023-06-12T16:37:44.000Z",
"detour": "240s",
"visitLabel": "",
"shipmentName": ""
},
{
"shipmentIndex": 1107,
"isPickup": false,
"visitRequestIndex": 0,
"startTime": "2023-06-12T16:52:38.000Z",
"detour": "247s",
"visitLabel": "",
"delayBeforeStart": {
"startTime": "2023-06-12T16:51:44.000Z",
"duration": "54s"
},
"shipmentName": ""
},
{
"shipmentIndex": 1109,
"isPickup": false,
"visitRequestIndex": 0,
"startTime": "2023-06-12T16:53:38.000Z",
"detour": "2219s",
"visitLabel": "",
"shipmentName": ""
},
{
"shipmentIndex": 1113,
"isPickup": true,
"visitRequestIndex": 0,
"startTime": "2023-06-12T17:33:00.000Z",
"detour": "5016s",
"visitLabel": "",
"delayBeforeStart": {
"startTime": "2023-06-12T17:30:00.000Z",
"duration": "180s"
},
"shipmentName": ""
},
{
"shipmentIndex": 1108,
"isPickup": true,
"visitRequestIndex": 0,
"startTime": "2023-06-12T17:44:15.000Z",
"detour": "5862s",
"visitLabel": "",
"delayBeforeStart": {
"startTime": "2023-06-12T17:41:15.000Z",
"duration": "180s"
},
"shipmentName": ""
},
{
"shipmentIndex": 1112,
"isPickup": true,
"visitRequestIndex": 0,
"startTime": "2023-06-12T18:01:50.000Z",
"detour": "6530s",
"visitLabel": "",
"delayBeforeStart": {
"startTime": "2023-06-12T17:58:50.000Z",
"duration": "180s"
},
"shipmentName": ""
},
{
"shipmentIndex": 1113,
"isPickup": false,
"visitRequestIndex": 0,
"startTime": "2023-06-12T18:15:30.000Z",
"detour": "1929s",
"visitLabel": "",
"delayBeforeStart": {
"startTime": "2023-06-12T18:14:36.000Z",
"duration": "54s"
},
"shipmentName": ""
},
{
"shipmentIndex": 1108,
"isPickup": false,
"visitRequestIndex": 0,
"startTime": "2023-06-12T18:48:06.000Z",
"detour": "3390s",
"visitLabel": "",
"delayBeforeStart": {
"startTime": "2023-06-12T18:47:06.000Z",
"duration": "60s"
},
"shipmentName": ""
},
{
"shipmentIndex": 1112,
"isPickup": false,
"visitRequestIndex": 0,
"startTime": "2023-06-12T18:50:00.000Z",
"detour": "2070s",
"visitLabel": "",
"delayBeforeStart": {
"startTime": "2023-06-12T18:49:06.000Z",
"duration": "54s"
},
"shipmentName": ""
},
{
"shipmentIndex": 1114,
"isPickup": true,
"visitRequestIndex": 0,
"startTime": "2023-06-12T19:00:54.000Z",
"detour": "10854s",
"visitLabel": "",
"shipmentName": ""
},
{
"shipmentIndex": 1114,
"isPickup": false,
"visitRequestIndex": 0,
"startTime": "2023-06-12T19:16:59.000Z",
"detour": "0s",
"visitLabel": "",
"delayBeforeStart": {
"startTime": "2023-06-12T19:15:52.000Z",
"duration": "67s"
},
"shipmentName": ""
},
{
"shipmentIndex": 1115,
"isPickup": true,
"visitRequestIndex": 0,
"startTime": "2023-06-12T20:10:17.000Z",
"detour": "13338s",
"visitLabel": "",
"delayBeforeStart": {
"startTime": "2023-06-12T20:09:17.000Z",
"duration": "60s"
},
"shipmentName": ""
},
{
"shipmentIndex": 1139,
"isPickup": true,
"visitRequestIndex": 0,
"startTime": "2023-06-12T21:12:40.000Z",
"detour": "16301s",
"visitLabel": "",
"delayBeforeStart": {
"startTime": "2023-06-12T21:11:40.000Z",
"duration": "60s"
},
"shipmentName": ""
},
{
"shipmentIndex": 1140,
"isPickup": true,
"visitRequestIndex": 0,
"startTime": "2023-06-12T21:20:36.000Z",
"detour": "16887s",
"visitLabel": "",
"delayBeforeStart": {
"startTime": "2023-06-12T21:18:48.000Z",
"duration": "108s"
},
"shipmentName": ""
},
{
"shipmentIndex": 1141,
"isPickup": true,
"visitRequestIndex": 0,
"startTime": "2023-06-12T21:26:17.000Z",
"detour": "17342s",
"visitLabel": "",
"delayBeforeStart": {
"startTime": "2023-06-12T21:25:17.000Z",
"duration": "60s"
},
"shipmentName": ""
},
{
"shipmentIndex": 1120,
"isPickup": true,
"visitRequestIndex": 0,
"startTime": "2023-06-12T22:04:55.000Z",
"detour": "21375s",
"visitLabel": "",
"delayBeforeStart": {
"startTime": "2023-06-12T22:01:55.000Z",
"duration": "180s"
},
"shipmentName": ""
},
{
"shipmentIndex": 1117,
"isPickup": true,
"visitRequestIndex": 0,
"startTime": "2023-06-12T22:13:01.000Z",
"detour": "21994s",
"visitLabel": "",
"delayBeforeStart": {
"startTime": "2023-06-12T22:10:01.000Z",
"duration": "180s"
},
"shipmentName": ""
},
{
"shipmentIndex": 1118,
"isPickup": true,
"visitRequestIndex": 0,
"startTime": "2023-06-12T22:17:14.000Z",
"detour": "22354s",
"visitLabel": "",
"delayBeforeStart": {
"startTime": "2023-06-12T22:16:14.000Z",
"duration": "60s"
},
"shipmentName": ""
},
{
"shipmentIndex": 1129,
"isPickup": true,
"visitRequestIndex": 0,
"startTime": "2023-06-12T22:22:04.000Z",
"detour": "22575s",
"visitLabel": "",
"delayBeforeStart": {
"startTime": "2023-06-12T22:20:04.000Z",
"duration": "120s"
},
"shipmentName": ""
},
{
"shipmentIndex": 1119,
"isPickup": true,
"visitRequestIndex": 0,
"startTime": "2023-06-12T22:25:55.000Z",
"detour": "22955s",
"visitLabel": "",
"shipmentName": ""
},
{
"shipmentIndex": 1116,
"isPickup": true,
"visitRequestIndex": 0,
"startTime": "2023-06-12T22:31:06.000Z",
"detour": "23054s",
"visitLabel": "",
"delayBeforeStart": {
"startTime": "2023-06-12T22:28:06.000Z",
"duration": "180s"
},
"shipmentName": ""
},
{
"shipmentIndex": 1104,
"isPickup": true,
"visitRequestIndex": 0,
"startTime": "2023-06-12T22:48:00.000Z",
"detour": "23852s",
"visitLabel": "",
"delayBeforeStart": {
"startTime": "2023-06-12T22:45:00.000Z",
"duration": "180s"
},
"shipmentName": ""
},
{
"shipmentIndex": 1129,
"isPickup": false,
"visitRequestIndex": 0,
"startTime": "2023-06-12T23:01:05.000Z",
"detour": "1474s",
"visitLabel": "",
"delayBeforeStart": {
"startTime": "2023-06-12T22:59:58.000Z",
"duration": "67s"
},
"shipmentName": ""
},
{
"shipmentIndex": 1119,
"isPickup": false,
"visitRequestIndex": 0,
"startTime": "2023-06-12T23:15:59.000Z",
"detour": "2571s",
"visitLabel": "",
"delayBeforeStart": {
"startTime": "2023-06-12T23:15:05.000Z",
"duration": "54s"
},
"shipmentName": ""
},
{
"shipmentIndex": 1116,
"isPickup": false,
"visitRequestIndex": 0,
"startTime": "2023-06-12T23:16:59.000Z",
"detour": "2317s",
"visitLabel": "",
"shipmentName": ""
},
{
"shipmentIndex": 1104,
"isPickup": false,
"visitRequestIndex": 0,
"startTime": "2023-06-12T23:17:59.000Z",
"detour": "1293s",
"visitLabel": "",
"shipmentName": ""
},
{
"shipmentIndex": 1120,
"isPickup": false,
"visitRequestIndex": 0,
"startTime": "2023-06-12T23:18:59.000Z",
"detour": "3937s",
"visitLabel": "",
"shipmentName": ""
},
{
"shipmentIndex": 1117,
"isPickup": false,
"visitRequestIndex": 0,
"startTime": "2023-06-12T23:19:59.000Z",
"detour": "3584s",
"visitLabel": "",
"shipmentName": ""
},
{
"shipmentIndex": 1118,
"isPickup": false,
"visitRequestIndex": 0,
"startTime": "2023-06-12T23:29:54.000Z",
"detour": "3918s",
"visitLabel": "",
"shipmentName": ""
},
{
"shipmentIndex": 1145,
"isPickup": true,
"visitRequestIndex": 0,
"startTime": "2023-06-12T23:30:54.000Z",
"detour": "27054s",
"visitLabel": "",
"shipmentName": ""
},
{
"shipmentIndex": 1105,
"isPickup": true,
"visitRequestIndex": 0,
"startTime": "2023-06-12T23:45:48.000Z",
"detour": "27168s",
"visitLabel": "",
"delayBeforeStart": {
"startTime": "2023-06-12T23:42:48.000Z",
"duration": "180s"
},
"shipmentName": ""
},
{
"shipmentIndex": 1144,
"isPickup": true,
"visitRequestIndex": 0,
"startTime": "2023-06-12T23:52:47.000Z",
"detour": "27736s",
"visitLabel": "",
"delayBeforeStart": {
"startTime": "2023-06-12T23:51:47.000Z",
"duration": "60s"
},
"shipmentName": ""
},
{
"shipmentIndex": 1145,
"isPickup": false,
"visitRequestIndex": 0,
"startTime": "2023-06-13T00:00:59.000Z",
"detour": "840s",
"visitLabel": "",
"delayBeforeStart": {
"startTime": "2023-06-12T23:59:52.000Z",
"duration": "67s"
},
"shipmentName": ""
},
{
"shipmentIndex": 1105,
"isPickup": false,
"visitRequestIndex": 0,
"startTime": "2023-06-13T00:15:53.000Z",
"detour": "985s",
"visitLabel": "",
"delayBeforeStart": {
"startTime": "2023-06-13T00:14:59.000Z",
"duration": "54s"
},
"shipmentName": ""
},
{
"shipmentIndex": 1144,
"isPickup": false,
"visitRequestIndex": 0,
"startTime": "2023-06-13T00:16:53.000Z",
"detour": "765s",
"visitLabel": "",
"shipmentName": ""
},
{
"shipmentIndex": 1089,
"isPickup": true,
"visitRequestIndex": 0,
"startTime": "2023-06-13T00:28:11.000Z",
"detour": "29927s",
"visitLabel": "",
"delayBeforeStart": {
"startTime": "2023-06-13T00:25:11.000Z",
"duration": "180s"
},
"shipmentName": ""
},
{
"shipmentIndex": 1141,
"isPickup": false,
"visitRequestIndex": 0,
"startTime": "2023-06-13T00:38:32.000Z",
"detour": "9206s",
"visitLabel": "",
"delayBeforeStart": {
"startTime": "2023-06-13T00:37:38.000Z",
"duration": "54s"
},
"shipmentName": ""
},
{
"shipmentIndex": 1115,
"isPickup": false,
"visitRequestIndex": 0,
"startTime": "2023-06-13T00:39:32.000Z",
"detour": "14399s",
"visitLabel": "",
"shipmentName": ""
},
{
"shipmentIndex": 1139,
"isPickup": false,
"visitRequestIndex": 0,
"startTime": "2023-06-13T00:40:32.000Z",
"detour": "9903s",
"visitLabel": "",
"shipmentName": ""
},
{
"shipmentIndex": 1140,
"isPickup": false,
"visitRequestIndex": 0,
"startTime": "2023-06-13T00:41:32.000Z",
"detour": "9625s",
"visitLabel": "",
"shipmentName": ""
},
{
"shipmentIndex": 1089,
"isPickup": false,
"visitRequestIndex": 0,
"startTime": "2023-06-13T00:42:32.000Z",
"detour": "240s",
"visitLabel": "",
"shipmentName": ""
}
],
"transitions": [
{
"travelDuration": "0s",
"travelDistanceMeters": 0,
"trafficInfoUnavailable": false,
"delayDuration": "54s",
"waitDuration": "0s",
"totalDuration": "54s",
"startTime": "2023-06-12T15:59:06.000Z"
},
{
"travelDuration": "283s",
"travelDistanceMeters": 2834,
"trafficInfoUnavailable": false,
"delayDuration": "120s",
"waitDuration": "0s",
"totalDuration": "403s",
"startTime": "2023-06-12T16:01:00.000Z"
},
{
"travelDuration": "0s",
"travelDistanceMeters": 0,
"trafficInfoUnavailable": false,
"waitDuration": "0s",
"totalDuration": "0s",
"startTime": "2023-06-12T16:08:43.000Z"
},
{
"travelDuration": "422s",
"travelDistanceMeters": 3549,
"trafficInfoUnavailable": false,
"delayDuration": "54s",
"waitDuration": "0s",
"totalDuration": "476s",
"startTime": "2023-06-12T16:09:43.000Z"
},
{
"travelDuration": "838s",
"travelDistanceMeters": 8780,
"trafficInfoUnavailable": false,
"delayDuration": "60s",
"waitDuration": "0s",
"totalDuration": "898s",
"startTime": "2023-06-12T16:18:39.000Z"
},
{
"travelDuration": "0s",
"travelDistanceMeters": 0,
"trafficInfoUnavailable": false,
"delayDuration": "67s",
"waitDuration": "0s",
"totalDuration": "67s",
"startTime": "2023-06-12T16:34:37.000Z"
},
{
"travelDuration": "0s",
"travelDistanceMeters": 0,
"trafficInfoUnavailable": false,
"waitDuration": "0s",
"totalDuration": "0s",
"startTime": "2023-06-12T16:36:44.000Z"
},
{
"travelDuration": "0s",
"travelDistanceMeters": 0,
"trafficInfoUnavailable": false,
"waitDuration": "0s",
"totalDuration": "0s",
"startTime": "2023-06-12T16:37:44.000Z"
},
{
"travelDuration": "780s",
"travelDistanceMeters": 9273,
"trafficInfoUnavailable": false,
"delayDuration": "54s",
"waitDuration": "0s",
"totalDuration": "834s",
"startTime": "2023-06-12T16:38:44.000Z"
},
{
"travelDuration": "0s",
"travelDistanceMeters": 0,
"trafficInfoUnavailable": false,
"waitDuration": "0s",
"totalDuration": "0s",
"startTime": "2023-06-12T16:53:38.000Z"
},
{
"travelDuration": "438s",
"travelDistanceMeters": 3918,
"trafficInfoUnavailable": false,
"delayDuration": "180s",
"waitDuration": "1684s",
"totalDuration": "2302s",
"startTime": "2023-06-12T16:54:38.000Z"
},
{
"travelDuration": "435s",
"travelDistanceMeters": 3614,
"trafficInfoUnavailable": false,
"delayDuration": "180s",
"waitDuration": "0s",
"totalDuration": "615s",
"startTime": "2023-06-12T17:34:00.000Z"
},
{
"travelDuration": "815s",
"travelDistanceMeters": 8539,
"trafficInfoUnavailable": false,
"delayDuration": "180s",
"waitDuration": "0s",
"totalDuration": "995s",
"startTime": "2023-06-12T17:45:15.000Z"
},
{
"travelDuration": "706s",
"travelDistanceMeters": 7166,
"trafficInfoUnavailable": false,
"delayDuration": "54s",
"waitDuration": "0s",
"totalDuration": "760s",
"startTime": "2023-06-12T18:02:50.000Z"
},
{
"travelDuration": "0s",
"travelDistanceMeters": 0,
"trafficInfoUnavailable": false,
"delayDuration": "60s",
"waitDuration": "1836s",
"totalDuration": "1896s",
"startTime": "2023-06-12T18:16:30.000Z"
},
{
"travelDuration": "0s",
"travelDistanceMeters": 0,
"trafficInfoUnavailable": false,
"delayDuration": "54s",
"waitDuration": "0s",
"totalDuration": "54s",
"startTime": "2023-06-12T18:49:06.000Z"
},
{
"travelDuration": "0s",
"travelDistanceMeters": 0,
"trafficInfoUnavailable": false,
"waitDuration": "594s",
"totalDuration": "594s",
"startTime": "2023-06-12T18:51:00.000Z"
},
{
"travelDuration": "838s",
"travelDistanceMeters": 8780,
"trafficInfoUnavailable": false,
"delayDuration": "67s",
"waitDuration": "0s",
"totalDuration": "905s",
"startTime": "2023-06-12T19:01:54.000Z"
},
{
"travelDuration": "1278s",
"travelDistanceMeters": 26367,
"trafficInfoUnavailable": false,
"delayDuration": "60s",
"breakDuration": "1800s",
"waitDuration": "0s",
"totalDuration": "3138s",
"startTime": "2023-06-12T19:17:59.000Z"
},
{
"travelDuration": "3623s",
"travelDistanceMeters": 84972,
"trafficInfoUnavailable": false,
"delayDuration": "60s",
"waitDuration": "0s",
"totalDuration": "3683s",
"startTime": "2023-06-12T20:11:17.000Z"
},
{
"travelDuration": "308s",
"travelDistanceMeters": 3348,
"trafficInfoUnavailable": false,
"delayDuration": "108s",
"waitDuration": "0s",
"totalDuration": "416s",
"startTime": "2023-06-12T21:13:40.000Z"
},
{
"travelDuration": "221s",
"travelDistanceMeters": 994,
"trafficInfoUnavailable": false,
"delayDuration": "60s",
"waitDuration": "0s",
"totalDuration": "281s",
"startTime": "2023-06-12T21:21:36.000Z"
},
{
"travelDuration": "2078s",
"travelDistanceMeters": 42637,
"trafficInfoUnavailable": false,
"delayDuration": "180s",
"waitDuration": "0s",
"totalDuration": "2258s",
"startTime": "2023-06-12T21:27:17.000Z"
},
{
"travelDuration": "246s",
"travelDistanceMeters": 1588,
"trafficInfoUnavailable": false,
"delayDuration": "180s",
"waitDuration": "0s",
"totalDuration": "426s",
"startTime": "2023-06-12T22:05:55.000Z"
},
{
"travelDuration": "133s",
"travelDistanceMeters": 887,
"trafficInfoUnavailable": false,
"delayDuration": "60s",
"waitDuration": "0s",
"totalDuration": "193s",
"startTime": "2023-06-12T22:14:01.000Z"
},
{
"travelDuration": "110s",
"travelDistanceMeters": 514,
"trafficInfoUnavailable": false,
"delayDuration": "120s",
"waitDuration": "0s",
"totalDuration": "230s",
"startTime": "2023-06-12T22:18:14.000Z"
},
{
"travelDuration": "171s",
"travelDistanceMeters": 864,
"trafficInfoUnavailable": false,
"waitDuration": "0s",
"totalDuration": "171s",
"startTime": "2023-06-12T22:23:04.000Z"
},
{
"travelDuration": "71s",
"travelDistanceMeters": 277,
"trafficInfoUnavailable": false,
"delayDuration": "180s",
"waitDuration": "0s",
"totalDuration": "251s",
"startTime": "2023-06-12T22:26:55.000Z"
},
{
"travelDuration": "452s",
"travelDistanceMeters": 3375,
"trafficInfoUnavailable": false,
"delayDuration": "180s",
"waitDuration": "322s",
"totalDuration": "954s",
"startTime": "2023-06-12T22:32:06.000Z"
},
{
"travelDuration": "658s",
"travelDistanceMeters": 11338,
"trafficInfoUnavailable": false,
"delayDuration": "67s",
"waitDuration": "0s",
"totalDuration": "725s",
"startTime": "2023-06-12T22:49:00.000Z"
},
{
"travelDuration": "780s",
"travelDistanceMeters": 9273,
"trafficInfoUnavailable": false,
"delayDuration": "54s",
"waitDuration": "0s",
"totalDuration": "834s",
"startTime": "2023-06-12T23:02:05.000Z"
},
{
"travelDuration": "0s",
"travelDistanceMeters": 0,
"trafficInfoUnavailable": false,
"waitDuration": "0s",
"totalDuration": "0s",
"startTime": "2023-06-12T23:16:59.000Z"
},
{
"travelDuration": "0s",
"travelDistanceMeters": 0,
"trafficInfoUnavailable": false,
"waitDuration": "0s",
"totalDuration": "0s",
"startTime": "2023-06-12T23:17:59.000Z"
},
{
"travelDuration": "0s",
"travelDistanceMeters": 0,
"trafficInfoUnavailable": false,
"waitDuration": "0s",
"totalDuration": "0s",
"startTime": "2023-06-12T23:18:59.000Z"
},
{
"travelDuration": "0s",
"travelDistanceMeters": 0,
"trafficInfoUnavailable": false,
"waitDuration": "0s",
"totalDuration": "0s",
"startTime": "2023-06-12T23:19:59.000Z"
},
{
"travelDuration": "0s",
"travelDistanceMeters": 0,
"trafficInfoUnavailable": false,
"waitDuration": "535s",
"totalDuration": "535s",
"startTime": "2023-06-12T23:20:59.000Z"
},
{
"travelDuration": "0s",
"travelDistanceMeters": 0,
"trafficInfoUnavailable": false,
"waitDuration": "0s",
"totalDuration": "0s",
"startTime": "2023-06-12T23:30:54.000Z"
},
{
"travelDuration": "654s",
"travelDistanceMeters": 6486,
"trafficInfoUnavailable": false,
"delayDuration": "180s",
"waitDuration": "0s",
"totalDuration": "834s",
"startTime": "2023-06-12T23:31:54.000Z"
},
{
"travelDuration": "299s",
"travelDistanceMeters": 2573,
"trafficInfoUnavailable": false,
"delayDuration": "60s",
"waitDuration": "0s",
"totalDuration": "359s",
"startTime": "2023-06-12T23:46:48.000Z"
},
{
"travelDuration": "365s",
"travelDistanceMeters": 3703,
"trafficInfoUnavailable": false,
"delayDuration": "67s",
"waitDuration": "0s",
"totalDuration": "432s",
"startTime": "2023-06-12T23:53:47.000Z"
},
{
"travelDuration": "780s",
"travelDistanceMeters": 9273,
"trafficInfoUnavailable": false,
"delayDuration": "54s",
"waitDuration": "0s",
"totalDuration": "834s",
"startTime": "2023-06-13T00:01:59.000Z"
},
{
"travelDuration": "0s",
"travelDistanceMeters": 0,
"trafficInfoUnavailable": false,
"waitDuration": "0s",
"totalDuration": "0s",
"startTime": "2023-06-13T00:16:53.000Z"
},
{
"travelDuration": "438s",
"travelDistanceMeters": 3918,
"trafficInfoUnavailable": false,
"delayDuration": "180s",
"waitDuration": "0s",
"totalDuration": "618s",
"startTime": "2023-06-13T00:17:53.000Z"
},
{
"travelDuration": "507s",
"travelDistanceMeters": 5109,
"trafficInfoUnavailable": false,
"delayDuration": "54s",
"waitDuration": "0s",
"totalDuration": "561s",
"startTime": "2023-06-13T00:29:11.000Z"
},
{
"travelDuration": "0s",
"travelDistanceMeters": 0,
"trafficInfoUnavailable": false,
"waitDuration": "0s",
"totalDuration": "0s",
"startTime": "2023-06-13T00:39:32.000Z"
},
{
"travelDuration": "0s",
"travelDistanceMeters": 0,
"trafficInfoUnavailable": false,
"waitDuration": "0s",
"totalDuration": "0s",
"startTime": "2023-06-13T00:40:32.000Z"
},
{
"travelDuration": "0s",
"travelDistanceMeters": 0,
"trafficInfoUnavailable": false,
"waitDuration": "0s",
"totalDuration": "0s",
"startTime": "2023-06-13T00:41:32.000Z"
},
{
"travelDuration": "0s",
"travelDistanceMeters": 0,
"trafficInfoUnavailable": false,
"waitDuration": "0s",
"totalDuration": "0s",
"startTime": "2023-06-13T00:42:32.000Z"
},
{
"travelDuration": "0s",
"travelDistanceMeters": 0,
"trafficInfoUnavailable": false,
"waitDuration": "0s",
"totalDuration": "0s",
"startTime": "2023-06-13T00:43:32.000Z"
}
],
"hasTrafficInfeasibilities": false,
"breaks": [
{
"startTime": "2023-06-12T00:00:00.000Z",
"duration": "1800s"
},
{
"startTime": "2023-06-12T06:00:00.000Z",
"duration": "1800s"
},
{
"startTime": "2023-06-12T12:00:00.000Z",
"duration": "1800s"
},
{
"startTime": "2023-06-12T19:17:59.000Z",
"duration": "1800s"
},
{
"startTime": "2023-06-13T00:43:32.000Z",
"duration": "1800s"
},
{
"startTime": "2023-06-13T06:00:00.000Z",
"duration": "1800s"
},
{
"startTime": "2023-06-13T12:00:00.000Z",
"duration": "1800s"
},
{
"startTime": "2023-06-13T18:00:00.000Z",
"duration": "1800s"
}
],
"metrics": {
"performedShipmentCount": 24,
"travelDuration": "18727s",
"waitDuration": "4971s",
"delayDuration": "3088s",
"breakDuration": "1800s",
"visitDuration": "2880s",
"totalDuration": "31466s",
"travelDistanceMeters": 273949,
"totalCost": 0,
"performedMandatoryShipmentCount": 24
},
"travelSteps": [
{
"duration": "0s",
"distanceMeters": 0,
"trafficInfoUnavailable": false
},
{
"duration": "282s",
"distanceMeters": 2837,
"trafficInfoUnavailable": false
},
{
"duration": "0s",
"distanceMeters": 0,
"trafficInfoUnavailable": false
},
{
"duration": "421s",
"distanceMeters": 3547,
"trafficInfoUnavailable": false
},
{
"duration": "838s",
"distanceMeters": 8785,
"trafficInfoUnavailable": false
},
{
"duration": "0s",
"distanceMeters": 0,
"trafficInfoUnavailable": false
},
{
"duration": "0s",
"distanceMeters": 0,
"trafficInfoUnavailable": false
},
{
"duration": "0s",
"distanceMeters": 0,
"trafficInfoUnavailable": false
},
{
"duration": "780s",
"distanceMeters": 9278,
"trafficInfoUnavailable": false
},
{
"duration": "0s",
"distanceMeters": 0,
"trafficInfoUnavailable": false
},
{
"duration": "437s",
"distanceMeters": 3915,
"trafficInfoUnavailable": false
},
{
"duration": "437s",
"distanceMeters": 3616,
"trafficInfoUnavailable": false
},
{
"duration": "815s",
"distanceMeters": 8541,
"trafficInfoUnavailable": false
},
{
"duration": "706s",
"distanceMeters": 7169,
"trafficInfoUnavailable": false
},
{
"duration": "0s",
"distanceMeters": 0,
"trafficInfoUnavailable": false
},
{
"duration": "0s",
"distanceMeters": 0,
"trafficInfoUnavailable": false
},
{
"duration": "0s",
"distanceMeters": 0,
"trafficInfoUnavailable": false
},
{
"duration": "838s",
"distanceMeters": 8785,
"trafficInfoUnavailable": false
},
{
"duration": "1277s",
"distanceMeters": 26364,
"trafficInfoUnavailable": false
},
{
"duration": "3623s",
"distanceMeters": 84975,
"trafficInfoUnavailable": false
},
{
"duration": "307s",
"distanceMeters": 3348,
"trafficInfoUnavailable": false
},
{
"duration": "220s",
"distanceMeters": 993,
"trafficInfoUnavailable": false
},
{
"duration": "2077s",
"distanceMeters": 42634,
"trafficInfoUnavailable": false
},
{
"duration": "245s",
"distanceMeters": 1588,
"trafficInfoUnavailable": false
},
{
"duration": "132s",
"distanceMeters": 888,
"trafficInfoUnavailable": false
},
{
"duration": "110s",
"distanceMeters": 515,
"trafficInfoUnavailable": false
},
{
"duration": "171s",
"distanceMeters": 864,
"trafficInfoUnavailable": false
},
{
"duration": "70s",
"distanceMeters": 276,
"trafficInfoUnavailable": false
},
{
"duration": "452s",
"distanceMeters": 3374,
"trafficInfoUnavailable": false
},
{
"duration": "658s",
"distanceMeters": 11342,
"trafficInfoUnavailable": false
},
{
"duration": "780s",
"distanceMeters": 9278,
"trafficInfoUnavailable": false
},
{
"duration": "0s",
"distanceMeters": 0,
"trafficInfoUnavailable": false
},
{
"duration": "0s",
"distanceMeters": 0,
"trafficInfoUnavailable": false
},
{
"duration": "0s",
"distanceMeters": 0,
"trafficInfoUnavailable": false
},
{
"duration": "0s",
"distanceMeters": 0,
"trafficInfoUnavailable": false
},
{
"duration": "0s",
"distanceMeters": 0,
"trafficInfoUnavailable": false
},
{
"duration": "0s",
"distanceMeters": 0,
"trafficInfoUnavailable": false
},
{
"duration": "653s",
"distanceMeters": 6489,
"trafficInfoUnavailable": false
},
{
"duration": "298s",
"distanceMeters": 2576,
"trafficInfoUnavailable": false
},
{
"duration": "364s",
"distanceMeters": 3702,
"trafficInfoUnavailable": false
},
{
"duration": "780s",
"distanceMeters": 9278,
"trafficInfoUnavailable": false
},
{
"duration": "0s",
"distanceMeters": 0,
"trafficInfoUnavailable": false
},
{
"duration": "437s",
"distanceMeters": 3915,
"trafficInfoUnavailable": false
},
{
"duration": "509s",
"distanceMeters": 5107,
"trafficInfoUnavailable": false
},
{
"duration": "0s",
"distanceMeters": 0,
"trafficInfoUnavailable": false
},
{
"duration": "0s",
"distanceMeters": 0,
"trafficInfoUnavailable": false
},
{
"duration": "0s",
"distanceMeters": 0,
"trafficInfoUnavailable": false
},
{
"duration": "0s",
"distanceMeters": 0,
"trafficInfoUnavailable": false
},
{
"duration": "0s",
"distanceMeters": 0,
"trafficInfoUnavailable": false
}
],
"vehicleDetour": "31466s",
"routeCosts": {
"model.vehicles.cost_per_kilometer": 25.53359461185,
"model.vehicles.cost_per_hour": 171.14007777777775,
"model.vehicles.fixed_cost": 24.65
},
"routeTotalCost": 221.32367238962775,
"vehicleName": "",
"vehicleFullness": {
"maxFullness": 0.8740555555555556,
"activeDuration": 0.8740555555555556,
"activeSpan": 0.18215815676739608
}
}
Label shipment icons on the gantt chart with basic information (id and label). Permanent labels or on mouse hover may make better sense.
Have deployed it on the GCP. Created very simple problem with 2 delivery and 2 vehicle. On hitting Generate getting unknown error 0 msg. Refer the screenshot.
dispatcher_20230213095656.zip
The readme for local development says "a service account was created in the project setup", but it was not
Here is the location of the text:
https://github.com/google/cfr/blob/main/docs/development.md#service-account-credentials
Here is a link to the referenced project setup:
https://github.com/google/cfr/blob/main/docs/project.md
Please update documentation file to include the Help file with the right reference to show images for a preview of the application
In some instances, travel steps may not be displayed on a timeline and an error is thrown. This appears to be related to trying to set the endTime
property on lastTravelSegment
, which may not always be set.
core.mjs:6494 ERROR TypeError: Cannot read properties of undefined (reading 'startTime')
at getTimeline (timeline.selectors.ts:236:73)
at timeline.selectors.ts:248:7
at ngrx-store.mjs:697:30
at memoized (ngrx-store.mjs:578:39)
at defaultStateFn (ngrx-store.mjs:601:43)
at ngrx-store.mjs:700:36
at memoized (ngrx-store.mjs:578:39)
at MapSubscriber.project (ngrx-store.mjs:478:52)
at MapSubscriber._next (map.js:29:1)
at MapSubscriber.next (Subscriber.js:49:1)
The default 256mb of memory can result in a SERVICE UNAVAILABLE error on the frontend if the Cloud run instance runs out of memory when processing a large scenario. Either parameterizing the machine size or increasing the default to 512 should help prevent out of memory errors.
Label shipment and vehicle icons on the map with basic information (id and label). These labels should be available for both scenario and solution maps and gantt and metadata views (solution). Permanent labels or on mouse hover may make better sense.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.