যেমন: লোড সংক্রান্ত চাহিদা ও সীমা

এই উদাহরণে দেখানো হয়েছে যে Route Optimization API অনুরোধে গাড়ির ধারণক্ষমতা সংক্রান্ত সীমাবদ্ধতা ম্যানেজ করতে কীভাবে loadDemands এবং loadLimits ব্যবহার করতে হয়।

সম্পূর্ণ ধারণাগত ওভারভিউয়ের জন্য, লোড ডিমান্ড ও সীমা সংক্রান্ত মূল ধারণা ডকুমেন্ট দেখুন।

অনুরোধের উদাহরণ

নিম্নলিখিত উদাহরণে এমন একটি পরিস্থিতি দেখানো হয়েছে যেখানে লোড সীমা সহ একটি একক গাড়িকে অবশ্যই বিভিন্ন ওজনের তিনটি শিপমেন্ট ডেলিভার করতে হবে।

এই উদাহরণ অনুরোধে নিম্নলিখিত লোড-সম্পর্কিত প্যারামিটার রয়েছে:

  • shipments[0]-এর লোড ডিমান্ড amount ৫০ weightKg।
  • shipments[1]-এর লোড ডিমান্ড amount ১০ weightKg।
  • shipments[2]-এর লোড ডিমান্ড amount ৮০ weightKg।
  • vehicles[0]-এর লোড সীমা maxLoad ১০০ weightKg।

লোড ডিমান্ড ও সীমা সহ অনুরোধের উদাহরণ দেখুন

{
  "populatePolylines": false,
  "populateTransitionPolylines": false,
  "model": {
    "globalStartTime": "2023-01-13T16:00:00Z",
    "globalEndTime": "2023-01-14T16:00:00Z",
    "shipments": [
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.789456,
              "longitude": -122.390192
            },
            "duration": "250s"
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 100.0,
        "loadDemands": {
          "weightKg": {
            "amount": "50"
          }
        }
      },
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.789116,
              "longitude": -122.395080
            },
            "duration": "250s"
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 15.0,
        "loadDemands": {
          "weightKg": {
            "amount": "10"
          }
        }
      },
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.795242,
              "longitude": -122.399347
            },
            "duration": "250s"
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 50.0,
        "loadDemands": {
          "weightKg": {
            "amount": "80"
          }
        }
      }
    ],
    "vehicles": [
      {
        "endLocation": {
          "latitude": 37.794465,
          "longitude": -122.394839
        },
        "startLocation": {
          "latitude": 37.794465,
          "longitude": -122.394839
        },
        "costPerHour": 40.0,
        "costPerKilometer": 10.0,
        "loadLimits": {
          "weightKg": {
            "maxLoad": "100"
          }
        }
      }
    ]
  }
}
    

উত্তরের উদাহরণ

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

লোড ডিমান্ড ও সীমা সহ অনুরোধের উত্তর দেখুন

{
  "routes": [
    {
      "vehicleStartTime": "2023-01-13T16:00:00Z",
      "vehicleEndTime": "2023-01-13T16:43:27Z",
      "visits": [
        {
          "isPickup": true,
          "startTime": "2023-01-13T16:00:00Z",
          "detour": "0s",
          "loadDemands": {
            "weightKg": {
              "amount": "50"
            }
          }
        },
        {
          "shipmentIndex": 1,
          "isPickup": true,
          "startTime": "2023-01-13T16:02:30Z",
          "detour": "150s",
          "loadDemands": {
            "weightKg": {
              "amount": "10"
            }
          }
        },
        {
          "startTime": "2023-01-13T16:08:55Z",
          "detour": "150s",
          "loadDemands": {
            "weightKg": {
              "amount": "-50"
            }
          }
        },
        {
          "shipmentIndex": 1,
          "startTime": "2023-01-13T16:16:37Z",
          "detour": "343s",
          "loadDemands": {
            "weightKg": {
              "amount": "-10"
            }
          }
        },
        {
          "shipmentIndex": 2,
          "isPickup": true,
          "startTime": "2023-01-13T16:27:07Z",
          "detour": "1627s",
          "loadDemands": {
            "weightKg": {
              "amount": "80"
            }
          }
        },
        {
          "shipmentIndex": 2,
          "startTime": "2023-01-13T16:36:26Z",
          "detour": "0s",
          "loadDemands": {
            "weightKg": {
              "amount": "-80"
            }
          }
        }
      ],
      "transitions": [
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2023-01-13T16:00:00Z",
          "vehicleLoads": {
            "weightKg": {}
          }
        },
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2023-01-13T16:02:30Z",
          "vehicleLoads": {
            "weightKg": {
              "amount": "50"
            }
          }
        },
        {
          "travelDuration": "235s",
          "travelDistanceMeters": 795,
          "waitDuration": "0s",
          "totalDuration": "235s",
          "startTime": "2023-01-13T16:05:00Z",
          "vehicleLoads": {
            "weightKg": {
              "amount": "60"
            }
          }
        },
        {
          "travelDuration": "212s",
          "travelDistanceMeters": 791,
          "waitDuration": "0s",
          "totalDuration": "212s",
          "startTime": "2023-01-13T16:13:05Z",
          "vehicleLoads": {
            "weightKg": {
              "amount": "10"
            }
          }
        },
        {
          "travelDuration": "380s",
          "travelDistanceMeters": 1190,
          "waitDuration": "0s",
          "totalDuration": "380s",
          "startTime": "2023-01-13T16:20:47Z",
          "vehicleLoads": {
            "weightKg": {}
          }
        },
        {
          "travelDuration": "409s",
          "travelDistanceMeters": 1371,
          "waitDuration": "0s",
          "totalDuration": "409s",
          "startTime": "2023-01-13T16:29:37Z",
          "vehicleLoads": {
            "weightKg": {
              "amount": "80"
            }
          }
        },
        {
          "travelDuration": "171s",
          "travelDistanceMeters": 665,
          "waitDuration": "0s",
          "totalDuration": "171s",
          "startTime": "2023-01-13T16:40:36Z",
          "vehicleLoads": {
            "weightKg": {}
          }
        }
      ],
      "metrics": {
        "performedShipmentCount": 3,
        "travelDuration": "1407s",
        "waitDuration": "0s",
        "delayDuration": "0s",
        "breakDuration": "0s",
        "visitDuration": "1200s",
        "totalDuration": "2607s",
        "travelDistanceMeters": 4812,
        "maxLoads": {
          "weightKg": {
            "amount": "80"
          }
        }
      },
      "routeCosts": {
        "model.vehicles.cost_per_kilometer": 48.12,
        "model.vehicles.cost_per_hour": 28.966666666666665
      },
      "routeTotalCost": 77.086666666666659
    }
  ],
  "metrics": {
    "aggregatedRouteMetrics": {
      "performedShipmentCount": 3,
      "travelDuration": "1407s",
      "waitDuration": "0s",
      "delayDuration": "0s",
      "breakDuration": "0s",
      "visitDuration": "1200s",
      "totalDuration": "2607s",
      "travelDistanceMeters": 4812,
      "maxLoads": {
        "weightKg": {
          "amount": "80"
        }
      }
    },
    "usedVehicleCount": 1,
    "earliestVehicleStartTime": "2023-01-13T16:00:00Z",
    "latestVehicleEndTime": "2023-01-13T16:43:27Z",
    "totalCost": 77.086666666666659,
    "costs": {
      "model.vehicles.cost_per_hour": 28.966666666666665,
      "model.vehicles.cost_per_kilometer": 48.12
    }
  }
}
    

তিনটি শিপমেন্টের সম্মিলিত loadDemands (৫০ + ১০ + ৮০ = ১৪০) গাড়ির loadLimits (১০০) ছাড়িয়ে গেছে, তাই গাড়িটি একবারে সব শিপমেন্ট পিক-আপ করতে পারবে না। অপ্টিমাইজার শুধুমাত্র সেইসব রুট বিবেচনা করে যেখানে shipment[0] এবং shipment[2] একই সময়ে গাড়িতে থাকে না, কারণ এই শিপমেন্টগুলি একসাথে থাকলে গাড়ির লোড সীমা অতিক্রম করে যায়।

গাড়ির লোড সীমা যাতে অতিক্রম না করে তার জন্য রুটে নিম্নলিখিত visits রয়েছে:

  1. shipment[0] পিক-আপ করা হয়েছে
  2. shipment[1] পিক-আপ করা হয়েছে
  3. shipment[0] ডেলিভার করা হয়েছে
  4. shipment[1] ডেলিভার করা হয়েছে
  5. shipment[2] পিক-আপ করা হয়েছে
  6. shipment[2] ডেলিভার করা হয়েছে

রুট জুড়ে গাড়ির লোড পরিবর্তিত হয়, যা আপনি transitions অ্যারেতে দেখতে পারবেন। যেমন, transitions[2]-এ প্রথম দুটি শিপমেন্ট (৫০ + ১০) নেওয়ার পরে ৬০ weightKg ওজনের মালপত্র পরিবহনকারী গাড়ি দেখানো হয়েছে।

metrics-এ maxLoads প্রপার্টি দেখায় যে রুটের যেকোনও পয়েন্টে সর্বাধিক ৮০ weightKg লোড বহন করা হয়েছে, যা কনফার্ম করে যে সমাধানটি গাড়ির ১০০ weightKg সীমার মধ্যেই ছিল।

সফ্ট লোড সীমা

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

অনুরোধের উদাহরণ

এই অনুরোধে এখন ডেলিভারি-অনলি তিনটি শিপমেন্ট ও দুটি গাড়ি আছে যেগুলির loadLimits ও softMaxLoad একই।

এই উদাহরণের মূল প্যারামিটারগুলি হল:

  • তিনটি শিপমেন্টে মোট loadDemands ১৪০টি weightKg (৫০
    • ৬০ + ৩০)।
  • দুটি গাড়ি উপলভ্য আছে, একটির softMaxLoad "১০০" weightKg এবং অন্যটির costPerUnitAboveSoftMax ৫.০।

সফ্ট লোড সীমা সহ অনুরোধের উদাহরণ দেখুন

{
  "populatePolylines": false,
  "populateTransitionPolylines": false,
  "model": {
    "globalStartTime": "2023-01-13T16:00:00Z",
    "globalEndTime": "2023-01-14T16:00:00Z",
    "shipments": [
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.789456,
              "longitude": -122.390192
            },
            "duration": "250s"
          }
        ],
        
        "loadDemands": {
          "weightKg": {
            "amount": "50"
          }
        }
        
      },
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.789116,
              "longitude": -122.395080
            },
            "duration": "250s"
          }
        ],
        
        "loadDemands": {
          "weightKg": {
            "amount": "60"
          }
        }
        
      },
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.795242,
              "longitude": -122.399347
            },
            "duration": "250s"
          }
        ],
        
        "loadDemands": {
          "weightKg": {
            "amount": "30"
          }
        }
        
      }
    ],
    "vehicles": [
      {
        "endLocation": {
          "latitude": 37.794465,
          "longitude": -122.394839
        },
        "startLocation": {
          "latitude": 37.794465,
          "longitude": -122.394839
        },
        "costPerHour": 40.0,
        "costPerKilometer": 10.0,
        
        "loadLimits": {
          "weightKg": {
            "maxLoad": "150",
            "softMaxLoad": "100",
            "costPerUnitAboveSoftMax": 5.0
          }
        }
        
      },
      {
        "endLocation": {
          "latitude": 37.794465,
          "longitude": -122.394839
        },
        "startLocation": {
          "latitude": 37.794465,
          "longitude": -122.394839
        },
        "costPerHour": 40.0,
        "costPerKilometer": 10.0,
        
        "loadLimits": {
          "weightKg": {
            "maxLoad": "150",
            "softMaxLoad": "100",
            "costPerUnitAboveSoftMax": 5.0
          }
        }
        
      }
    ]
  }
}
    

উত্তরের উদাহরণ

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

সফ্ট লোড লিমিট সহ অনুরোধের উত্তর দেখুন

{
  "routes": [
    {
      "vehicleStartTime": "2023-01-13T16:00:00Z",
      "vehicleEndTime": "2023-01-13T16:13:31Z",
      "visits": [
        {
          "startTime": "2023-01-13T16:03:53Z",
          "detour": "0s",
          "loadDemands": {
            "weightKg": {
              "amount": "-50"
            }
          }
        }
      ],
      "transitions": [
        {
          "travelDuration": "233s",
          "travelDistanceMeters": 794,
          "waitDuration": "0s",
          "totalDuration": "233s",
          "startTime": "2023-01-13T16:00:00Z",
          "vehicleLoads": {
            "weightKg": {
              "amount": "50"
            }
          }
        },
        {
          "travelDuration": "328s",
          "travelDistanceMeters": 1188,
          "waitDuration": "0s",
          "totalDuration": "328s",
          "startTime": "2023-01-13T16:08:03Z",
          "vehicleLoads": {
            "weightKg": {}
          }
        }
      ],
      "metrics": {
        "performedShipmentCount": 1,
        "travelDuration": "561s",
        "visitDuration": "250s",
        "totalDuration": "811s",
        "travelDistanceMeters": 1982,
        "maxLoads": {
          "weightKg": {
            "amount": "50"
          }
        }
      },
      "routeCosts": {
        "model.vehicles.cost_per_kilometer": 19.82,
        "model.vehicles.cost_per_hour": 9.01
      },
      "routeTotalCost": 28.83
    },
    {
      "vehicleIndex": 1,
      "vehicleStartTime": "2023-01-13T16:00:00Z",
      "vehicleEndTime": "2023-01-13T16:21:43Z",
      "visits": [
        {
          "shipmentIndex": 1,
          "startTime": "2023-01-13T16:05:54Z",
          "detour": "0s",
          "loadDemands": {
            "weightKg": {
              "amount": "-60"
            }
          }
        },
        {
          "shipmentIndex": 2,
          "startTime": "2023-01-13T16:13:52Z",
          "detour": "473s",
          "loadDemands": {
            "weightKg": {
              "amount": "-30"
            }
          }
        }
      ],
      "transitions": [
        {
          "travelDuration": "354s",
          "travelDistanceMeters": 1196,
          "waitDuration": "0s",
          "totalDuration": "354s",
          "startTime": "2023-01-13T16:00:00Z",
          "vehicleLoads": {
            "weightKg": {
              "amount": "90"
            }
          }
        },
        {
          "travelDuration": "228s",
          "travelDistanceMeters": 808,
          "waitDuration": "0s",
          "totalDuration": "228s",
          "startTime": "2023-01-13T16:10:04Z",
          "vehicleLoads": {
            "weightKg": {
              "amount": "30"
            }
          }
        },
        {
          "travelDuration": "221s",
          "travelDistanceMeters": 655,
          "waitDuration": "0s",
          "totalDuration": "221s",
          "startTime": "2023-01-13T16:18:02Z",
          "vehicleLoads": {
            "weightKg": {}
          }
        }
      ],
      "metrics": {
        "performedShipmentCount": 2,
        "travelDuration": "803s",
        "visitDuration": "500s",
        "totalDuration": "1303s",
        "travelDistanceMeters": 2659,
        "maxLoads": {
          "weightKg": {
            "amount": "90"
          }
        }
      },
      "routeCosts": {
        "model.vehicles.cost_per_kilometer": 26.59,
        "model.vehicles.cost_per_hour": 14.48
      },
      "routeTotalCost": 41.07
    }
  ],
  "metrics": {
    "aggregatedRouteMetrics": {
      "performedShipmentCount": 3,
      "travelDuration": "1364s",
      "visitDuration": "750s",
      "totalDuration": "2114s",
      "travelDistanceMeters": 4641,
      "maxLoads": {
        "weightKg": {
          "amount": "90"
        }
      }
    },
    "usedVehicleCount": 2,
    "earliestVehicleStartTime": "2023-01-13T16:00:00Z",
    "latestVehicleEndTime": "2023-01-13T16:21:43Z",
    "totalCost": 69.90,
    "costs": {
      "model.vehicles.cost_per_kilometer": 46.41,
      "model.vehicles.cost_per_hour": 23.49
    }
  }
}
    

নিচের ফিল্ডে দেখানো হয়েছে যে কীভাবে অপ্টিমাইজার দুটি গাড়িতে শিপমেন্ট ভাগ করেছে যাতে লোড ১০০ weightKg সফট লিমিটের মধ্যে থাকে।

  • প্রথম রুট (vehicleIndex: 0) ৫০টি weightKg শিপমেন্ট ম্যানেজ করে। এটির maxLoads হল "৫০", যা সফট লিমিটের নিচে।
  • দ্বিতীয় রুট (vehicleIndex: ১) ৬০ ও ৩০ weightKg শিপমেন্ট ম্যানেজ করে। এটির maxLoads হল "৯০", যা সফট লিমিটের নিচে।
  • যেহেতু কোনও গাড়িই তার সফট লিমিট লঙ্ঘন করে না, তাই দুটি রুটের জন্যই routeCosts কোনও costPerUnitAboveSoftMax পেনাল্টি দেখায় না।