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

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

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

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

      {
        "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 ระบุว่าจะใช้เส้นทางหรือไม่ การเพิ่มประสิทธิภาพควรแสดงเส้นประกอบ

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

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

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

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

เยี่ยมชมสถานที่

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

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

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

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

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

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

พร็อพเพอร์ตี้การตอบกลับการเพิ่มประสิทธิภาพเส้นทาง

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

    {
      "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 คัน เนื่องจากตัวอย่าง คําขอในคู่มือนี้ระบุยานพาหนะเพียง 1 คัน routesมี 1 คัน ShipmentRoute ข้อความ

ที่พัก ShipmentRoute แห่ง

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

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

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

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

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 เนื่องจากตำแหน่งของการเข้าชมครั้งแรกหรือครั้งสุดท้ายคือ ใช้เป็นตำแหน่งเริ่มต้นหรือจุดสิ้นสุดของยานพาหนะตามลำดับ

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

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

การเพิ่มประสิทธิภาพคำสั่งซื้อจุดอ้างอิงอย่างง่าย

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