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

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

ตัวอย่างต่อไปนี้แสดงสถานการณ์เบื้องต้นที่มีรถยนต์ 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 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 คัน เนื่องจากคำขอตัวอย่างในคู่มือนี้ระบุเฉพาะยานพาหนะ 1 คัน routes จึงมีข้อความ ShipmentRoute 1 รายการ

ที่พัก 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 เพื่อให้เครื่องมือเพิ่มประสิทธิภาพค้นหา เส้นทางที่ดีที่สุด (ไม่ใช่การค้นหาเส้นทางที่เป็นไปได้)