تحسين أساسيات محطات استلام الطلبات وتوصيلها

يعمل هذا السيناريو على تحسين ترتيب المحطات المخصصة لمركبة بطريقة بسيطة مَعلمات التكلفة. وهو أبسط وضع لعملية تحسين المسارات، ويضمن زيارة جميع المحطات خلال الإطار الزمني المحدد.

يوضح المثال التالي سيناريو أساسي لمركبة واحدة وثلاث الشحنات التي تنشأ جميعها من موقع جغرافي واحد يُسمّى مستودعًا.

الاطّلاع على مثال لطلب

      {
        "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 لتطبيق "خرائط Google"، والذي يمثل البيانات الثنائية المتعددة الخطوط باستخدام أحرف ASCII قابلة للطباعة. يمكنك استخدام صفحة أداة الترميز المتعدد الخطوط التفاعلية لعرض المسارات المحسوبة من خلال تحسين المسار. يحدد المثال في هذا الدليل السمات populatePolylines populateTransitionPolylines على "صحيح" ولكن أدلة أخرى مضبوطة على "خطأ" على تقليل حجم الاستجابة.

راجِع تنسيق الخوارزمية المتعدّدة الأسطر المشفَّرة للحصول على وصف للترميز. .

قيود الوقت العالمية

تمّ ضبط model.globalStartTime وmodel.globalEndTime على قيمة عشوائية 24. ساعة محددة. يسهّل ذلك تفسير الطوابع الزمنية للمخرجات.

زيارة المواقع الجغرافية

يستخدم الطلب كمثال فقط السمة model.shipments[].pickups[].arrivalLocation model.shipments[].deliveries[].arrivalLocation تتوفر أيضًا السمة departureLocation للحالات التي تغادر فيها المركبة من نقطة مختلفة عن مكان وصولها، مثل مجمع لوقوف السيارات بمدخل على أحد جانبي المبنى ومخرج على جانب آخر. في هذه القصة والفرص اللاحق فقط، يُفترض أن تكون نقاط الوصول والمغادرة متطابقة.

يمكنك أيضًا الوصول إلى waypoint عند الوصول والمغادرة كبديل لـ latLng. يتيح Waypoint حقلاً استخدام أرقام تعريف أماكن Google كبديل لـ 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 من المستوى الأعلى يحتوي على المسارات المقترحة، مع تحديد مسار واحد لكل مركبة. نظرًا لأن المثال يحدّد الطلب الوارد في هذا الدليل مركبة واحدة فقط، من بينها routes مركبة واحدة رسالة واحدة (ShipmentRoute).

ShipmentRoute مكانًا للإقامة

أهم سمتين لنوع الرسالة 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، لأن أن تنتقل المركبة من موقع البدء إلى أول زيارة لها في البداية للمسار ومن زيارته الأخيرة إلى موقعه النهائي في نهاية المسار الصحيح. إذا لم تكن المركبة تفتقر إلى موقع للبدء أو النهاية، فسيظل هناك موقع transitions أكثر من visits لأن الموقع الجغرافي للزيارة الأولى أو الأخيرة هو يُستخدم كموقع بداية أو نهاية للمركبة على التوالي.

في هذا المثال، تحتوي أول ثلاث زيارات للاستلام على انتقالات بينها بدون مسافة والمدة لأن جميع عمليات الاستلام الثلاثة مشاركة الموقع نفسه في الطلب.

يمكنك الاطّلاع على مستندات ShipmentRoute المرجعية (REST وgRPC) للحصول على المزيد من المعلومات. التفاصيل.

تحسين بسيط لترتيب النقاط

كما يوضح هذا المثال، نماذج تحسين المسار الزيارات كخصائص الشحنات وليس لديها فكرة عن نقاط الطريق أو التوقف كوحدة . ومع ذلك، من الممكن تمثيل محطات التوقف أو نقاط الطريق كشحنات من خلال سمة VisitRequest واحدة فقط لاستلام الطلبات أو توصيلها. يجب أن تظل المركبة تمّ تعيين costPerHour أو costPerKilometer للمُحسِّن من أجل إيجاد الطريق الأمثل (على عكس إيجاد أي طريق ممكن).