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

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

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

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

নিম্নলিখিত উদাহরণটি এমন একটি দৃশ্যপট প্রদর্শন করে যেখানে একটি একক যানবাহনকে একটি লোড সীমা সহ বিভিন্ন ওজনের তিনটি চালান সরবরাহ করতে হবে।

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

  • ৫০ weightKg লোড চাহিদার amount সহ shipments[0]
  • ১০ weightKg লোড চাহিদার amount সহ shipments[1]
  • 80 weightKg লোড চাহিদার amount সহ shipments[2]
  • 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] দেখায় যে গাড়িটি প্রথম দুটি চালান (50 + 10) তোলার পরে 60 weightKg লোড বহন করছে।

metrics maxLoads বৈশিষ্ট্য দেখায় যে রুটের যেকোনো স্থানে সর্বোচ্চ লোড বহন করা হয়েছিল 80 weightKg , যা নিশ্চিত করে যে সমাধানটি সফলভাবে গাড়ির 100 weightKg সীমার মধ্যে রয়ে গেছে।

নরম লোড সীমা

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

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

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

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

  • তিনটি চালানের সম্মিলিত loadDemands চাহিদা ১৪০ weightKg (৫০)।
    • ৬০ + ৩০)।
  • "১০০" weightKg softMaxLoad এবং ৫.০ এর 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
    }
  }
}
    

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

  • প্রথম রুট ( vehicleIndex : 0) ৫০ weightKg চালান পরিচালনা করে। এর maxLoads হল "৫০", যা সফট লিমিটের নিচে।
  • দ্বিতীয় রুট ( vehicleIndex : 1) 60 এবং 30 weightKg চালান পরিচালনা করে। এর maxLoads হল "90", যা সফট লিমিটেরও নিচে।
  • যেহেতু কোনও যানবাহনই তার সফট লিমিট লঙ্ঘন করে না, তাই উভয় রুটের routeCosts কোনও costPerUnitAboveSoftMax নেইPerUnitAboveSoftMax জরিমানা।