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

يتم تطبيق قيود من قِبل "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] في الساعة 5:50 بعد الظهر
  2. يتم تسليم shipments[1] عند الساعة 6:00 مساءً
  3. يتم تسليم shipments[0] في الساعة 6: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
  • إجمالي الشحنات المكتملة: زيادة من 2 إلى 3

وقد وصل المحسَّن إلى حلّ أقل تكلفة لأنّه تم تخفيف قيود الفترة الزمنية مقارنةً بالمثال السابق.

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

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

النتيجة:

model.shipments.deliveries.time_windows.cost_per_hour_before_soft_start_time: 5.6716666666666669

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