القيود المفروضة على فترة الاستلام والتسليم

يطبَّق OptimizeToursRequest قيودًا على ما يلي:

  • الشحنات التي تؤثّر في طريقة تنفيذ الشحنات
  • المركبات التي تؤثر في طريقة حساب مسارات المركبات
  • تؤثر على الصعيد العالمي في كلّ من المركبات والشحنات.

يركّز هذا الدليل على أحد القيود الأساسية للشحن، وهي الفترات الزمنية.

الفترات الزمنية هي نوع من القيود التي تقدّمها في رسالة OptimizeToursRequest (REST وgRPC) لتحديد حدود مستندة إلى الوقت لأنشطة الشحن. يؤثر هذا النوع من القيد على كل من وقت وكيفية إجراء الشحنة وكذلك تعيين المركبة للشحن. مع هذه القيود، يعطي المحسن الأفضلية لتلك المركبات التي يمكنها تلبية القيود الزمنية للشحن بشكل أفضل.

قيود الشحن: الفترات الزمنية

عليك تحديد الحالات التي يمكن فيها استلام الطلبات أو تسليمها في رسالة Shipment.VisitRequest على النحو التالي:

  • استخدِم السمة timeWindows في الرسالة (REST، gRPC)
  • حدِّد وقتَي البدء والانتهاء في رسالة TimeWindow (REST، gRPC).

مثال على طلب يتضمّن قيودًا خلال فترة زمنية

يوضح المثال هنا ثلاث شحنات مختلفة، لكل منها فترة تسليم خاصة بها. ببساطة، يحدّد هذا المثال الفترات الزمنية على deliveries فقط، ولكن يمكن أيضًا تطبيق الفترات الزمنية على عمليات استلام الطلب. يمكن تحديد فترات زمنية متعددة، على الرغم من أنّ هذا المثال يستخدم فترة واحدة فقط لكل VisitRequest عملية تسليم.

الاطّلاع على مثال لطلب يتضمّن فترات زمنية

{
  "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",
            "timeWindows": [
              {
                "startTime": "2023-01-13T18:00:00Z",
                "endTime": "2023-01-13T19:00:00Z"
              }
            ]
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 100.0
      },
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.789116,
              "longitude": -122.395080
            },
            "duration": "250s",
            "timeWindows": [
              {
                "startTime": "2023-01-13T18:00:00Z",
                "endTime": "2023-01-13T18:30:00Z"
              }
            ]
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 20.0
      },
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.795242,
              "longitude": -122.399347
            },
            "duration": "250s",
            "timeWindows": [
              {
                "startTime": "2023-01-13T17:30:00Z",
                "endTime": "2023-01-13T18:00:00Z"
              }
            ]
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 50.0
      }
    ],
    "vehicles": [
      {
        "endLocation": {
          "latitude": 37.794465,
          "longitude": -122.394839
        },
        "startLocation": {
          "latitude": 37.794465,
          "longitude": -122.394839
        },
        "costPerHour": 40.0,
        "costPerKilometer": 10.0
      }
    ]
  }
}
    

مثال على ردّ مع قيود الفترة الزمنية

في نموذج الرد، يكون وقت بدء المركبة وانتهائها هما 17:35:50 و18:17:24 على التوالي. تعكس هذه الأوقات المحسِّن الذي يقلل من الوقت المطلوب لتشغيل المركبة المحددة في الطلب على أنه costPerHour مع الالتزام بجميع قيود الفترات الزمنية. يؤدي استخدام الساعة 17:35:50 كوقت البدء إلى إلغاء الحاجة إلى انتظار المركبة في موقع الزيارة حتى تبدأ الفترة الزمنية للزيارة. يظهر هذا في الاستجابة كصفر من قيم waitDuration.

الاطّلاع على ردّ على نموذج الطلب من خلال فترات زمنية

{
  "routes": [
    {
      "vehicleStartTime": "2023-01-13T17:35:50Z",
      "vehicleEndTime": "2023-01-13T18:17:24Z",
      "visits": [
        {
          "isPickup": true,
          "startTime": "2023-01-13T17:35:50Z",
          "detour": "0s"
        },
        {
          "shipmentIndex": 1,
          "isPickup": true,
          "startTime": "2023-01-13T17:38:20Z",
          "detour": "150s"
        },
        {
          "shipmentIndex": 2,
          "isPickup": true,
          "startTime": "2023-01-13T17:40:50Z",
          "detour": "300s"
        },
        {
          "shipmentIndex": 2,
          "startTime": "2023-01-13T17:50:09Z",
          "detour": "0s"
        },
        {
          "shipmentIndex": 1,
          "startTime": "2023-01-13T18:00:00Z",
          "detour": "796s"
        },
        {
          "startTime": "2023-01-13T18:07:35Z",
          "detour": "1520s"
        }
      ],
      "transitions": [
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2023-01-13T17:35:50Z"
        },
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2023-01-13T17:38:20Z"
        },
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2023-01-13T17:40:50Z"
        },
        {
          "travelDuration": "409s",
          "travelDistanceMeters": 1371,
          "waitDuration": "0s",
          "totalDuration": "409s",
          "startTime": "2023-01-13T17:43:20Z"
        },
        {
          "travelDuration": "341s",
          "travelDistanceMeters": 1312,
          "waitDuration": "0s",
          "totalDuration": "341s",
          "startTime": "2023-01-13T17:54:19Z"
        },
        {
          "travelDuration": "205s",
          "travelDistanceMeters": 636,
          "waitDuration": "0s",
          "totalDuration": "205s",
          "startTime": "2023-01-13T18:04:10Z"
        },
        {
          "travelDuration": "339s",
          "travelDistanceMeters": 1276,
          "waitDuration": "0s",
          "totalDuration": "339s",
          "startTime": "2023-01-13T18:11:45Z"
        }
      ],
      "metrics": {
        "performedShipmentCount": 3,
        "travelDuration": "1294s",
        "waitDuration": "0s",
        "delayDuration": "0s",
        "breakDuration": "0s",
        "visitDuration": "1200s",
        "totalDuration": "2494s",
        "travelDistanceMeters": 4595
      },
      "routeCosts": {
        "model.vehicles.cost_per_hour": 27.711111111111112,
        "model.vehicles.cost_per_kilometer": 45.95
      },
      "routeTotalCost": 73.661111111111111
    }
  ],
  "metrics": {
    "aggregatedRouteMetrics": {
      "performedShipmentCount": 3,
      "travelDuration": "1294s",
      "waitDuration": "0s",
      "delayDuration": "0s",
      "breakDuration": "0s",
      "visitDuration": "1200s",
      "totalDuration": "2494s",
      "travelDistanceMeters": 4595
    },
    "usedVehicleCount": 1,
    "earliestVehicleStartTime": "2023-01-13T17:35:50Z",
    "latestVehicleEndTime": "2023-01-13T18:17:24Z",
    "totalCost": 73.661111111111111,
    "costs": {
      "model.vehicles.cost_per_hour": 27.711111111111112,
      "model.vehicles.cost_per_kilometer": 45.95
    }
  }
}
    

وفقًا للنوافذ الزمنية، يتم تحديد السمة visits للمركبة كي يتم تسليم الشحنات ذات المهلة الزمنية الأقدم أولاً.

  1. يتم تسليم "shipments[2]" الساعة 17:50
  2. يتم تسليم "shipments[1]" الساعة 6:00 مساءً
  3. يتم تسليم "shipments[0]" الساعة 18:07.

يحدّد نموذج الطلب قيودًا على الفترات الزمنية الصعبة، ما يتطلّب إكمال عمليات التسليم خلال تلك النوافذ. إذا لم يكن إكمال VisitRequests للشحن خلال أي من الفترات الزمنية المحدّدة لها أمرًا ممكنًا أو غير فعال من حيث التكلفة، سيتخطى موفّر الخدمة عملية الشحن. إذا كانت الشحنة تحتوي على penaltyCost، سيضيفها محسِّن الخدمة إلى التكاليف التي تم الإبلاغ عنها استجابةً metrics. في الحالات الأخرى، ستزيد السمة skippedMandatoryShipmentCount للرسالة OptimizeToursResponse (REST، gRPC).

إذا تم تغيير الفترات الزمنية من خلال نقل نافذة shipment[1] بعد عدة ساعات (إلى 21:00 من 18:00)، ستكون النتائج مختلفة كما هو موضّح في الأمثلة التالية.

الاطّلاع على مثال لطلب يتضمّن فترات زمنية لا يمكن استيفاؤها

{
  "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",
            "timeWindows": [
              {
                "startTime": "2023-01-13T18:00:00Z",
                "endTime": "2023-01-13T19:00:00Z"
              }
            ]
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 100.0
      },
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.789116,
              "longitude": -122.395080
            },
            "duration": "250s",
            "timeWindows": [
              {
                "startTime": "2023-01-13T21:00:00Z",
                "endTime": "2023-01-13T21:30:00Z"
              }
            ]
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 20.0
      },
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.795242,
              "longitude": -122.399347
            },
            "duration": "250s",
            "timeWindows": [
              {
                "startTime": "2023-01-13T17:30:00Z",
                "endTime": "2023-01-13T18:00:00Z"
              }
            ]
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 50.0
      }
    ],
    "vehicles": [
      {
        "endLocation": {
          "latitude": 37.794465,
          "longitude": -122.394839
        },
        "startLocation": {
          "latitude": 37.794465,
          "longitude": -122.394839
        },
        "costPerHour": 40.0,
        "costPerKilometer": 10.0
      }
    ]
  }
}
    

اطّلِع على رد على الطلب الثاني كمثال مع فترات زمنية، حيث يتم تخطّي الشحنة.

{
  "routes": [
    {
      "vehicleStartTime": "2023-01-13T17:37:49Z",
      "vehicleEndTime": "2023-01-13T18:09:49Z",
      "visits": [
        {
          "isPickup": true,
          "startTime": "2023-01-13T17:37:49Z",
          "detour": "0s"
        },
        {
          "shipmentIndex": 2,
          "isPickup": true,
          "startTime": "2023-01-13T17:40:19Z",
          "detour": "150s"
        },
        {
          "shipmentIndex": 2,
          "startTime": "2023-01-13T17:49:38Z",
          "detour": "0s"
        },
        {
          "startTime": "2023-01-13T18:00:00Z",
          "detour": "946s"
        }
      ],
      "transitions": [
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2023-01-13T17:37:49Z"
        },
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2023-01-13T17:40:19Z"
        },
        {
          "travelDuration": "409s",
          "travelDistanceMeters": 1371,
          "waitDuration": "0s",
          "totalDuration": "409s",
          "startTime": "2023-01-13T17:42:49Z"
        },
        {
          "travelDuration": "372s",
          "travelDistanceMeters": 1348,
          "waitDuration": "0s",
          "totalDuration": "372s",
          "startTime": "2023-01-13T17:53:48Z"
        },
        {
          "travelDuration": "339s",
          "travelDistanceMeters": 1276,
          "waitDuration": "0s",
          "totalDuration": "339s",
          "startTime": "2023-01-13T18:04:10Z"
        }
      ],
      "metrics": {
        "performedShipmentCount": 2,
        "travelDuration": "1120s",
        "waitDuration": "0s",
        "delayDuration": "0s",
        "breakDuration": "0s",
        "visitDuration": "800s",
        "totalDuration": "1920s",
        "travelDistanceMeters": 3995
      },
      "routeCosts": {
        "model.vehicles.cost_per_kilometer": 39.95,
        "model.vehicles.cost_per_hour": 21.333333333333332
      },
      "routeTotalCost": 61.283333333333331
    }
  ],
  "skippedShipments": [
    {
      "index": 1
    }
  ],
  "metrics": {
    "aggregatedRouteMetrics": {
      "performedShipmentCount": 2,
      "travelDuration": "1120s",
      "waitDuration": "0s",
      "delayDuration": "0s",
      "breakDuration": "0s",
      "visitDuration": "800s",
      "totalDuration": "1920s",
      "travelDistanceMeters": 3995
    },
    "usedVehicleCount": 1,
    "earliestVehicleStartTime": "2023-01-13T17:37:49Z",
    "latestVehicleEndTime": "2023-01-13T18:09:49Z",
    "totalCost": 81.283333333333331,
    "costs": {
      "model.shipments.penalty_cost": 20,
      "model.vehicles.cost_per_hour": 21.333333333333332,
      "model.vehicles.cost_per_kilometer": 39.95
    }
  }
}
    

في هذا المثال، تسبّبت الفترة الزمنية اللاحقة في تخطّي shipment[1]، لأنّ وقت تشغيل المركبة الإضافي المطلوب لإكمال تسليم الشحنة خلال الفترة الزمنية المحدّدة تجاوز تكلفة العقوبة المفروضة على الشحن. تظهر تكلفة العقوبة المفروضة على shipment[1] في metrics.costs، ويظهر فهرسها ضمن skippedShipments.

قيود الفترة الزمنية المحدودة

كما ورد بإيجاز في مَعلمات نماذج التكلفة، يمكن تطبيق الفترات الزمنية في شكل قيود محدودة. تختلف القيود البسيطة عن القيود الصعبة على النحو التالي:

  • القيود الصعبة: لا يمكن الانتهاك، ولا يقدّم المحسّن حلاً ينتهك القيد، حتى إذا كان ذلك يعني تخطي الشحن.
  • القيود البسيطة: يمكن انتهاكها، ما يعني أنّ المحسِّن قد يوفّر حلاً يخالف قيودًا مبسّطة. ومع ذلك، يطبّق المُحسّن أيضًا تكلفة على أي انتهاك. أنت تقدم هذه التكلفة كخاصية إضافية في الإطار الزمني، وعادةً ما تكون تكلفة في الساعة لكل ساعة قبل أو بعد الفترة الزمنية التي يحدث فيها النشاط.

يتم تخفيض النوافذ الزمنية باستخدام softStartTime أو softEndTime بدلاً من startTime أو endTime على التوالي، ومن خلال ضبط costPerHourBeforeSoftStartTime أو costPerHourAfterSoftEndTime.

استخدِم قيودًا مهلة زمنية مشروطة عندما يجب أن تتمّ عمليات الاستلام أو التسليم خلال فترة زمنية محدّدة، مع العلم أنّ استلام الطلبات أو توصيلها خلال تلك الفترة غير مطلوب على الإطلاق. يمكنك استخدام قيود الفترة الزمنية الصعبة والضعيفة معًا للتعبير عن أهداف العمل. مثلاً:

  • فترة الوقت الصعب: تشير إلى ساعات العمل الخاصة بالعميل، مثل من 9 صباحًا إلى 5 مساءً.
  • فترة زمنية محددة: تشير إلى الإطار الزمني للتسليم أو الاستلام الذي يتطابق مع الإشعار المُرسَل إلى العميل، مثلاً من الساعة 9 صباحًا إلى 1 بعد الظهر.

في هذا المثال، تم تخفيف قيود وقت البدء للشحن التي تم تخطيها سابقًا لأن الفترة الزمنية التي بدأت في وقت متأخر جدًا. تم أيضًا تقليل أوقات انتهاء النوافذ الزمنية الأخرى للشحنات الأخرى.

الاطّلاع على مثال على طلب يتضمّن فترات زمنية صعبة ومحدودة

{
  "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",
            "timeWindows": [
              {
                "startTime": "2023-01-13T18:00:00Z",
                "softEndTime": "2023-01-13T19:00:00Z",
                "costPerHourAfterSoftEndTime": 2.0
              }
            ]
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 100.0
      },
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.789116,
              "longitude": -122.395080
            },
            "duration": "250s",
            "timeWindows": [
              {
                "softStartTime": "2023-01-13T21:00:00Z",
                "endTime": "2023-01-13T21:30:00Z",
                "costPerHourBeforeSoftStartTime": 2.0
              }
            ]
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 20.0
      },
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.795242,
              "longitude": -122.399347
            },
            "duration": "250s",
            "timeWindows": [
              {
                "startTime": "2023-01-13T17:30:00Z",
                "softEndTime": "2023-01-13T18:00:00Z",
                "costPerHourAfterSoftEndTime": 2.0
              }
            ]
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 50.0
      }
    ],
    "vehicles": [
      {
        "endLocation": {
          "latitude": 37.794465,
          "longitude": -122.394839
        },
        "startLocation": {
          "latitude": 37.794465,
          "longitude": -122.394839
        },
        "costPerHour": 40.0,
        "costPerKilometer": 10.0
      }
    ]
  }
}
    

الاطّلاع على ردّ على نموذج الطلب من خلال فترات زمنية ثابتة ومحدودة

{
  "routes": [
    {
      "vehicleStartTime": "2023-01-13T17:48:35Z",
      "vehicleEndTime": "2023-01-13T18:24:28Z",
      "visits": [
        {
          "isPickup": true,
          "startTime": "2023-01-13T17:48:35Z",
          "detour": "0s"
        },
        {
          "shipmentIndex": 1,
          "isPickup": true,
          "startTime": "2023-01-13T17:51:05Z",
          "detour": "150s"
        },
        {
          "shipmentIndex": 2,
          "isPickup": true,
          "startTime": "2023-01-13T17:53:35Z",
          "detour": "300s"
        },
        {
          "startTime": "2023-01-13T18:00:00Z",
          "detour": "300s"
        },
        {
          "shipmentIndex": 1,
          "startTime": "2023-01-13T18:07:42Z",
          "detour": "493s"
        },
        {
          "shipmentIndex": 2,
          "startTime": "2023-01-13T18:17:27Z",
          "detour": "873s"
        }
      ],
      "transitions": [
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2023-01-13T17:48:35Z"
        },
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2023-01-13T17:51:05Z"
        },
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2023-01-13T17:53:35Z"
        },
        {
          "travelDuration": "235s",
          "travelDistanceMeters": 795,
          "waitDuration": "0s",
          "totalDuration": "235s",
          "startTime": "2023-01-13T17:56:05Z"
        },
        {
          "travelDuration": "212s",
          "travelDistanceMeters": 791,
          "waitDuration": "0s",
          "totalDuration": "212s",
          "startTime": "2023-01-13T18:04:10Z"
        },
        {
          "travelDuration": "335s",
          "travelDistanceMeters": 1204,
          "waitDuration": "0s",
          "totalDuration": "335s",
          "startTime": "2023-01-13T18:11:52Z"
        },
        {
          "travelDuration": "171s",
          "travelDistanceMeters": 665,
          "waitDuration": "0s",
          "totalDuration": "171s",
          "startTime": "2023-01-13T18:21:37Z"
        }
      ],
      "metrics": {
        "performedShipmentCount": 3,
        "travelDuration": "953s",
        "waitDuration": "0s",
        "delayDuration": "0s",
        "breakDuration": "0s",
        "visitDuration": "1200s",
        "totalDuration": "2153s",
        "travelDistanceMeters": 3455
      },
      "routeCosts": {
        "model.shipments.deliveries.time_windows.cost_per_hour_after_soft_end_time": 0.58166666666666667,
        "model.shipments.deliveries.time_windows.cost_per_hour_before_soft_start_time": 5.7433333333333332,
        "model.vehicles.cost_per_hour": 23.922222222222221,
        "model.vehicles.cost_per_kilometer": 34.55
      },
      "routeTotalCost": 64.797222222222217
    }
  ],
  "metrics": {
    "aggregatedRouteMetrics": {
      "performedShipmentCount": 3,
      "travelDuration": "953s",
      "waitDuration": "0s",
      "delayDuration": "0s",
      "breakDuration": "0s",
      "visitDuration": "1200s",
      "totalDuration": "2153s",
      "travelDistanceMeters": 3455
    },
    "usedVehicleCount": 1,
    "earliestVehicleStartTime": "2023-01-13T17:48:35Z",
    "latestVehicleEndTime": "2023-01-13T18:24:28Z",
    "totalCost": 64.797222222222217,
    "costs": {
      "model.vehicles.cost_per_kilometer": 34.55,
      "model.shipments.deliveries.time_windows.cost_per_hour_before_soft_start_time": 5.7433333333333332,
      "model.shipments.deliveries.time_windows.cost_per_hour_after_soft_end_time": 0.58166666666666667,
      "model.vehicles.cost_per_hour": 23.922222222222221
    }
  }
}
    

إذا تم تخطّي المثال الذي لا يتضمّن سوى القيود المفروضة على فترات زمنية معيّنة فقط shipment[1]، يؤدي تخفيض فترة التسليم إلى تسليمه قبل وقت بدء هذه الفترة. وبالمثل، سمح تخفيف أوقات انتهاء الشحنات الأخرى بتسليم "shipment[2]" بعد انتهاء الفترة الزمنية المحدّدة.

في الوقت نفسه، تغيرت التكاليف وإجمالي الشحنات:

  • totalCost: انخفض من 81.283 إلى 64.797.
  • إجمالي الشحنات المكتملة: زيادة من شحنتَين إلى 3

وجد برنامج تحسين الأداء حلاً أقل تكلفة، لأنّه تم تخفيف قيود الإطار الزمني مقارنةً بالمثال السابق.

أخيرًا، تتضمن السمة metrics.costs أيضًا مفتاحًا جديدًا للإشارة إلى التكلفة الفعلية المتكبدة بناءً على منتج القيد والمدة الزمنية التي لم يتم الالتزام بنافذة التسليم. والمقصود:

  • costPerHourBeforeSoftStartTime من 2.0 و
  • الوقت بين التسليم الفعلي وبداية الفترة الزمنية: 2.83583 ساعة

النتيجة:

model.shipments.deliveries.time_windows.cost_per_hour_before_soft_start_time: 5.671666666666669.

تسمح لك هذه المقاييس بإجراء تحليل التكاليف لمعرفة المفاضلة بين القيود الصعبة والقيود البسيطة، والتي يمكنك استخدامها لضبط القيود لتناسب قواعد عملك الخاصة بشكل أفضل. في هذه الحالة، تكون التكلفة الإجمالية أقل من shipment[1].penalty_cost من 20.0. حدّد محسِّن الخدمة أن تسليم الشحنة في وقت مبكر أكثر فعالية من حيث التكلفة بدلاً من تخطّي الشحنة.