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

تفرض 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] في الساعة 18:00
  3. تم تسليم الطلب رقم shipments[0] في الساعة 6:07 مساءً

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

إذا غيّرت الفترات الزمنية من خلال نقل فترة shipment[1] إلى عدة ساعات لاحقة (من الساعة 18:00 إلى الساعة 21: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. حدّد المحسِّن أنّ تسليم الشحنة مبكرًا أكثر فعالية من حيث التكلفة من تخطّيها.