পিকআপ এবং ডেলিভারির জন্য বেসিক স্টপ অর্ডার অপ্টিমাইজেশান

এই দৃশ্যকল্পটি সাধারণ খরচ পরামিতি সহ একটি যানবাহনের জন্য নির্ধারিত স্টপের ক্রমকে অপ্টিমাইজ করে। এটি রুট অপ্টিমাইজেশন অপারেশনের সবচেয়ে সহজ মোড, এবং নিশ্চিত করে যে সমস্ত স্টপ নির্দিষ্ট সময়সীমার মধ্যে পরিদর্শন করা হয়েছে।

নিম্নলিখিত উদাহরণটি একটি গাড়ি এবং তিনটি চালান সহ একটি মৌলিক দৃশ্যকে চিত্রিত করে, সবগুলি একটি ডিপো নামক একক অবস্থান থেকে উদ্ভূত।

একটি উদাহরণ অনুরোধ দেখুন

      {
        "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 পলিলাইন কোডেক ব্যবহার করে পলিলাইনগুলিকে এনকোড করে, যা মুদ্রণযোগ্য ASCII অক্ষর ব্যবহার করে বাইনারি পলিলাইন ডেটা উপস্থাপন করে৷ আপনি রুট অপ্টিমাইজেশান দ্বারা গণনা করা পাথগুলি কল্পনা করতে ইন্টারেক্টিভ পলিলাইন এনকোডার ইউটিলিটি ব্যবহার করতে পারেন। এই গাইডের উদাহরণটি populatePolylines এবং populateTransitionPolylines কে সত্যে সেট করে কিন্তু অন্যান্য গাইড প্রতিক্রিয়া আকার কমাতে সেগুলিকে মিথ্যাতে সেট করে।

এনকোডিং বিন্যাসের বর্ণনার জন্য এনকোডেড পলিলাইন অ্যালগরিদম বিন্যাস দেখুন।

বিশ্বব্যাপী সময় সীমাবদ্ধতা

model.globalStartTime এবং model.globalEndTime একটি নির্বিচারে 24 ঘন্টা সময়কালে সেট করা হয়েছে৷ এটি আউটপুট টাইমস্ট্যাম্পগুলিকে ব্যাখ্যা করা সহজ করে তোলে।

অবস্থান পরিদর্শন করুন

উদাহরণের অনুরোধে শুধুমাত্র model.shipments[].pickups[].arrivalLocation এবং model.shipments[].deliveries[].arrivalLocation ব্যবহার করা হয়েছে। বিল্ডিংয়ের একদিকে প্রবেশদ্বার সহ একটি পার্কিং কমপ্লেক্সের মতো এবং অন্য দিকে প্রস্থান করার মতো পরিস্থিতির জন্য গাড়িটি যেখানে পৌঁছায় তার চেয়ে ভিন্ন স্থান থেকে ছেড়ে যাওয়ার জন্য একটি departureLocation বৈশিষ্ট্যও রয়েছে৷ এই এবং পরবর্তী গাইডগুলিতে, আগমন এবং প্রস্থান পয়েন্ট একই বলে ধরে নেওয়া হয়।

latLng এর বিকল্প হিসেবে আগমন এবং প্রস্থানের waypoint বিদ্যমান। Waypoint ক্ষেত্রগুলি LatLng এর বিকল্প হিসাবে Google Place ID ব্যবহার করে সমর্থন করে এবং গাড়ির শিরোনামও নির্দিষ্ট করতে পারে। আরো বিস্তারিত জানার জন্য রেফারেন্স ডকুমেন্টেশন ( 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 এক স্থান থেকে অন্য স্থানে ভ্রমণকারী গাড়ির প্রতিনিধিত্ব করে। গাড়ির স্টার্ট পয়েন্ট, ভিজিট লোকেশন এবং গাড়ির শেষ পয়েন্টের মধ্যে ট্রানজিশন ঘটতে পারে।

গাড়ির সম্পূর্ণ রুট পুনর্গঠন করতে ShipmentRoute এর visits এবং transitions একত্রিত করতে হবে। গাড়ির ক্রিয়াকলাপের অগ্রগতিতে ক্ষেত্রগুলির সংমিশ্রণ নিম্নলিখিতগুলির মতো দেখায়:

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

একটি ShipmentRoute সর্বদা visits চেয়ে আরও একটি transitions থাকে, কারণ গাড়িটিকে অবশ্যই তার সূচনা অবস্থান থেকে রুটের শুরুতে তার প্রথম দর্শন পর্যন্ত এবং রুটের শেষে তার শেষ অবস্থানে তার শেষ পরিদর্শন থেকে ভ্রমণ করতে হবে। গাড়িতে যদি শুরু বা শেষের অবস্থান না থাকে, তাহলে visits চেয়ে আরও একটি transitions থাকবে কারণ প্রথম বা শেষ ভিজিটের অবস্থান যথাক্রমে গাড়ির শুরু বা শেষ অবস্থান হিসাবে ব্যবহৃত হয়।

এই উদাহরণে, প্রথম তিনটি পিকআপ ভিজিটের মধ্যে শূন্য দূরত্ব এবং সময়কালের মধ্যে স্থানান্তর রয়েছে কারণ তিনটি পিকআপই অনুরোধে একই অবস্থান শেয়ার করে।

আরো বিস্তারিত জানার জন্য ShipmentRoute রেফারেন্স ডকুমেন্টেশন ( REST , gRPC ) দেখুন।

সহজ ওয়েপয়েন্ট অর্ডার অপ্টিমাইজেশান

যেমন এই উদাহরণটি দেখায়, রুট অপ্টিমাইজেশান মডেলগুলি শিপমেন্টের বৈশিষ্ট্য হিসাবে পরিদর্শন করে এবং একটি স্বাধীন সত্তা হিসাবে ওয়েপয়েন্ট বা স্টপের ধারণা নেই৷ যাইহোক, পিকআপ বা ডেলিভারি হিসাবে ঠিক একটি VisitRequest সহ শিপমেন্ট হিসাবে স্টপ বা ওয়েপয়েন্টগুলি উপস্থাপন করা সম্ভব। অপ্টিমাইজারের জন্য একটি সর্বোত্তম রুট খুঁজে বের করার জন্য গাড়িটিকে এখনও একটি costPerHour বা costPerKilometer বরাদ্দ করতে হবে (যেকোন সম্ভাব্য রুট খোঁজার বিপরীতে)।