Method: projects.locations.optimizeTours

ShipmentModel সম্বলিত একটি OptimizeToursRequest পাঠায় এবং ShipmentRoute সম্বলিত একটি OptimizeToursResponse ফেরত দেয়, যা যানবাহন দ্বারা সম্পাদিত রুটের একটি সেট যা সামগ্রিক খরচ কমিয়ে দেয়।

একটি ShipmentModel মডেলে মূলত এমন Shipment থাকে যা বহন করতে হয় এবং Vehicle যা Shipment পরিবহনের জন্য ব্যবহার করা যেতে পারে। ShipmentRoute গুলি Vehicle Shipment নির্ধারণ করে। আরও স্পষ্টভাবে বলতে গেলে, তারা প্রতিটি যানবাহনে Visit s এর একটি সিরিজ বরাদ্দ করে, যেখানে একটি Visit একটি VisitRequest এর সাথে মিলে যায়, যা একটি Shipment জন্য একটি পিকআপ বা ডেলিভারি।

লক্ষ্য হল ShipmentRoute Vehicle একটি অ্যাসাইনমেন্ট প্রদান করা যা মোট খরচ কমিয়ে আনে যেখানে ShipmentModel এ cost-এর অনেক উপাদান সংজ্ঞায়িত করা হয়েছে।

HTTP অনুরোধ

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

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)

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

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

সেকেন্ডে একটি সময়কাল যার সর্বোচ্চ নয়টি ভগ্নাংশ সংখ্যা ' s ' দিয়ে শেষ হয়। উদাহরণ: "3.5s"

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 খালি থাকলে অথবা এর vehicleIndex Shipment.allowed_vehicle_indices এ অন্তর্ভুক্ত থাকলে একটি যানবাহন অনুমোদিত।

যদি ইনজেক্ট করা সমাধানটি সম্ভব না হয়, তাহলে একটি বৈধতা ত্রুটি অগত্যা ফেরত পাঠানো হবে না এবং পরিবর্তে অসম্ভাব্যতা নির্দেশ করে একটি ত্রুটি ফেরত পাঠানো হতে পারে।

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. shipment) সত্তাকে স্বতন্ত্রভাবে চিহ্নিত করে: পূর্ববর্তী অনুরোধ যা ইনজেক্টেড সলিউশনে ব্যবহৃত OptimizeToursResponse তৈরি করেছিল এবং বর্তমান অনুরোধ যাতে ইনজেক্টেড সলিউশন অন্তর্ভুক্ত ছিল। উপরে বর্ণিত স্বতন্ত্রতা পরীক্ষাগুলি এই প্রয়োজনীয়তা নিশ্চিত করার জন্য যথেষ্ট নয়।

considerRoadTraffic

boolean

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

populatePolylines

boolean

যদি সত্য হয়, তাহলে ShipmentRoute s এর প্রতিক্রিয়ায় পলিলাইনগুলি পূরণ করা হবে।

populateTransitionPolylines

boolean

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

allowLargeDeadlineDespiteInterruptionRisk

boolean

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

useGeodesicDistances

boolean

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

label

string

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

geodesicMetersPerSecond

number

যখন useGeodesicDistances সত্য হয়, তখন এই ক্ষেত্রটি সেট করতে হবে এবং ভ্রমণের সময় গণনা করার জন্য প্রয়োগ করা গতি নির্ধারণ করতে হবে। এর মান কমপক্ষে 1.0 মিটার/সেকেন্ড হতে হবে।

maxValidationErrors

integer

ফিরে আসা বৈধতা ত্রুটির সংখ্যা ছোট করে। এই ত্রুটিগুলি সাধারণত একটি INVALID_ARGUMENT ত্রুটি পেলোডের সাথে একটি BadRequest ত্রুটি বিবরণ ( https://cloud.google.com/apis/design/errors#error_details ) হিসাবে সংযুক্ত থাকে, যদি না solvingMode=VALIDATE_ONLY: OptimizeToursResponse.validation_errors ক্ষেত্রটি দেখুন। এটি ডিফল্টভাবে 100 এবং 10,000 এ সীমাবদ্ধ।

প্রতিক্রিয়া মূল অংশ

যদি সফল হয়, তাহলে রেসপন্স বডিতে OptimizeToursResponse এর একটি উদাহরণ থাকবে।

অনুমোদনের সুযোগ

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

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

IAM অনুমতি

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

  • routeoptimization.locations.use

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