উদাহরণ: লোড চাহিদা এবং সীমা

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

একটি পূর্ণাঙ্গ ধারণাগত রূপরেখার জন্য, ‘ লোড চাহিদা ও সীমা’ মূল ধারণা সংক্রান্ত নথিটি দেখুন।

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

নিম্নলিখিত উদাহরণটি এমন একটি পরিস্থিতি তুলে ধরে যেখানে একটি নির্দিষ্ট ভারবহন ক্ষমতা সম্পন্ন যানবাহনকে ভিন্ন ভিন্ন ওজনের তিনটি চালান সরবরাহ করতে হবে।

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

  • ৫০ weightKg লোড amount shipments[0]
  • ১০ weightKg বোঝাই amount shipments[1]
  • ৮০ weightKg লোড amount shipments[2]
  • vehicles[0] যার maxLoad ভারবহন সীমা 100 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 (50 + 10 + 80 = 140) গাড়ির loadLimits (100) অতিক্রম করে, তাই গাড়িটি একবারে সমস্ত চালান তুলতে পারে না। অপ্টিমাইজার শুধুমাত্র সেই রুটগুলি বিবেচনা করে যেখানে 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] দেখায় যে প্রথম দুটি চালান (50 + 10) তোলার পরে যানবাহনটি 60 weightKg ভার বহন করছে।

metrics maxLoads প্রপার্টি থেকে দেখা যায় যে, রুটের যেকোনো পয়েন্টে বহন করা সর্বোচ্চ লোড ছিল ৮০ weightKg , যা নিশ্চিত করে যে সলিউশনটি সফলভাবে যানবাহনটির ১০০ weightKg সীমার মধ্যে ছিল।

সফট লোড সীমা

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

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

এই অনুরোধটিতে এখন তিনটি শুধুমাত্র-ডেলিভারি চালান এবং একই loadLimitssoftMaxLoad সহ দুটি যানবাহন অন্তর্ভুক্ত রয়েছে।

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

  • তিনটি চালানের সম্মিলিত 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 হলো ৯০, যা সফট লিমিটের নিচে।
  • যেহেতু কোনো যানবাহনই তার সফট লিমিট লঙ্ঘন করেনি, তাই উভয় রুটের routeCostscostPerUnitAboveSoftMax পেনাল্টি দেখানো হয়নি।