Method: projects.optimizeToursLongRunning

এটি projects.optimizeTours পদ্ধতির একটি ভেরিয়েন্ট যা বড় টাইমআউট ভ্যালুর সাথে অপ্টিমাইজেশনের জন্য ডিজাইন করা হয়েছে। অপ্টিমাইজেশনের জন্য projects.optimizeTours পদ্ধতির চেয়ে এটি বেশি পছন্দ করা উচিত, কারণ এতে কয়েক মিনিটের বেশি সময় লাগে।

ফেরত আসা long-running operation (LRO)-এর নাম <parent>/operations/<operation_id> ফর্ম্যাটে থাকবে এবং কম্পিউটেশনের প্রগ্রেস ট্র্যাক করতে ব্যবহার করা যাবে। metadata ফিল্ডের ধরন হল OptimizeToursLongRunningMetadata। সফল হলে, response ফিল্ডের ধরন হল OptimizeToursResponse।

HTTP অনুরোধ

POST https://routeoptimization.googleapis.com/v1/{parent=projects/*}:optimizeToursLongRunning

URL-এ gRPC ট্রান্সকোডিং সিনট্যাক্স ব্যবহার করা হয়।

পাথ প্যারামিটার

প্যারামিটারগুলি
parent

string

প্রয়োজনীয়। কল করার জন্য টার্গেট প্রোজেক্ট বা লোকেশন।

ফর্ম্যাট:

  • projects/{project-id}
  • projects/{project-id}/locations/-

আঞ্চলিক {location-id} ভ্যালু কাজ করে না।

অনুরোধের বডি

অনুরোধের প্রধান অংশে নিম্নলিখিত স্ট্রাকচার সহ ডেটা থাকে:

JSON উপস্থাপনা
{
  "timeout": string,
  "model": {
    object (ShipmentModel)
  },
  "solvingMode": enum (SolvingMode),
  "searchMode": enum (SearchMode),
  "injectedFirstSolutionRoutes": [
    {
      object (ShipmentRoute)
    }
  ],
  "injectedSolutionConstraint": {
    object (InjectedSolutionConstraint)
  },
  "refreshDetailsRoutes": [
    {
      object (ShipmentRoute)
    }
  ],
  "interpretInjectedSolutionsUsingLabels": boolean,
  "considerRoadTraffic": boolean,
  "populatePolylines": boolean,
  "populateTransitionPolylines": boolean,
  "allowLargeDeadlineDespiteInterruptionRisk": boolean,
  "useGeodesicDistances": boolean,
  "label": string,
  "geodesicMetersPerSecond": number,
  "maxValidationErrors": integer
}
ফিল্ড
timeout

string (Duration format)

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

অ্যাসিঙ্ক্রোনাস অনুরোধের জন্য, টাইমআউট শেষ হওয়ার আগে সার্ভার একটি সমাধান তৈরি করবে (যদি সম্ভব হয়)।

model

object (ShipmentModel)

সমাধান করার জন্য শিপমেন্ট মডেল।

solvingMode

enum (SolvingMode)

ডিফল্ট হিসেবে, সমাধান করার মোড হল DEFAULT_SOLVE (0)।

searchMode

enum (SearchMode)

অনুরোধের সমাধান করতে সার্চ মোড ব্যবহার করা হয়েছে।

injectedFirstSolutionRoutes[]

object (ShipmentRoute)

অপ্টিমাইজেশন অ্যালগরিদমকে প্রথম সমাধান খুঁজতে সাহায্য করুন যা আগের সমাধানের মতো।

প্রথম সমাধান তৈরি করার সময় মডেলটি সীমাবদ্ধ করা হয়। কোনও রুটে কোনও শিপমেন্ট না করা হলে, প্রথম সমাধানে তা বাদ দেওয়া হয়, তবে পরবর্তী সমাধানে তা করা হতে পারে।

সমাধানটি অবশ্যই কিছু মৌলিক বৈধতার অনুমান পূরণ করতে হবে:

  • সব রুটের জন্য, vehicleIndex রেঞ্জের মধ্যে থাকতে হবে এবং ডুপ্লিকেট করা যাবে না।
  • সব ভিজিটের জন্য, shipmentIndex এবং visitRequestIndex অবশ্যই রেঞ্জের মধ্যে থাকতে হবে।
  • একটি শিপমেন্ট শুধুমাত্র একটি রুটে রেফারেন্স করা যেতে পারে।
  • পিক-আপ-ডেলিভারি শিপমেন্টের পিক-আপ ডেলিভারির আগে করতে হবে।
  • কোনও শিপমেন্টের জন্য পিক-আপ বা ডেলিভারির বিকল্প একবারের বেশি ব্যবহার করা যাবে না।
  • সব রুটের জন্য, সময় বাড়ছে (যেমন, vehicleStartTime <= visits[0].start_time <= visits[1].start_time ... <= vehicleEndTime)।
  • শুধুমাত্র অনুমোদিত গাড়িতেই শিপমেন্ট করা যাবে। Shipment.allowed_vehicle_indices খালি থাকলে অথবা Shipment.allowed_vehicle_indices-এ vehicleIndex অন্তর্ভুক্ত থাকলে, কোনও গাড়ির অনুমতি দেওয়া হয়।

ইনজেক্ট করা সমাধানটি সম্ভব না হলে, একটি যাচাইকরণ ত্রুটি ফেরত দেওয়া হয় না এবং এর পরিবর্তে একটি ত্রুটি যা নির্দেশ করে যে এটি সম্ভব নয় তা ফেরত দেওয়া হতে পারে।

injectedSolutionConstraint

object (InjectedSolutionConstraint)

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

ইনজেক্ট করা সমাধানটি সম্ভব না হলে, একটি যাচাইকরণ ত্রুটি ফেরত দেওয়া হয় না এবং এর পরিবর্তে একটি ত্রুটি যা নির্দেশ করে যে এটি সম্ভব নয় তা ফেরত দেওয়া হতে পারে।

refreshDetailsRoutes[]

object (ShipmentRoute)

খালি না থাকলে, প্রদত্ত রুটগুলি রিফ্রেশ করা হবে, তাদের অন্তর্নিহিত ভিজিট বা ভ্রমণের সময়ের ক্রম পরিবর্তন না করে: শুধুমাত্র অন্যান্য বিবরণ আপডেট করা হবে। এটি মডেলের সমাধান করে না।

২০২০/১১ থেকে, এটি শুধুমাত্র খালি নয় এমন রুটের পলিলাইন পপুলেট করে এবং এর জন্য populatePolylines সত্য হতে হবে।

পাস-ইন রুটের routePolyline ফিল্ড transitions রুটের সাথে সামঞ্জস্যপূর্ণ নাও হতে পারে।

এই ফিল্ডটি injectedFirstSolutionRoutes বা injectedSolutionConstraint-এর সাথে ব্যবহার করা যাবে না।

Shipment.ignore এবং Vehicle.ignore-এর আচরণে কোনও প্রভাব নেই। সম্পর্কিত শিপমেন্ট বা গাড়ি উপেক্ষা করা হয়েছে কিনা তা নির্বিশেষে সমস্ত খালি নয় এমন রুটে সমস্ত ভিজিটের মধ্যে পলিলাইনগুলি এখনও পপুলেট করা হয়।

interpretInjectedSolutionsUsingLabels

boolean

সত্য হলে:

  • ইনজেক্ট করা সমাধানে রুট এবং অনুরোধে থাকা গাড়ির মধ্যে মিল খুঁজতে vehicleIndex-এর পরিবর্তে ShipmentRoute.vehicle_label ব্যবহার করে; খালি না থাকলে ConstraintRelaxation.vehicle_indices আপডেট করতে আসল ShipmentRoute.vehicle_index থেকে নতুন ShipmentRoute.vehicle_index-এর ম্যাপিং আবার ব্যবহার করে, তবে ম্যাপিং অবশ্যই দ্ব্যর্থহীন হতে হবে (অর্থাৎ, একাধিক ShipmentRoute-এর একই আসল vehicleIndex শেয়ার করলে চলবে না)।
  • ইনজেক্ট করা সমাধানে ভিজিট এবং অনুরোধে শিপমেন্টের মধ্যে মিল খুঁজতে shipmentIndex-এর পরিবর্তে ShipmentRoute.Visit.shipment_label ব্যবহার করে;
  • ইনজেক্ট করা সমাধানে স্কিপ করা শিপমেন্টের সাথে অনুরোধ করা শিপমেন্টের মিল করতে SkippedShipment.index-এর পরিবর্তে SkippedShipment.label ব্যবহার করে।

এই ব্যাখ্যা injectedFirstSolutionRoutes, injectedSolutionConstraint ও refreshDetailsRoutes ফিল্ডের ক্ষেত্রে প্রযোজ্য। সমাধান তৈরি করার পর থেকে অনুরোধে শিপমেন্ট বা গাড়ির সূচক পরিবর্তিত হলে এটি ব্যবহার করা যেতে পারে, সম্ভবত শিপমেন্ট বা গাড়ি অনুরোধ থেকে সরানো বা যোগ করা হয়েছে বলে।

সত্য হলে, নিম্নলিখিত বিভাগের লেবেলগুলি তাদের বিভাগে সর্বাধিক একবার দেখাতে হবে:

ইনজেক্ট করা সমাধানে কোনও vehicleLabel যদি অনুরোধ করা গাড়ির সাথে সামঞ্জস্যপূর্ণ না হয়, তাহলে সংশ্লিষ্ট রুটটি তার ভিজিটের সাথে সমাধান থেকে সরিয়ে দেওয়া হয়। ইনজেক্ট করা সমাধানে কোনও shipmentLabel যদি শিপমেন্টের অনুরোধের সাথে সম্পর্কিত না হয়, তাহলে সংশ্লিষ্ট ভিজিটটি সমাধান থেকে সরিয়ে দেওয়া হয়। ইনজেক্ট করা সমাধানে কোনও SkippedShipment.label যদি শিপমেন্টের অনুরোধের সাথে সম্পর্কিত না হয়, তাহলে সমাধান থেকে SkippedShipment সরিয়ে দেওয়া হয়।

ইনজেক্ট করা সমাধান থেকে রুট ভিজিট বা সম্পূর্ণ রুট সরিয়ে দিলে তা অন্তর্নিহিত সীমাবদ্ধতার উপর প্রভাব ফেলতে পারে, যার ফলে সমাধানে পরিবর্তন, যাচাইকরণে ত্রুটি বা অসম্ভবতা দেখা দিতে পারে।

মনে রাখবেন: কলকারীকে নিশ্চিত করতে হবে যে প্রতিটি Vehicle.label (resp. Shipment.label) দুটি প্রাসঙ্গিক অনুরোধ জুড়ে ব্যবহৃত একটি গাড়ি (resp. শিপমেন্ট) এন্টিটি অনন্যভাবে শনাক্ত করে: আগের অনুরোধ যা ইনজেক্ট করা সমাধানে ব্যবহৃত OptimizeToursResponse তৈরি করেছে এবং বর্তমান অনুরোধ যাতে ইনজেক্ট করা সমাধান অন্তর্ভুক্ত রয়েছে। উপরে বর্ণিত অনন্যতা চেক এই প্রয়োজনীয়তার গ্যারান্টি দেওয়ার জন্য যথেষ্ট নয়।

considerRoadTraffic

boolean

ShipmentRoute ফিল্ড Transition.travel_duration, Visit.start_time ও vehicleEndTime গণনা করার সময়; ShipmentRoute.has_traffic_infeasibilities ফিল্ড সেট করার সময় এবং OptimizeToursResponse.total_cost ফিল্ড গণনা করার সময় ট্রাফিক অনুমান করার বিষয়টি বিবেচনা করুন।

populatePolylines

boolean

সত্য হলে, উত্তরে পলিলাইন পপুলেট করা হবে ShipmentRoutes.

populateTransitionPolylines

boolean

সত্য হলে, পলিলাইন এবং রুট টোকেন ShipmentRoute.transitions উত্তরে পপুলেট করা হবে।

allowLargeDeadlineDespiteInterruptionRisk

boolean

এটি সেট করা থাকলে, অনুরোধের একটি সময়সীমা (https://grpc.io/blog/deadlines দেখুন) থাকতে পারে যা সর্বাধিক ৬০ মিনিট পর্যন্ত হতে পারে। অন্যথায়, সর্বাধিক সময়সীমা হল মাত্র ৩০ মিনিট। মনে রাখবেন, দীর্ঘ সময় ধরে চলা অনুরোধে বাধা পাওয়ার ঝুঁকি অনেক বেশি (তবে এখনও কম)।

useGeodesicDistances

boolean

সত্য হলে, Google Maps দূরত্বের পরিবর্তে জিওডেসিক দূরত্ব ব্যবহার করে ভ্রমণের দূরত্ব গণনা করা হবে এবং geodesicMetersPerSecond দ্বারা নির্ধারিত গতি সহ জিওডেসিক দূরত্ব ব্যবহার করে ভ্রমণের সময় গণনা করা হবে।

label

string

এই অনুরোধ শনাক্ত করার জন্য লেবেল ব্যবহার করা হতে পারে, OptimizeToursResponse.request_label-এ রিপোর্ট করা হয়েছে।

geodesicMetersPerSecond

number

useGeodesicDistances সত্য হলে, এই ফিল্ডটি অবশ্যই সেট করতে হবে এবং ভ্রমণের সময় গণনা করার জন্য প্রযোজ্য গতি নির্ধারণ করতে হবে। এর মান কমপক্ষে ১.০ মিটার/সেকেন্ড হতে হবে।

maxValidationErrors

integer

ফেরত আসা যাচাইকরণ সংক্রান্ত সমস্যার সংখ্যা ট্রাঙ্কেট করে। এইসব সমস্যা সাধারণত INVALID_ARGUMENT সমস্যা পেলোডের সাথে BadRequest সমস্যার বিবরণ (https://cloud.google.com/apis/design/errors#error_details) হিসেবে অ্যাটাচ করা থাকে, যদি না solvingMode=VALIDATE_ONLY হয়: OptimizeToursResponse.validation_errors ফিল্ড দেখুন। এটি ডিফল্ট হিসেবে ১০০ এবং সর্বোচ্চ ১০,০০০ পর্যন্ত হতে পারে।

প্রতিক্রিয়ার বডি

সফল হলে, প্রতিক্রিয়ার বডিতে একটি Operation-এর ইন্সট্যান্স থাকে।

অনুমোদনের স্কোপ

এটির জন্য নিম্নলিখিত OAuth স্কোপ প্রয়োজন:

  • https://www.googleapis.com/auth/cloud-platform

IAM সংক্রান্ত অনুমতি

parent রিসোর্সে নিম্নলিখিত IAM অনুমতি প্রয়োজন:

  • routeoptimization.operations.create

আরও তথ্যের জন্য, IAM ডকুমেন্টেশন দেখুন।