การเพิ่มประสิทธิภาพการหยุดคำสั่งซื้อขั้นพื้นฐานสำหรับการมารับสินค้าและการจัดส่ง

สถานการณ์นี้จะเพิ่มประสิทธิภาพลําดับป้ายจอดรถที่กำหนดให้กับยานพาหนะด้วยพารามิเตอร์ต้นทุนแบบง่าย นี่เป็นโหมดที่ง่ายที่สุดในการดำเนินการเพิ่มประสิทธิภาพเส้นทาง และช่วยให้มั่นใจได้ว่ารถจะแวะทุกป้ายภายในกรอบเวลาที่กำหนด

ตัวอย่างต่อไปนี้แสดงสถานการณ์พื้นฐานที่มียานพาหนะ 1 คันและการจัดส่ง 3 รายการ ซึ่งทั้งหมดมาจากสถานที่ตั้งแห่งเดียวที่เรียกว่าคลังสินค้า

ดูตัวอย่างคำขอ

      {
        "populatePolylines": true,
        "populateTransitionPolylines": true,
        "model": {
          "globalStartTime": "2023-01-13T16:00:00-08:00",
          "globalEndTime": "2023-01-14T16:00:00-08:00",
          "shipments": [
            {
              "deliveries": [
                {
                  "arrivalLocation": {
                    "latitude": 37.789456,
                    "longitude": -122.390192
                  },
                  "duration": "250s"
                }
              ],
              "pickups": [
                {
                  "arrivalLocation": {
                    "latitude": 37.794465,
                    "longitude": -122.394839
                  },
                  "duration": "150s"
                }
              ]
            },
            {
              "deliveries": [
                {
                  "arrivalLocation": {
                    "latitude": 37.789116,
                    "longitude": -122.395080
                  },
                  "duration": "250s"
                }
              ],
              "pickups": [
                {
                  "arrivalLocation": {
                    "latitude": 37.794465,
                    "longitude": -122.394839
                  },
                  "duration": "150s"
                }
              ]
            },
            {
              "deliveries": [
                {
                  "arrivalLocation": {
                    "latitude": 37.795242,
                    "longitude": -122.399347
                  },
                  "duration": "250s"
                }
              ],
              "pickups": [
                {
                  "arrivalLocation": {
                    "latitude": 37.794465,
                    "longitude": -122.394839
                  },
                  "duration": "150s"
                }
              ]
            }
          ],
          "vehicles": [
            {
              "endLocation": {
                "latitude": 37.794465,
                "longitude": -122.394839
              },
              "startLocation": {
                "latitude": 37.794465,
                "longitude": -122.394839
              },
              "costPerKilometer": 10.0,
              "costPerHour": 40.0
            }
          ]
        }
      }
    

ช่องคำขอการเพิ่มประสิทธิภาพเส้นทาง

ดังที่ได้กล่าวไว้ในภาพรวม พร็อพเพอร์ตี้คำขอการเพิ่มประสิทธิภาพเส้นทางที่สำคัญที่สุดคือ vehicles และ shipments

นอกเหนือจากยานพาหนะและการจัดส่งแล้ว คำขอยังมีช่องต่อไปนี้ด้วย

เส้นประกอบ

populatePolylines และ populateTransitionPolylines ระบุว่า Route Optimization ควรแสดงผลเส้นประกอบหรือไม่

บริการจะเข้ารหัสเส้นประกอบโดยใช้ตัวแปลงรหัสเส้นประกอบ Maps JS ซึ่งแสดงข้อมูลเส้นประกอบแบบไบนารีโดยใช้อักขระ ASCII ที่พิมพ์ได้ คุณสามารถใช้ยูทิลิตีโปรแกรมเข้ารหัสรูปหลายเหลี่ยมแบบอินเทอร์แอกทีฟเพื่อแสดงภาพเส้นทางที่คำนวณโดยการเพิ่มประสิทธิภาพเส้นทาง ตัวอย่างในคู่มือนี้จะตั้งค่า populatePolylines และ populateTransitionPolylines เป็น "จริง" แต่คู่มืออื่นๆ จะตั้งค่าเป็น "เท็จ" เพื่อลดขนาดการตอบกลับ

ดูคำอธิบายรูปแบบการเข้ารหัสได้ที่รูปแบบอัลกอริทึม Polyline ที่เข้ารหัส

ข้อจำกัดด้านเวลาทั่วโลก

model.globalStartTime และ model.globalEndTime ถูกตั้งค่าเป็นระยะเวลา 24 ชั่วโมงที่กำหนดเอง วิธีนี้ช่วยให้ตีความการประทับเวลาเอาต์พุตได้ง่ายขึ้น

ไปที่สถานที่

คําขอตัวอย่างใช้เฉพาะ model.shipments[].pickups[].arrivalLocation และ model.shipments[].deliveries[].arrivalLocation นอกจากนี้ยังมีพร็อพเพอร์ตี้ departureLocation สำหรับกรณีที่ยานพาหนะออกจากจุดอื่นที่ไม่ใช่จุดที่มาถึง เช่น อาคารจอดรถที่มีทางเข้าด้านหนึ่งของอาคารและทางออกอีกด้านหนึ่ง ในคู่มือนี้และคู่มือต่อๆ ไป เราจะถือว่าจุดต้นทางและจุดหมายเดียวกัน

waypoint สำหรับการมาถึงและออกเดินทางก็มีให้ใช้แทน latLng ด้วย ฟิลด์ Waypoint รองรับการใช้รหัส Google Places แทน LatLng และระบุทิศทางของยานพาหนะได้ด้วย ดูรายละเอียดเพิ่มเติมในเอกสารอ้างอิง (REST, gRPC)

ข้อจำกัดในตัวอย่างนี้

สถานการณ์นี้จํากัดเครื่องมือเพิ่มประสิทธิภาพในหลายวิธี ดังนี้

  1. กิจกรรมทั้งหมดต้องเสร็จสิ้นระหว่างเวลาเริ่มต้นและเวลาสิ้นสุดทั่วโลก ในกรณีนี้ เวลาเริ่มต้นและเวลาสิ้นสุดเป็นข้อจำกัดที่ยืดหยุ่นมากเนื่องจากการจัดส่งอยู่ใกล้กันและมีกรอบเวลาทั่วโลกที่กว้าง
  2. ต้องดำเนินการจัดส่งให้เสร็จสมบูรณ์ ลักษณะการทำงานนี้เป็นลักษณะเริ่มต้นเมื่อไม่ได้ระบุค่าปรับใน shipments
  3. costPerKilometer และ costPerHour ตั้งค่าไว้ในยานพาหนะ

ค่าใช้จ่ายจะระบุไว้ในพารามิเตอร์รูปแบบต้นทุน

พร็อพเพอร์ตี้คำตอบของ Route Optimization

ดูการตอบกลับคําขอตัวอย่าง

    {
      "routes": [
        {
          "vehicleStartTime": "2023-01-14T00:00:00Z",
          "vehicleEndTime": "2023-01-14T00:36:41Z",
          "visits": [
            {
              "shipmentIndex": 2,
              "isPickup": true,
              "startTime": "2023-01-14T00:00:00Z",
              "detour": "0s"
            },
            {
              "shipmentIndex": 1,
              "isPickup": true,
              "startTime": "2023-01-14T00:02:30Z",
              "detour": "150s"
            },
            {
              "isPickup": true,
              "startTime": "2023-01-14T00:05:00Z",
              "detour": "300s"
            },
            {
              "startTime": "2023-01-14T00:11:25Z",
              "detour": "0s"
            },
            {
              "shipmentIndex": 1,
              "startTime": "2023-01-14T00:19:29Z",
              "detour": "503s"
            },
            {
              "shipmentIndex": 2,
              "startTime": "2023-01-14T00:29:02Z",
              "detour": "1324s"
            }
          ],
          "transitions": [
            {
              "travelDuration": "0s",
              "waitDuration": "0s",
              "totalDuration": "0s",
              "startTime": "2023-01-14T00:00:00Z",
              "routePolyline": {}
            },
            {
              "travelDuration": "0s",
              "waitDuration": "0s",
              "totalDuration": "0s",
              "startTime": "2023-01-14T00:02:30Z",
              "routePolyline": {}
            },
            {
              "travelDuration": "0s",
              "waitDuration": "0s",
              "totalDuration": "0s",
              "startTime": "2023-01-14T00:05:00Z",
              "routePolyline": {}
            },
            {
              "travelDuration": "235s",
              "travelDistanceMeters": 795,
              "waitDuration": "0s",
              "totalDuration": "235s",
              "startTime": "2023-01-14T00:07:30Z",
              "routePolyline": {
                "points": "kvteFtfjVAA?C?C@C?A?C@AFMj@s@JKb@k@Zc@LSjA}ARWDGdAxAdAvAXa@@k@AsA\\c@FKp@_A\\c@Ze@fA{ALSFGd@o@rAgBB{BZc@"
              }
            },
            {
              "travelDuration": "234s",
              "travelDistanceMeters": 793,
              "waitDuration": "0s",
              "totalDuration": "234s",
              "startTime": "2023-01-14T00:15:35Z",
              "routePolyline": {
                "points": "cwseFti_jVRWj@w@x@eAHLNRHJbApAHLX\\V^?@hA~AT\\PVFFDHDFJNp@~@NRLNNTFFUZIJY^Y^g@p@[`@KP{@fAEFSXe@l@c@h@WZY\\?BELk@v@MNa@l@"
              }
            },
            {
              "travelDuration": "323s",
              "travelDistanceMeters": 1204,
              "waitDuration": "0s",
              "totalDuration": "323s",
              "startTime": "2023-01-14T00:23:39Z",
              "routePolyline": {
                "points": "cuseFhjVSTY`@Yb@GHEDIJEF]f@IJi@r@oAbBeCfDKLaApAKNQVIPKPCDQJIBIBM@iAJeALqBVC@C?A?QBYDI@C?_@Dc@FO@a@FDp@HfAHvABVDl@Dj@PpCQDiALsALAQASKwAOgBEe@COCYEa@Es@Eg@"
              }
            },
            {
              "travelDuration": "209s",
              "travelDistanceMeters": 665,
              "waitDuration": "0s",
              "totalDuration": "209s",
              "startTime": "2023-01-14T00:33:12Z",
              "routePolyline": {
                "points": "{zteFxbajV?CAYEc@AMC_@AOAK?E?CCWAOAKCe@CY?WScDEm@d@EFA\\ENCB?XEVC^E`@EhBUVCNEB?@?\\Er@IMUe@k@k@w@AAMQa@i@SWQWMQi@u@AC?A"
              }
            }
          ],
          "routePolyline": {
            "points": "kvteFtfjVAA?C?C@C?A?C@AFMj@s@JKb@k@Zc@LSjA}ARWDGdAxAdAvAXa@@k@AsA\\c@FKp@_A\\c@Ze@fA{ALSFGd@o@rAgBB{BZc@RWj@w@x@eAHLNRHJbApAHLX\\V^?@hA~AT\\PVFFDHDFJNp@~@NRLNNTFFUZIJY^Y^g@p@[@KP{@fAEFSXe@l@c@h@WZY\\?BELk@v@MNa@l@STY@Yb@GHEDIJEF]f@IJi@r@oAbBeCfDKLaApAKNQVIPKPCDQJIBIBM@iAJeALqBVC@C?A?QBYDI@C?_@Dc@FO@a@FDp@HfAHvABVDl@Dj@PpCQDiALsALAQASKwAOgBEe@COCYEa@Es@Eg@?CAYEc@AMC_@AOAK?E?CCWAOAKCe@CY?WScDEm@d@EFA\\ENCB?XEVC^E`@EhBUVCNEB?@?\\Er@IMUe@k@k@w@AAMQa@i@SWQWMQi@u@AC?A"
          },
          "metrics": {
            "performedShipmentCount": 3,
            "travelDuration": "1001s",
            "waitDuration": "0s",
            "delayDuration": "0s",
            "breakDuration": "0s",
            "visitDuration": "1200s",
            "totalDuration": "2201s",
            "travelDistanceMeters": 3457
          },
          "travelSteps": [
            {
              "duration": "0s",
              "routePolyline": {}
            },
            {
              "duration": "0s",
              "routePolyline": {}
            },
            {
              "duration": "0s",
              "routePolyline": {}
            },
            {
              "duration": "227s",
              "distanceMeters": 794,
              "routePolyline": {
                "points": "kvteFtfjVAA?C?C@C?A?C@AFMj@s@JKb@k@Zc@LSjA}ARWDGdAxAdAvAXa@@k@AsA\\c@FKp@_A\\c@Ze@fA{ALSFGd@o@rAgBB{BZc@"
              }
            },
            {
              "duration": "233s",
              "distanceMeters": 791,
              "routePolyline": {
                "points": "cwseFti_jVRWj@w@x@eAHLNRHJbApAHLX\\V^?@hA~AT\\PVFFDHDFJNp@~@NRLNNTFFUZIJY^Y^g@p@[`@KP{@fAEFSXe@l@c@h@WZY\\?BELk@v@MNa@l@"
              }
            },
            {
              "duration": "322s",
              "distanceMeters": 1205,
              "routePolyline": {
                "points": "cuseFhjVSTY`@Yb@GHEDIJEF]f@IJi@r@oAbBeCfDKLaApAKNQVIPKPCDQJIBIBM@iAJeALqBVC@C?A?QBYDI@C?_@Dc@FO@a@FDp@HfAHvABVDl@Dj@PpCQDiALsALAQASKwAOgBEe@COCYEa@Es@Eg@"
              }
            },
            {
              "duration": "208s",
              "distanceMeters": 666,
              "routePolyline": {
                "points": "{zteFxbajV?CAYEc@AMC_@AOAK?E?CCWAOAKCe@CY?WScDEm@d@EFA\\ENCB?XEVC^E`@EhBUVCNEB?@?\\Er@IMUe@k@k@w@AAMQa@i@SWQWMQi@u@AC?A"
              }
            }
          ],
          "vehicleDetour": "2201s",
          "routeCosts": {
            "model.vehicles.cost_per_hour": 24.455555555555556,
            "model.vehicles.cost_per_kilometer": 34.57
          },
          "routeTotalCost": 59.025555555555556
        }
      ],
      "totalCost": 59.025555555555556,
      "metrics": {
        "aggregatedRouteMetrics": {
          "performedShipmentCount": 3,
          "travelDuration": "1001s",
          "waitDuration": "0s",
          "delayDuration": "0s",
          "breakDuration": "0s",
          "visitDuration": "1200s",
          "totalDuration": "2201s",
          "travelDistanceMeters": 3457
        },
        "usedVehicleCount": 1,
        "earliestVehicleStartTime": "2023-01-14T00:00:00Z",
        "latestVehicleEndTime": "2023-01-14T00:36:41Z",
        "totalCost": 59.025555555555556,
        "costs": {
          "model.vehicles.cost_per_kilometer": 34.57,
          "model.vehicles.cost_per_hour": 24.455555555555556
        }
      }
    }
    

การตอบกลับการเพิ่มประสิทธิภาพเส้นทางจะมีฟิลด์ routes ระดับบนสุดซึ่งแสดงเส้นทางที่เสนอโดยมี 1 เส้นทางต่อยานพาหนะ เนื่องจากคำขอตัวอย่างในคู่มือนี้ระบุเฉพาะยานพาหนะ 1 คัน routes จึงมีข้อความ ShipmentRoute 1 รายการ

ที่พัก ShipmentRoute แห่ง

พร็อพเพอร์ตี้ 2 รายการที่สําคัญที่สุดสําหรับประเภทข้อความ ShipmentRoute คือ visits และ transitions

Visit แต่ละรายการแสดงถึงการไปรับหรือการนำส่งที่เสร็จสมบูรณ์จาก VisitRequest ของข้อความคำขอ การเข้าชมเป็นงานที่ได้รับมอบหมายอย่างมีประสิทธิภาพเพื่อให้ยานพาหนะดำเนินการให้เสร็จสมบูรณ์ ณ สถานที่และเวลาหนึ่งๆ

Transition แต่ละรายการแสดงยานพาหนะที่เดินทางจากสถานที่หนึ่งไปยังอีกสถานที่หนึ่ง การเปลี่ยนอาจเกิดขึ้นระหว่างจุดเริ่มต้นของยานพาหนะ สถานที่เข้าชม และจุดสิ้นสุดของยานพาหนะ

หากต้องการสร้างเส้นทางที่สมบูรณ์ของยานพาหนะขึ้นมาใหม่ คุณต้องรวม visits และ transitions ของ ShipmentRoute การรวมฟิลด์ต่างๆ เข้าด้วยกันเพื่อแสดงลำดับขั้นของกิจกรรมของยานพาหนะจะมีลักษณะดังต่อไปนี้

request.vehicles[0].startLocation -> transitions[0] -> visits[0] ->
transitions[1] -> visits[1] -> transitions[2] -> ... -> visits[3] ->
transitions[4] -> request.vehicles[0].endLocation

ShipmentRoute จะมีtransitionsมากกว่าvisits 1 รายการเสมอ เนื่องจากยานพาหนะต้องเดินทางจากจุดเริ่มต้นไปยังจุดที่ไปครั้งแรกที่จุดเริ่มต้นของเส้นทาง และจากจุดที่ไปครั้งล่าสุดไปยังจุดสิ้นสุดที่จุดสิ้นสุดของเส้นทาง หากยานพาหนะไม่มีจุดเริ่มต้นหรือจุดสิ้นสุด transitions จะยังคงมากกว่า visits 1 รายการ เนื่องจากระบบจะใช้ตำแหน่งของการเข้าชมครั้งแรกหรือครั้งล่าสุดเป็นจุดเริ่มต้นหรือจุดสิ้นสุดของยานพาหนะตามลำดับ

ในตัวอย่างนี้ การเข้ารับพัสดุ 3 ครั้งแรกมีการเปลี่ยนผ่านระหว่างกัน โดยมีระยะทางและระยะเวลาเป็น 0 เนื่องจากการรับพัสดุทั้ง 3 ครั้งใช้สถานที่เดียวกันในคำขอ

ดูรายละเอียดเพิ่มเติมได้ในShipmentRouteเอกสารอ้างอิง (REST, gRPC)

การเพิ่มประสิทธิภาพลําดับของจุดแวะพักอย่างง่าย

ดังที่ตัวอย่างนี้แสดงให้เห็น การเพิ่มประสิทธิภาพเส้นทางจะจำลองการเข้าชมเป็นพร็อพเพอร์ตี้ของการจัดส่ง และไม่มีแนวคิดเรื่องจุดแวะพักหรือจุดจอดเป็นเอนทิตีอิสระ อย่างไรก็ตาม คุณแสดงจุดแวะพักหรือจุดแวะพักกลางทางเป็นการจัดส่งได้ โดยมี VisitRequest เพียง 1 รายการเป็นจุดรับหรือจุดนำส่ง ยานพาหนะยังคงต้องกำหนดcostPerHourหรือcostPerKilometerเพื่อให้เครื่องมือเพิ่มประสิทธิภาพค้นหาเส้นทางที่ดีที่สุด (ไม่ใช่ค้นหาเส้นทางที่เป็นไปได้)