উত্তর ব্যাখ্যা করো

ইউরোপীয় অর্থনৈতিক অঞ্চল (EEA)-এর ডেভেলপার

Route Optimization API সংশ্লিষ্ট অনুরোধে থাকা গাড়ির জন্য রুট রিটার্ন করে। শিপমেন্ট, গাড়ির সাথে অ্যাসাইন করা হয় বা অনুরোধের প্রপার্টির উপর নির্ভর করে এড়িয়ে যাওয়া হতে পারে।

একটি OptimizeToursResponse মেসেজে (REST, gRPC) দুটি প্রধান টপ-লেভেল প্রপার্টি থাকে:

  • routes[] হল প্রতিটি গাড়ির জন্য অ্যাসাইন করা শিপমেন্ট সহ রুট। প্রতিটি Route-এ মেট্রিক থাকে যা সেই নির্দিষ্ট রুটের বৈশিষ্ট্য দেখায়।
  • metrics হল সমগ্র উত্তরের জন্য একত্রিত মেট্রিক, যা সব গাড়ি ও রুট প্ল্যান জুড়ে থাকে। টপ-লেভেল মেট্রিক, পার-রুট মেট্রিকের মতো একই প্রপার্টি ধারণ করে, যার মান সব রুট জুড়ে একত্রিত করা হয়।

অপ্টিমাইজেশনের ফলাফলের উপর নির্ভর করে কিছু প্রপার্টি সবসময় পপুলেট নাও হতে পারে:

  1. skippedShipments[] এমন শিপমেন্ট তালিকাভুক্ত করে যা কোনও ভেইকেল দ্বারা পারফর্ম করা হয় না। কোনও শিপমেন্ট নির্দিষ্ট সীমাবদ্ধতার মধ্যে করা না গেলে বা শিপমেন্ট করার খরচ তার পেনাল্টি খরচের চেয়ে বেশি হলে সেটি এড়ানো যেতে পারে। যেমন, কোনও শিপমেন্টের পিক-আপ বা ডেলিভারির জন্য খুব কম সময় timeWindow থাকলে, নির্ধারিত সময়সীমার মধ্যে কোনও গাড়ির পক্ষে সেখানে যাওয়া সম্ভব নাও হতে পারে অথবা সেটি খরচ সাপেক্ষ হতে পারে।
  2. validationErrors[] এমন সমস্যা নির্দিষ্ট করে যা অনুরোধটিকে ভুল করে দেয় অথবা অনুরোধের solvingMode VALIDATE_ONLY হিসেবে সেট করা থাকলে সমাধান করা অসম্ভব। সাধারণ DEFAULT_SOLVE মোডে, যাচাইকরণ সংক্রান্ত সমস্যাগুলি উত্তর বডির পরিবর্তে একটি সমস্যার মেসেজে দেখানো হবে। মনে রাখবেন যে VALIDATE_ONLY সমাধানকারী মোড একসাথে একাধিক সমস্যার কথা জানাতে পারে, যা দ্রুত অনুরোধ ডিবাগ করার জন্য উপযোগী।

রুটের প্রপার্টি

প্রতিটি routes[] এন্ট্রি হল একটি ShipmentRoute মেসেজ (REST, gRPC)। প্রতিটি ShipmentRoute অনুরোধ থেকে কোনও নির্দিষ্ট গাড়ির জন্য রুট অ্যাসাইনমেন্ট দেখায়। গুরুত্বপূর্ণ ShipmentRoute প্রপার্টি যা এর সংশ্লিষ্ট Vehicle অন্তর্ভুক্ত:

  • vehicleIndex হল সংশ্লিষ্ট অনুরোধ মেসেজে Vehicle-এর জিরো-বেসড ইন্ডেক্স। ভ্যালু শূন্য হলে REST উত্তর এই প্রপার্টি বাদ দেয়।
  • vehicleStartTime হল সেই সময় যখন গাড়িটিকে অবশ্যই তার রুট শুরু করতে হবে।
  • vehicleEndTime হল সেই সময় যখন গাড়িটি তার রুট সম্পূর্ণ করবে বলে আশা করা হচ্ছে।

উত্তরে, routes এমন দেখতে হবে:

{
  "routes": [
    {
      "vehicleStartTime": "2024-02-13T00:00:00Z",
      "vehicleEndTime": "2024-02-13T00:38:42Z",
      "visits": [
        ...
      ],
      "transitions": [
        ...
      ],
      "metrics": {
        ...
      },
      ...
    }
  ],
  ...
}

প্রতিটি ShipmentRoute-এ visits-এর একটি অর্ডার করা তালিকা অন্তর্ভুক্ত থাকে যা গাড়িটি সম্পূর্ণ করবে। প্রতিটি Visit (REST, gRPC) সংশ্লিষ্ট অনুরোধ থেকে VisitRequest (REST, gRPC) দেখায়। গুরুত্বপূর্ণ Visit প্রপার্টির মধ্যে এগুলি অন্তর্ভুক্ত:

  • shipmentIndex হল সংশ্লিষ্ট অনুরোধে এই ভিজিট যে শিপমেন্টের সাথে সম্পর্কিত তার জিরো-বেসড ইন্ডেক্স।
  • ভিজিটটি পিক-আপ হলে isPickup-এর মান 'true' হয় এবং ভিজিটটি ডেলিভারি হলে -এর মান 'false' হয়। ভ্যালু false হলে REST উত্তর এই প্রপার্টি বাদ দেয়।
  • visitRequestIndex হল VisitRequest-এর শূন্য-ভিত্তিক ইনডেক্স যা Shipment.pickups বা Shipment.deliveries থেকে সংশ্লিষ্ট অনুরোধে Visit দ্বারা উপস্থাপিত হয়। ভ্যালু শূন্য হলে REST উত্তর এই প্রপার্টি বাদ দেয়।
  • startTime হল সেই সময় যখন ভিজিট শুরু হবে বলে আশা করা হচ্ছে।
  • loadDemands ম্যাপ লোড করার ধরন থেকে Visit সম্পূর্ণ করার জন্য প্রয়োজনীয় পরিমাণ লোড করুন। ডেলিভারি ভিজিটের জন্য লোডের পরিমাণ নেগেটিভ হয়, এর অর্থ হল গাড়ি থেকে লোড সরিয়ে দেওয়া হচ্ছে।

Visit-এর একটি উদাহরণ:

{
  "routes": [
    {
      ...
      "visits": [
        {
          "isPickup": true,
          "startTime": "2024-02-13T00:00:00Z",
          "detour": "0s"
        },
        ...
      ],
    },
    ...
  ],
  ...
}

প্রতিটি ShipmentRoute-এ transitions-এর একটি সাজানো তালিকা থাকে যা নির্দিষ্ট কোনও গাড়ির ক্ষেত্রে visits-এর মধ্যে ভ্রমণকে বোঝায়। গুরুত্বপূর্ণ Transition মেসেজ (REST, gRPC) প্রপার্টির মধ্যে এগুলি অন্তর্ভুক্ত:

  • startTime হল সেই সময় যখন গাড়িটি ট্রানজিশন পারফর্ম করা শুরু করবে।
  • travelDuration হল সেই সময়সীমা যার মধ্যে ট্রানজিশন সম্পূর্ণ করার জন্য গাড়িটিকে অবশ্যই চলতে হবে।
  • travelDistanceMeters হল সেই দূরত্ব যা ট্রানজিশন সম্পূর্ণ করার জন্য গাড়িটিকে অবশ্যই অতিক্রম করতে হবে।
  • trafficInfoUnavailable থেকে বোঝা যায় যে ট্রানজিশনের জন্য ট্রাফিক ডেটা উপলভ্য আছে কিনা।
  • waitDuration হল সেই সময় যখন গাড়িটি পরবর্তী Visit শুরু করার আগে অপেক্ষা করে। নিম্নলিখিত Visit-এর start_time-এর কারণে এটি হতে পারে:
  • totalDuration হল ট্রানজিশনের মোট সময়সীমা, যার মধ্যে ভ্রমণ, অপেক্ষা, বিরতি ও বিলম্বের সময় অন্তর্ভুক্ত।
  • এই ট্রানজিশনের সময় ভেইকেল দ্বারা বহন করা লোডের পরিমাণ লোড করার জন্য vehicleLoads ম্যাপ লোডের ধরন।

Transition-এর উদাহরণ হল:

{
  "routes": [
    {
      ...
      "transitions": [
        ...
        {
          "travelDuration": "1171s",
          "travelDistanceMeters": 9004,
          "waitDuration": "0s",
          "totalDuration": "1171s",
          "startTime": "2024-02-13T00:00:00Z"
        },
        ...
      ],
      ...
    }
  ],
  ...
}

vists ও transitions-এর মধ্যে সম্পর্ক সম্পর্কে আরও জানতে, দেখুন পিক-আপ ও ডেলিভারি স্টপ অর্ডার অপ্টিমাইজেশন এবং ShipmentRoute রেফারেন্স ডকুমেন্টেশন (REST, gRPC)। Transition মেসেজের routePolyline এবং routeToken প্রপার্টি সম্পর্কে আরও তথ্যের জন্য, ট্রানজিশন পলিলাইন এবং রুট টোকেন দেখুন।

মেট্রিক প্রপার্টি

Metrics মেসেজ (REST, gRPC) সম্পূর্ণ সমাধানের সারসংক্ষেপ দেয়। কিছু গুরুত্বপূর্ণ Metrics প্রপার্টিতে এগুলি অন্তর্ভুক্ত:

  • totalCost হল রুট সম্পূর্ণ করার জন্য হওয়া মোট খরচ। খরচ মডেল প্যারামিটার থেকে খরচ সম্পর্কে আরও জানুন।
  • usedVehicleCount হল সমাধানে ব্যবহৃত মোট গাড়ির সংখ্যা। অপ্টিমাইজার যদি নির্ধারণ করে যে কোনও গাড়ির ব্যবহার অপ্রয়োজনীয়, তাহলে সেই গাড়ির রুট খালি থাকতে পারে।
  • skippedMandatoryShipmentCount হল বাদ দেওয়া শিপমেন্টের সংখ্যা যা "বাধ্যতামূলক"। একটি বাধ্যতামূলক শিপমেন্টে penaltyCost উল্লেখ করা নেই, যা শিপমেন্ট এড়িয়ে গেলে খরচ হয়। নির্দিষ্ট সীমাবদ্ধতার মধ্যে পারফর্ম্যান্স উপযুক্ত না হলে, বাধ্যতামূলক শিপমেন্ট এখনও এড়িয়ে যাওয়া যেতে পারে। খরচ মডেল প্যারামিটার থেকে খরচ সম্পর্কে আরও জানুন।

অতিরিক্ত মেট্রিক AggregatedMetrics মেসেজ (REST, gRPC) হিসেবে রিপোর্ট করা হয়। AggregatedMetrics মেসেজের ধরনটি Metrics.aggregatedRouteMetrics প্রপার্টির জন্য এবং ShipmentRoute.metrics প্রপার্টির জন্য ব্যবহার করা হয় Metrics.aggregatedRouteMetrics-এ OptimizeToursResponse-এর মধ্যে থাকা সব ShipmentRoute জুড়ে একত্রিত করা মেট্রিক থাকে। প্রতিটি ShipmentRoute.metrics প্রপার্টিতে সেই নির্দিষ্ট ShipmentRoute-এর জন্য মেট্রিক থাকে।

গুরুত্বপূর্ণ AggregatedMetrics প্রপার্টির মধ্যে এগুলি অন্তর্ভুক্ত:

  • performedShipmentCount হল যানবাহনের মাধ্যমে করা শিপমেন্টের সংখ্যা সেগুলির সম্পূর্ণ রুট জুড়ে।
  • travelDuration হল রুট সম্পূর্ণ করার সময় ট্রানজিটে থাকা গাড়ির মোট সময়।
  • waitDuration হল সেই মোট সময় যা গাড়িগুলি তাদের রুট সম্পূর্ণ করার সময় অপেক্ষা করে কাটায়।
  • delayDuration হল গাড়ির মোট বিলম্বের সময়। TransitionAttributes ব্যবহার না করা হলে, সাধারণত এর মান শূন্য হয়।
  • breakDuration হল রুট সম্পূর্ণ করার সময় গাড়িগুলি বিরতিতে মোট যত সময় ব্যয় করে।
  • visitDuration হল রুট সম্পূর্ণ করার সময় ভিজিট করার জন্য গাড়িগুলি মোট যে সময় ব্যয় করে। এটি হল প্রযোজ্য গাড়িতে অ্যাসাইন করা Visits-এর সাথে সম্পর্কিত VisitRequests-এর VisitRequest.duration ভ্যালুর যোগফল।
  • totalDuration হল গাড়ির রুট সম্পূর্ণ করার জন্য প্রয়োজনীয় মোট সময়সীমা।
  • travelDistanceMeters হল রুট সম্পূর্ণ করার সময় গাড়ির মাধ্যমে ভ্রমণ করা মোট দূরত্ব।
  • maxLoads ম্যাপ, রুটের যেকোনও পয়েন্টে গাড়ির মাধ্যমে বহন করা সর্বাধিক লোডের পরিমাণ অনুযায়ী লোডের ধরন দেখায়।

Metrics মেসেজের একটি উদাহরণ:

{
  "routes": [
    ...
  ],
  "metrics": {
    "aggregatedRouteMetrics": {
      "performedShipmentCount": 1,
      "travelDuration": "2322s",
      "waitDuration": "0s",
      "delayDuration": "0s",
      "breakDuration": "0s",
      "visitDuration": "0s",
      "totalDuration": "2322s",
      "travelDistanceMeters": 18603
    },
    "usedVehicleCount": 1,
    "earliestVehicleStartTime": "2024-02-13T00:00:00Z",
    "latestVehicleEndTime": "2024-02-13T00:38:42Z",
    "totalCost": 18.603,
    "costs": {
      "model.vehicles.cost_per_kilometer": 18.603
    }
  }
}

সম্পূর্ণ উদাহরণ

অনুরোধ তৈরি করুন থেকে পাওয়া অনুরোধের জন্য সম্পূর্ণ উত্তরের নমুনাটি এইরকম:

{
  "routes": [
    {
      "vehicleStartTime": "2024-02-13T00:00:00Z",
      "vehicleEndTime": "2024-02-13T00:38:42Z",
      "visits": [
        {
          "isPickup": true,
          "startTime": "2024-02-13T00:00:00Z",
          "detour": "0s"
        },
        {
          "startTime": "2024-02-13T00:19:31Z",
          "detour": "0s"
        }
      ],
      "transitions": [
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2024-02-13T00:00:00Z"
        },
        {
          "travelDuration": "1171s",
          "travelDistanceMeters": 9004,
          "waitDuration": "0s",
          "totalDuration": "1171s",
          "startTime": "2024-02-13T00:00:00Z"
        },
        {
          "travelDuration": "1151s",
          "travelDistanceMeters": 9599,
          "waitDuration": "0s",
          "totalDuration": "1151s",
          "startTime": "2024-02-13T00:19:31Z"
        }
      ],
      "metrics": {
        "performedShipmentCount": 1,
        "travelDuration": "2322s",
        "waitDuration": "0s",
        "delayDuration": "0s",
        "breakDuration": "0s",
        "visitDuration": "0s",
        "totalDuration": "2322s",
        "travelDistanceMeters": 18603
      },
      "routeCosts": {
        "model.vehicles.cost_per_kilometer": 18.603
      },
      "routeTotalCost": 18.603
    }
  ],
  "metrics": {
    "aggregatedRouteMetrics": {
      "performedShipmentCount": 1,
      "travelDuration": "2322s",
      "waitDuration": "0s",
      "delayDuration": "0s",
      "breakDuration": "0s",
      "visitDuration": "0s",
      "totalDuration": "2322s",
      "travelDistanceMeters": 18603
    },
    "usedVehicleCount": 1,
    "earliestVehicleStartTime": "2024-02-13T00:00:00Z",
    "latestVehicleEndTime": "2024-02-13T00:38:42Z",
    "totalCost": 18.603,
    "costs": {
      "model.vehicles.cost_per_kilometer": 18.603
    }
  }
}