ShipmentModel

يحتوي نموذج الشحن على مجموعة من الشحنات التي يجب تنفيذها بواسطة مجموعة من المركبات، مع تقليل التكلفة الإجمالية إلى أدنى حد، وهي مجموع ما يلي:

  • تكلفة توجيه المركبات (مجموع التكلفة لكل إجمالي الوقت والتكلفة لكل وقت السفر والتكلفة الثابتة على جميع المركبات)
  • عقوبات الشحن غير المنفَّذ
  • تكلفة المدة الزمنية الإجمالية للشحنات
تمثيل JSON
{
  "shipments": [
    {
      object (Shipment)
    }
  ],
  "vehicles": [
    {
      object (Vehicle)
    }
  ],
  "globalStartTime": string,
  "globalEndTime": string,
  "globalDurationCostPerHour": number,
  "durationDistanceMatrices": [
    {
      object (DurationDistanceMatrix)
    }
  ],
  "durationDistanceMatrixSrcTags": [
    string
  ],
  "durationDistanceMatrixDstTags": [
    string
  ],
  "transitionAttributes": [
    {
      object (TransitionAttributes)
    }
  ],
  "shipmentTypeIncompatibilities": [
    {
      object (ShipmentTypeIncompatibility)
    }
  ],
  "shipmentTypeRequirements": [
    {
      object (ShipmentTypeRequirement)
    }
  ],
  "precedenceRules": [
    {
      object (PrecedenceRule)
    }
  ],
  "maxActiveVehicles": integer
}
الحقول
shipments[]

object (Shipment)

مجموعة الشحنات التي يجب تنفيذها في النموذج

vehicles[]

object (Vehicle)

مجموعة من المركبات التي يمكن استخدامها لإجراء الزيارات

globalStartTime

string (Timestamp format)

وقتا البدء والانتهاء العامان للنموذج: لا يمكن اعتبار أي أوقات خارج هذا النطاق صالحة.

يجب أن تكون الفترة الزمنية للنموذج أقل من عام، أي أنّ globalEndTime وglobalStartTime يجب أن يكونا ضمن 31536000 ثانية من بعضهما.

عند استخدام حقول cost_per_*hour، قد تحتاج إلى ضبط هذه النافذة على فاصل زمني أصغر لتحسين الأداء (على سبيل المثال، إذا كنت تنشئ نموذجًا ليوم واحد، عليك ضبط الحدود الزمنية العامة لذلك اليوم). في حال عدم ضبطها، يتم استخدام 00:00:00 بالتوقيت العالمي المنسق، 1 كانون الثاني (يناير) 1970 (أي الثواني: 0، النانو ثانية: 0) كقيمة تلقائية.

يجب أن يكون طابعًا زمنيًا بالتنسيق RFC3339 UTC "Zulu"‎ وبدقة تصل إلى نانوثانية وما يصل إلى تسعة أرقام كسور. أمثلة: "2014-10-02T15:01:23Z" و"2014-10-02T15:01:23.045123456Z"

globalEndTime

string (Timestamp format)

في حال عدم ضبط القيمة، يتم استخدام 00:00:00 بالتوقيت العالمي المنسق، 1 كانون الثاني (يناير) 1971 (أي الثواني: 31536000، النانو ثانية: 0) كقيمة تلقائية.

يجب أن يكون طابعًا زمنيًا بالتنسيق RFC3339 UTC "Zulu"‎ وبدقة تصل إلى نانوثانية وما يصل إلى تسعة أرقام كسور. أمثلة: "2014-10-02T15:01:23Z" و"2014-10-02T15:01:23.045123456Z"

globalDurationCostPerHour

number

"المدة الإجمالية" للخطة العامة هي الفرق بين أقرب وقت بدء سارٍ وآخر وقت انتهاء سارٍ لجميع المركبات. يمكن للمستخدمين تحديد تكلفة لكل ساعة لهذه الكمية لمحاولة تحسينها من أجل إكمال المهمة في أقرب وقت ممكن، على سبيل المثال. يجب أن تكون هذه التكلفة بالوحدة نفسها المستخدَمة في Shipment.penalty_cost.

durationDistanceMatrices[]

object (DurationDistanceMatrix)

تُحدِّد مصفوفات المدة والمسافة المستخدَمة في النموذج. إذا كان هذا الحقل فارغًا، سيتم استخدام "خرائط Google" أو المسافات الجيوديسية بدلاً من ذلك، استنادًا إلى قيمة الحقل useGeodesicDistances. إذا لم يكن فارغًا، لا يمكن أن تكون قيمة useGeodesicDistances صحيحة ولا يمكن أن يكون durationDistanceMatrixSrcTags أو durationDistanceMatrixDstTags فارغًا.

أمثلة على الاستخدام:

  • هناك موقعان جغرافيّان: locA وlocB.
  • مركبة واحدة تبدأ مسارها في الموقع الجغرافي "أ" وتنتهي به
  • طلب زيارة استلام واحد في الموقع الجغرافي "ب"
model {
  vehicles { startTags: "locA"  endTags: "locA" }
  shipments { pickups { tags: "locB" } }
  durationDistanceMatrixSrcTags: "locA"
  durationDistanceMatrixSrcTags: "locB"
  durationDistanceMatrixDstTags: "locA"
  durationDistanceMatrixDstTags: "locB"
  durationDistanceMatrices {
    rows {  # from: locA
      durations { seconds: 0 }   meters: 0    # to: locA
      durations { seconds: 100 } meters: 1000 # to: locB
    }
    rows {  # from: locB
      durations { seconds: 102 } meters: 990 # to: locA
      durations { seconds: 0 }   meters: 0   # to: locB
    }
  }
}
  • هناك ثلاثة مواقع جغرافية: locA وlocB وlocC.
  • مركبة واحدة تبدأ مسارها من الموقع الجغرافي "أ" وتنتهي به في الموقع الجغرافي "ب"، باستخدام مصفوفة "سريع".
  • مركبة واحدة تبدأ مسارها في locB وتنتهي في locB، باستخدام مصفوفة "بطيء".
  • مركبة واحدة تبدأ مسارها في locB وتنتهي في locB، باستخدام مصفوفة "fast".
  • طلب زيارة استلام واحد في الموقع الجغرافي (ج).
model {
  vehicles { startTags: "locA" endTags: "locB" startTags: "fast" }
  vehicles { startTags: "locB" endTags: "locB" startTags: "slow" }
  vehicles { startTags: "locB" endTags: "locB" startTags: "fast" }
  shipments { pickups { tags: "locC" } }
  durationDistanceMatrixSrcTags: "locA"
  durationDistanceMatrixSrcTags: "locB"
  durationDistanceMatrixSrcTags: "locC"
  durationDistanceMatrixDstTags: "locB"
  durationDistanceMatrixDstTags: "locC"
  durationDistanceMatrices {
    vehicleStartTag: "fast"
    rows {  # from: locA
      durations { seconds: 1000 } meters: 2000 # to: locB
      durations { seconds: 600 }  meters: 1000 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }   meters: 0    # to: locB
      durations { seconds: 700 } meters: 1200 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 702 } meters: 1190 # to: locB
      durations { seconds: 0 }   meters: 0    # to: locC
    }
  }
  durationDistanceMatrices {
    vehicleStartTag: "slow"
    rows {  # from: locA
      durations { seconds: 1800 } meters: 2001 # to: locB
      durations { seconds: 900 }  meters: 1002 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }    meters: 0    # to: locB
      durations { seconds: 1000 } meters: 1202 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 1001 } meters: 1195 # to: locB
      durations { seconds: 0 }    meters: 0    # to: locC
    }
  }
}
durationDistanceMatrixSrcTags[]

string

علامات تحدّد مصادر مصفوفتَي المدة والمسافة: durationDistanceMatrices(i).rows(j) تحدّد المدّات والمسافات من الزيارات التي تحمل العلامة durationDistanceMatrixSrcTags(j) إلى الزيارات الأخرى في المصفوفة i.

تتطابق العلامات مع VisitRequest.tags أو Vehicle.start_tags. يجب أن يتطابق VisitRequest أو Vehicle مع علامة واحدة بالضبط في هذا الحقل. يُرجى العِلم أنّ علامات المصدر والوجهة والمصفّحة في Vehicle قد تكون متطابقة، وبالمثل قد تكون علامات المصدر والوجهة في VisitRequest متطابقة. يجب أن تكون جميع العلامات مختلفة ولا يمكن أن تكون سلاسل فارغة. إذا لم يكن هذا الحقل فارغًا، يجب ألا يكون الحقل durationDistanceMatrices فارغًا.

durationDistanceMatrixDstTags[]

string

علامات تحدّد وجهات مصفوفتَي المدة والمسافة؛ durationDistanceMatrices(i).rows(j).durations(k) (على التوالي تحدِّد durationDistanceMatrices(i).rows(j).meters(k)) مدة التنقّل (أو المسافة) من الزيارات التي تحمل العلامة durationDistanceMatrixSrcTags(j) إلى الزيارات التي تحمل العلامة durationDistanceMatrixDstTags(k) في المصفوفة i.

تتطابق العلامات مع VisitRequest.tags أو Vehicle.start_tags. يجب أن يتطابق VisitRequest أو Vehicle مع علامة واحدة بالضبط في هذا الحقل. يُرجى العِلم أنّ علامات المصدر والوجهة والمصفّحة في Vehicle قد تكون متطابقة، وبالمثل قد تكون علامات المصدر والوجهة في VisitRequest متطابقة. يجب أن تكون جميع العلامات مختلفة ولا يمكن أن تكون سلاسل فارغة. إذا لم يكن هذا الحقل فارغًا، يجب ألا يكون الحقل durationDistanceMatrices فارغًا.

transitionAttributes[]

object (TransitionAttributes)

تمّت إضافة سمات الانتقال إلى النموذج.

shipmentTypeIncompatibilities[]

object (ShipmentTypeIncompatibility)

مجموعات من أنواع الشحن غير المتوافقة (راجِع ShipmentTypeIncompatibility).

shipmentTypeRequirements[]

object (ShipmentTypeRequirement)

مجموعات من متطلبات shipmentType (راجِع ShipmentTypeRequirement)

precedenceRules[]

object (PrecedenceRule)

مجموعة من قواعد الأسبقية التي يجب فرضها في النموذج

maxActiveVehicles

integer

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

الشحن

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

تمثيل JSON
{
  "displayName": string,
  "pickups": [
    {
      object (VisitRequest)
    }
  ],
  "deliveries": [
    {
      object (VisitRequest)
    }
  ],
  "loadDemands": {
    string: {
      object (Load)
    },
    ...
  },
  "allowedVehicleIndices": [
    integer
  ],
  "costsPerVehicle": [
    number
  ],
  "costsPerVehicleIndices": [
    integer
  ],
  "pickupToDeliveryAbsoluteDetourLimit": string,
  "pickupToDeliveryTimeLimit": string,
  "shipmentType": string,
  "label": string,
  "ignore": boolean,
  "penaltyCost": number,
  "pickupToDeliveryRelativeDetourLimit": number
}
الحقول
displayName

string

الاسم المعروض الذي يحدّده المستخدم للشحنة يمكن أن يصل طوله إلى 63 حرفًا وقد يستخدم أحرف UTF-8.

pickups[]

object (VisitRequest)

مجموعة من بدائل الاستلام المرتبطة بالشحنة في حال عدم تحديد موقع جغرافي، يجب أن تزور المركبة موقعًا جغرافيًا يتوافق مع عمليات التسليم.

deliveries[]

object (VisitRequest)

مجموعة من بدائل التسليم المرتبطة بالشحنة في حال عدم تحديد موقع جغرافي، يجب أن تزور المركبة موقعًا جغرافيًا يتطابق مع مواقع الاستلام.

loadDemands

map (key: string, value: object (Load))

متطلبات تحميل الشحنة (مثل الوزن والحجم وعدد المنصات وما إلى ذلك) يجب أن تكون المفاتيح في الخريطة معرّفات تصف نوع الحمولة المقابلة، ويُفضّل أن تتضمّن أيضًا الوحدات. على سبيل المثال: "weight_kg" و"volume_gallons" و"pallet_count" وما إلى ذلك. إذا لم يظهر مفتاح معيّن في الخريطة، يُعتبَر الحمولة المقابلة فارغة.

allowedVehicleIndices[]

integer

مجموعة المركبات التي يمكنها تنفيذ هذه الشحنة إذا كان الحقل فارغًا، يمكن لجميع المركبات تنفيذه. يتم عرض المركبات حسب فهرسها في قائمة ShipmentModel vehicles.

costsPerVehicle[]

number

تُستخدَم لتحديد التكلفة المتكبّدة عند تسليم هذه الشحنة بواسطة كل مركبة. في حال تحديدها، يجب أن تتضمّن أيًا مما يلي:

  • عدد العناصر نفسه في costsPerVehicleIndices يتوافق costsPerVehicle[i] مع المركبة costsPerVehicleIndices[i] من الطراز.
  • عدد العناصر نفسه لعدد المركبات في النموذج يتوافق العنصر i مع المركبة رقم i من الطراز.

يجب أن تكون هذه التكاليف بالوحدة نفسها المستخدَمة في penaltyCost، ويجب ألّا تكون سالبة. اترك هذا الحقل فارغًا إذا لم تكن هناك تكاليف من هذا النوع.

costsPerVehicleIndices[]

integer

مؤشرات المركبات التي ينطبق عليها costsPerVehicle إذا لم يكن فارغًا، يجب أن يحتوي على عدد العناصر نفسه في costsPerVehicle. لا يجوز تحديد فهرس مركبة أكثر من مرة. إذا تم استبعاد مركبة من costsPerVehicleIndices، تكون تكلفتها صفر.

pickupToDeliveryAbsoluteDetourLimit

string (Duration format)

تُستخدَم لتحديد الحد الأقصى للوقت المطلق للمسار غير المباشر مقارنةً بأقصر مسار من نقطة الاستلام إلى نقطة التسليم. في حال تحديده، يجب أن يكون موجبًا، ويجب أن تحتوي الشحنة على عملية استلام وتسليم واحدة على الأقل.

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

startTime(delivery) - startTime(pickup) <=
t + pickupToDeliveryAbsoluteDetourLimit

في حال تحديد الحدود النسبية والمطلقة في الشحنة نفسها، يتم استخدام الحد الأكثر تقييدًا لكل زوج من عمليات الاستلام/التسليم المحتملة. اعتبارًا من تشرين الأول (أكتوبر) 2017، لا تتوفّر الالتفافات إلا عندما لا تعتمد مدد التنقّل على المركبات.

المدة بالثواني مع ما يصل إلى تسعة أرقام كسور، وتنتهي بـ "s". مثال: "3.5s".

pickupToDeliveryTimeLimit

string (Duration format)

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

المدة بالثواني مع ما يصل إلى تسعة أرقام كسور، وتنتهي بـ "s". مثال: "3.5s".

shipmentType

string

سلسلة غير فارغة تحدّد "نوعًا" لهذه الشحنة يمكن استخدام هذه الميزة لتحديد حالات عدم التوافق أو المتطلبات بين shipment_types (راجِع shipmentTypeIncompatibilities وshipmentTypeRequirements في ShipmentModel).

يختلف عن visitTypes الذي يتم تحديده لزيارة واحدة: تتشارك جميع عمليات الاستلام/التسليم التي تنتمي إلى الشحنة نفسها shipmentType نفسه.

label

string

تُحدِّد تصنيفًا لهذه الشحنة. يتم تسجيل هذا التصنيف في الردّ في shipmentLabel من ShipmentRoute.Visit المقابل.

ignore

boolean

إذا كانت القيمة صحيحة، تخطّ هذه الشحنة، ولكن لا تطبِّق penaltyCost.

يؤدي تجاهل شحنة إلى حدوث خطأ في التحقّق عند توفّر أي shipmentTypeRequirements في النموذج.

يُسمح بتجاهل شحنة يتم تنفيذها في injectedFirstSolutionRoutes أو injectedSolutionConstraint، ويزيل الحلّ زيارات الاستلام/التسليم ذات الصلة من المسار الذي يتم تنفيذه. precedenceRules التي تشير إلى الشحنات التي تم تجاهلها

penaltyCost

number

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

ملاحظة مهمة: إذا لم يتم تحديد هذه العقوبة، سيتم اعتبارها غير محدودة، أي أنّه يجب إكمال الشحنة.

pickupToDeliveryRelativeDetourLimit

number

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

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

startTime(delivery) - startTime(pickup) <=
std::ceil(t * (1.0 + pickupToDeliveryRelativeDetourLimit))

في حال تحديد الحدود النسبية والمطلقة في الشحنة نفسها، يتم استخدام الحد الأكثر تقييدًا لكل زوج من عمليات الاستلام/التسليم المحتملة. اعتبارًا من تشرين الأول (أكتوبر) 2017، لا تتوفّر الالتفافات إلا عندما لا تعتمد مدد التنقّل على المركبات.

VisitRequest

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

تمثيل JSON
{
  "arrivalLocation": {
    object (LatLng)
  },
  "arrivalWaypoint": {
    object (Waypoint)
  },
  "departureLocation": {
    object (LatLng)
  },
  "departureWaypoint": {
    object (Waypoint)
  },
  "tags": [
    string
  ],
  "timeWindows": [
    {
      object (TimeWindow)
    }
  ],
  "duration": string,
  "cost": number,
  "loadDemands": {
    string: {
      object (Load)
    },
    ...
  },
  "visitTypes": [
    string
  ],
  "label": string
}
الحقول
arrivalLocation

object (LatLng)

الموقع الجغرافي الذي تصل إليه المركبة عند تنفيذ هذا VisitRequest. إذا كان نموذج الشحن يتضمّن مصفوفات المسافة حسب المدة، يجب عدم تحديد arrivalLocation.

arrivalWaypoint

object (Waypoint)

نقطة الطريق التي تصل إليها المركبة عند تنفيذ هذه VisitRequest. إذا كان نموذج الشحن يتضمّن مصفوفات المسافة حسب المدة، يجب عدم تحديد arrivalWaypoint.

departureLocation

object (LatLng)

الموقع الجغرافي الذي تغادر منه المركبة بعد إكمال هذا VisitRequest. يمكن حذف هذا الحقل إذا كان مطابقًا arrivalLocation. إذا كان نموذج الشحن يتضمّن مصفوفات المسافة حسب المدة، يجب عدم تحديد departureLocation.

departureWaypoint

object (Waypoint)

نقطة الطريق التي تغادر منها المركبة بعد إكمال هذا VisitRequest. يمكن حذف هذا الحقل إذا كان مطابقًا arrivalWaypoint. إذا كان نموذج الشحن يتضمّن مصفوفات المسافة حسب المدة، يجب عدم تحديد departureWaypoint.

tags[]

string

تحدِّد العلامات المرفقة بطلب الزيارة. لا يُسمح باستخدام سلاسل فارغة أو مكرّرة.

timeWindows[]

object (TimeWindow)

الفترات الزمنية التي تحدّ من وقت الوصول في إحدى الزيارات يُرجى العِلم أنّه قد تغادر المركبة خارج فترة وقت الوصول، أي أنّ وقت الوصول + المدة لا يجب أن يكونا ضمن فترة زمنية. وقد يؤدي ذلك إلى الانتظار إذا وصلت المركبة قبل TimeWindow.start_time.

يعني عدم توفّر TimeWindow أنّ المركبة يمكنها إجراء هذه الزيارة في أي وقت.

يجب أن تكون الفترات الزمنية غير متداخلة، أي يجب ألا تتداخل أي فترة زمنية مع أخرى أو تكون مجاورة لها، ويجب أن تكون بترتيب متزايد.

لا يمكن ضبط costPerHourAfterSoftEndTime وsoftEndTime إلا في حال توفّر فترة زمنية واحدة.

duration

string (Duration format)

مدة الزيارة، أي الوقت الذي تقضيه المركبة بين الوصول والمغادرة (تُضاف إلى وقت الانتظار المحتمَل، راجِع timeWindows).

المدة بالثواني مع ما يصل إلى تسعة أرقام كسور، وتنتهي بـ "s". مثال: "3.5s".

cost

number

تكلفة خدمة طلب الزيارة هذا على مسار مركبة. ويمكن استخدامها لدفع تكاليف مختلفة لكل عملية استلام أو تسليم بديلة للشحنة. يجب أن تكون هذه التكلفة بالوحدة نفسها المستخدَمة في Shipment.penalty_cost، ويجب ألا تكون سالبة.

loadDemands

map (key: string, value: object (Load))

تحميل متطلبات طلب الزيارة هذا يشبه هذا الحقل حقل Shipment.load_demands، إلا أنّه لا ينطبق إلا على هذا VisitRequest بدلاً من Shipment بالكامل. تتم إضافة الطلبات الواردة هنا إلى الطلبات الواردة في Shipment.load_demands.

visitTypes[]

string

تحدِّد أنواع الزيارة. ويمكن استخدام هذا الوقت لتحديد الوقت الإضافي المطلوب لمركبة لإكمال هذه الزيارة (راجِع Vehicle.extra_visit_duration_for_visit_type).

يمكن أن يظهر النوع مرّة واحدة فقط.

label

string

تُحدِّد تصنيفًا لهذا VisitRequest. يتم تسجيل هذا التصنيف في الردّ على أنّه visitLabel في ShipmentRoute.Visit المقابل.

LatLng

عنصر يمثّل زوجًا من خطوط العرض/خطوط الطول ويتم التعبير عن ذلك كزوج من الأعداد المزدوجة لتمثيل درجات خط العرض ودرجات خط الطول. يجب أن يكون هذا العنصر متوافقًا مع معيار WGS84 ما لم يتم تحديد خلاف ذلك. يجب أن تكون القيم ضمن النطاقات العادية.

تمثيل JSON
{
  "latitude": number,
  "longitude": number
}
الحقول
latitude

number

خط العرض بالدرجات يجب أن يكون في النطاق [-90.0, +90.0].

longitude

number

خط الطول بالدرجات يجب أن تكون القيمة ضمن النطاق [-180.0, +180.0].

النقطة الوسيطة

تُغلِّف نقطة طريق. تُستخدَم نقاط التوقف لتحديد مواقع الوصول والمغادرة لطلبات الزيارة، ومواقع البدء والانتهاء للمركبات.

تمثيل JSON
{
  "sideOfRoad": boolean,

  // Union field location_type can be only one of the following:
  "location": {
    object (Location)
  },
  "placeId": string
  // End of list of possible types for union field location_type.
}
الحقول
sideOfRoad

boolean

اختيارية: يشير ذلك إلى أنّ الموقع الجغرافي لنقطة المرور هذه يُفضّل أن تتوقف المركبة على جانب معيّن من الطريق. عند ضبط هذه القيمة، سيمرّ المسار عبر الموقع الجغرافي لكي تتمكّن المركبة من التوقف على جانب الطريق الذي يميل إليه الموقع الجغرافي من مركز الطريق. لا يعمل هذا الخيار مع وضع التنقّل "المشي".

حقل الربط location_type طرق مختلفة لتمثيل موقع جغرافي يمكن أن يكون location_type واحدًا فقط مما يلي:
location

object (Location)

نقطة محدّدة باستخدام إحداثيات جغرافية، بما في ذلك عنوان اختياري

placeId

string

معرّف مكان نقطة الاهتمام المرتبط بنقطة الطريق

الموقع الجغرافي

تُحاط بموقع جغرافي (نقطة جغرافية وعنوان اختياري).

تمثيل JSON
{
  "latLng": {
    object (LatLng)
  },
  "heading": integer
}
الحقول
latLng

object (LatLng)

الإحداثيات الجغرافية لنقطة الطريق

heading

integer

اتجاه البوصلة المرتبط باتجاه تدفق حركة المرور تُستخدَم هذه القيمة لتحديد جانب الطريق الذي سيتم استخدامه لعمليات الاستلام والإرجاع. يمكن أن تتراوح قيم الاتجاه بين 0 و360، حيث يحدد الصفر اتجاهًا شماليًا تمامًا، ويحدد 90 اتجاهًا شرقيًا تمامًا، وما إلى ذلك.

TimeWindow

تحدّ الفترات الزمنية من وقت الحدث، مثل وقت الوصول إلى زيارة أو وقت بدء مركبة وانتهائها.

تفرض حدود الفترة الزمنية الثابتة، startTime وendTime، أقرب وقت وآخر وقت للحدث، على النحو التالي: startTime <= event_time <= endTime. يعبّر الحدّ الأدنى لفترة الوقت المرن، softStartTime، عن تفضيل حدوث الحدث في softStartTime أو بعد ذلك من خلال تكبد تكلفة تتناسب مع المدة التي قبل softStartTime يحدث فيها الحدث. يعبّر الحدّ الأقصى لفترة الوقت المرنة، softEndTime، عن تفضيل حدوث الحدث في softEndTime أو قبله من خلال تكبد تكلفة تتناسب مع المدة التي يحدث فيها الحدث بعد softEndTime. يجب أن تكون القيم startTime وendTime وsoftStartTime وsoftEndTime ضمن الحدود الزمنية العامة (راجِع ShipmentModel.global_start_time وShipmentModel.global_end_time) وأن تلتزم بما يلي:

  0 <= `startTime` <= `endTime` and
  0 <= `startTime` <= `softStartTime` and
  0 <= `softEndTime` <= `endTime`.
تمثيل JSON
{
  "startTime": string,
  "endTime": string,
  "softStartTime": string,
  "softEndTime": string,
  "costPerHourBeforeSoftStartTime": number,
  "costPerHourAfterSoftEndTime": number
}
الحقول
startTime

string (Timestamp format)

وقت بدء الفترة الزمنية الثابتة إذا لم يتم تحديدها، سيتم ضبطها على ShipmentModel.global_start_time.

يجب أن يكون طابعًا زمنيًا بالتنسيق RFC3339 UTC "Zulu"‎ وبدقة تصل إلى نانوثانية وما يصل إلى تسعة أرقام كسور. أمثلة: "2014-10-02T15:01:23Z" و"2014-10-02T15:01:23.045123456Z"

endTime

string (Timestamp format)

وقت انتهاء الفترة الزمنية الصارمة إذا لم يتم تحديدها، سيتم ضبطها على ShipmentModel.global_end_time.

يجب أن يكون طابعًا زمنيًا بالتنسيق RFC3339 UTC "Zulu"‎ وبدقة تصل إلى نانوثانية وما يصل إلى تسعة أرقام كسور. أمثلة: "2014-10-02T15:01:23Z" و"2014-10-02T15:01:23.045123456Z"

softStartTime

string (Timestamp format)

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

يجب أن يكون طابعًا زمنيًا بالتنسيق RFC3339 UTC "Zulu"‎ وبدقة تصل إلى نانوثانية وما يصل إلى تسعة أرقام كسور. أمثلة: "2014-10-02T15:01:23Z" و"2014-10-02T15:01:23.045123456Z"

softEndTime

string (Timestamp format)

وقت الانتهاء النهائي لفترة زمنية معيّنة

يجب أن يكون طابعًا زمنيًا بالتنسيق RFC3339 UTC "Zulu"‎ وبدقة تصل إلى نانوثانية وما يصل إلى تسعة أرقام كسور. أمثلة: "2014-10-02T15:01:23Z" و"2014-10-02T15:01:23.045123456Z"

costPerHourBeforeSoftStartTime

number

تكلفة لكل ساعة تُضاف إلى التكاليف الأخرى في النموذج إذا حدث الحدث قبل softStartTime، ويتم احتسابها على النحو التالي:

   max(0, softStartTime - t.seconds)
                          * costPerHourBeforeSoftStartTime / 3600,
t being the time of the event.

يجب أن تكون هذه التكلفة موجبة، ولا يمكن ضبط الحقل إلا إذا تم ضبط softStartTime.

costPerHourAfterSoftEndTime

number

تكلفة لكل ساعة تُضاف إلى التكاليف الأخرى في النموذج إذا حدث الحدث بعد softEndTime، ويتم احتسابها على النحو التالي:

   max(0, t.seconds - softEndTime.seconds)
                    * costPerHourAfterSoftEndTime / 3600,
t being the time of the event.

يجب أن تكون هذه التكلفة موجبة، ولا يمكن ضبط الحقل إلا إذا تم ضبط softEndTime.

مركبة

نماذج مركبة تواجه مشكلة في الشحن سيؤدي حلّ مشكلة الشحن إلى إنشاء مسار يبدأ من startLocation وينتهي في endLocation لهذه المركبة. المسار هو تسلسل من الزيارات (راجِع ShipmentRoute).

تمثيل JSON
{
  "displayName": string,
  "travelMode": enum (TravelMode),
  "routeModifiers": {
    object (RouteModifiers)
  },
  "startLocation": {
    object (LatLng)
  },
  "startWaypoint": {
    object (Waypoint)
  },
  "endLocation": {
    object (LatLng)
  },
  "endWaypoint": {
    object (Waypoint)
  },
  "startTags": [
    string
  ],
  "endTags": [
    string
  ],
  "startTimeWindows": [
    {
      object (TimeWindow)
    }
  ],
  "endTimeWindows": [
    {
      object (TimeWindow)
    }
  ],
  "unloadingPolicy": enum (UnloadingPolicy),
  "loadLimits": {
    string: {
      object (LoadLimit)
    },
    ...
  },
  "costPerHour": number,
  "costPerTraveledHour": number,
  "costPerKilometer": number,
  "fixedCost": number,
  "usedIfRouteIsEmpty": boolean,
  "routeDurationLimit": {
    object (DurationLimit)
  },
  "travelDurationLimit": {
    object (DurationLimit)
  },
  "routeDistanceLimit": {
    object (DistanceLimit)
  },
  "extraVisitDurationForVisitType": {
    string: string,
    ...
  },
  "breakRule": {
    object (BreakRule)
  },
  "label": string,
  "ignore": boolean,
  "travelDurationMultiple": number
}
الحقول
displayName

string

الاسم المعروض للمركبة الذي حدّده المستخدم يمكن أن يصل طوله إلى 63 حرفًا وقد يستخدم أحرف UTF-8.

travelMode

enum (TravelMode)

وضع التنقّل الذي يؤثر في الطرق التي يمكن للمركبة استخدامها وسرعتها يمكنك أيضًا الاطّلاع على travelDurationMultiple.

routeModifiers

object (RouteModifiers)

مجموعة من الشروط التي يجب استيفاؤها والتي تؤثّر في طريقة احتساب المسارات للمركبة المحدّدة.

startLocation

object (LatLng)

الموقع الجغرافي الذي تبدأ منه المركبة قبل استلام أي شحنات إذا لم يتم تحديده، تبدأ المركبة في أول عملية استلام. إذا كان نموذج الشحن يتضمّن مصفوفات المدة والمسافة، يجب عدم تحديد startLocation.

startWaypoint

object (Waypoint)

نقطة طريق تمثّل موقعًا جغرافيًا تبدأ منه المركبة قبل استلام أي شحنات. إذا لم يتم تحديد startWaypoint أو startLocation، تبدأ المركبة في أول عملية استلام. إذا كان نموذج الشحن يتضمّن مصفوفات المدة والمسافة، يجب عدم تحديد startWaypoint.

endLocation

object (LatLng)

الموقع الجغرافي الذي تنتهي فيه المركبة بعد إكمال آخر VisitRequest في حال عدم تحديده، تنتهي ShipmentRoute المركبة على الفور عند إكمال آخر VisitRequest. إذا كان نموذج الشحن يتضمّن مصفوفات المدة والمسافة، يجب عدم تحديد endLocation.

endWaypoint

object (Waypoint)

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

startTags[]

string

تُحدِّد العلامات المرفقة ببداية مسار المركبة.

لا يُسمح باستخدام سلاسل فارغة أو مكرّرة.

endTags[]

string

تحدّد العلامات المرفقة بنهاية مسار المركبة.

لا يُسمح باستخدام سلاسل فارغة أو مكرّرة.

startTimeWindows[]

object (TimeWindow)

الفترات الزمنية التي يمكن خلالها للمركبة مغادرة موقعها الجغرافي الأولي ويجب أن تكون ضمن الحدود الزمنية العامة (راجِع حقول ShipmentModel.global_*). في حال عدم تحديدها، لا يكون هناك أي قيود باستثناء هذه الحدود الزمنية الشاملة.

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

لا يمكن ضبط costPerHourAfterSoftEndTime وsoftEndTime إلا في حال توفّر فترة زمنية واحدة.

endTimeWindows[]

object (TimeWindow)

الفترات الزمنية التي قد تصل خلالها المركبة إلى موقعها النهائي ويجب أن تكون ضمن الحدود الزمنية العامة (راجِع حقول ShipmentModel.global_*). في حال عدم تحديدها، لا يكون هناك أي قيود باستثناء هذه الحدود الزمنية الشاملة.

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

لا يمكن ضبط costPerHourAfterSoftEndTime وsoftEndTime إلا في حال توفّر فترة زمنية واحدة.

unloadingPolicy

enum (UnloadingPolicy)

تم فرض سياسة التفريغ على المركبة.

loadLimits

map (key: string, value: object (LoadLimit))

سعة المركبة (الوزن والحجم وعدد المنصات مثلاً) المفاتيح في الخريطة هي معرّفات لنوع الحمولة، بما يتوافق مع مفاتيح حقل Shipment.load_demands. إذا لم يكن مفتاح معيّن متوفّرًا في هذه الخريطة، تُعتبَر السعة المقابلة غير محدودة.

costPerHour

number

تكاليف المركبات: تُجمع جميع التكاليف ويجب أن تكون بالوحدة نفسها المستخدَمة في Shipment.penalty_cost.

التكلفة لكل ساعة من مسار المركبة يتم تطبيق هذه التكلفة على إجمالي الوقت المستغرَق في المسار، ويشمل ذلك وقت التنقّل ووقت الانتظار ووقت الزيارة. قد يؤدي استخدام costPerHour بدلاً من costPerTraveledHour فقط إلى زيادة وقت الاستجابة.

costPerTraveledHour

number

التكلفة لكل ساعة من مسار المركبة لا تُطبَّق هذه التكلفة إلا على مدة التنقّل التي يستغرقها المسار (أي المدة المُسجَّلة في ShipmentRoute.transitions)، وتستبعد وقت الانتظار ووقت الزيارة.

costPerKilometer

number

التكلفة لكل كيلومتر من مسار المركبة يتم تطبيق هذه التكلفة على المسافة الواردة في ShipmentRoute.transitions ولا تنطبق على أي مسافة يتم قطعها ضمنيًا من arrivalLocation إلى departureLocation في VisitRequest واحد.

fixedCost

number

يتم تطبيق تكلفة ثابتة إذا تم استخدام هذه المركبة لمعالجة شحنة.

usedIfRouteIsEmpty

boolean

لا ينطبق هذا الحقل إلا على المركبات التي لا يمرّ مسارها بأي شحنات. يشير ذلك إلى ما إذا كان يجب اعتبار المركبة مستعملة أم لا في هذه الحالة.

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

بخلاف ذلك، لا تنتقل المركبة من موقع البدء إلى موقع النهاية، ولا يتم تحديد أي breakRule أو تأخير (من TransitionAttributes) لهذه المركبة. في هذه الحالة، لا يحتوي ShipmentRoute للمركبة على أي معلومات باستثناء فهرس المركبة وتصنيفها.

routeDurationLimit

object (DurationLimit)

الحدّ الذي يتم تطبيقه على إجمالي مدة مسار المركبة في OptimizeToursResponse معيّن، تكون مدة مسار المركبة هي الفرق بين vehicleEndTime وvehicleStartTime.

travelDurationLimit

object (DurationLimit)

الحدّ المفروض على مدة التنقّل في مسار المركبة في OptimizeToursResponse معيّن، تكون مدة التنقّل في المسار هي مجموع كل transitions.travel_duration.

routeDistanceLimit

object (DistanceLimit)

الحدّ الذي يتم تطبيقه على إجمالي مسافة مسار المركبة في OptimizeToursResponse معيّن، تكون مسافة المسار هي مجموع جميع transitions.travel_distance_meters.

extraVisitDurationForVisitType

map (key: string, value: string (Duration format))

تحدِّد خريطة من سلاسل visitTypes إلى المدّات. المدة هي الوقت بالإضافة إلى VisitRequest.duration الذي يجب أخذه في الزيارات التي تستغرق visitTypes المحدّد. تؤدي مدّة الزيارة الإضافية هذه إلى إضافة تكلفة في حال تحديد costPerHour. لا يمكن أن تكون المفاتيح (مثل visitTypes) سلاسل فارغة.

إذا كان طلب الزيارة يتضمّن أنواعًا متعدّدة، ستتم إضافة مدة لكل نوع في الخريطة.

breakRule

object (BreakRule)

يصف جدول الراحة الذي سيتم فرضه على هذه المركبة. إذا كانت فارغة، لن يتم جدولة أي فواصل لهذه المركبة.

label

string

تُحدِّد تصنيفًا لهذه المركبة. يتم تسجيل هذا التصنيف في الردّ على أنّه vehicleLabel للعنصر ShipmentRoute المقابل.

ignore

boolean

إذا كانت القيمة صحيحة، يجب أن تكون usedIfRouteIsEmpty خطأ، وستظل هذه المركبة غير مستخدَمة.

إذا تم تنفيذ عملية شحن بواسطة مركبة تم تجاهلها في injectedFirstSolutionRoutes، يتم تخطّيها في الحلّ الأول، ولكن يمكن تنفيذها في الاستجابة.

إذا تم تنفيذ عملية شحن بواسطة مركبة تم تجاهلها في injectedSolutionConstraint وكان أي عملية استلام/تسليم مرتبطة بها مقيّدة بالبقاء على المركبة (أي عدم تخفيف القيود إلى المستوى RELAX_ALL_AFTER_THRESHOLD)، يتم تخطّيها في الردّ. إذا كانت الشحنة تحتوي على حقل allowedVehicleIndices غير فارغ وتم تجاهل جميع المركبات المسموح بها، يتم تخطّيها في الردّ.

travelDurationMultiple

number

تُحدِّد هذه السمة عاملاً مضاعِفًا يمكن استخدامه لزيادة أو تقليل أوقات التنقّل لهذه المركبة. على سبيل المثال، يعني ضبط هذا المقياس على 2.0 أنّ هذه المركبة أبطأ وأنّ مدد التنقّل فيها ضعف مدد التنقّل في المركبات العادية. ولا يؤثّر هذا المُضاعِف في مدّة الزيارة. ويؤثر ذلك في التكلفة في حال تحديد costPerHour أو costPerTraveledHour. يجب أن تكون هذه القيمة في النطاق [0.001 و1000.0]. في حال عدم ضبطه، تكون المركبة عادية، ويكون هذا المُضاعِف 1.0.

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

يُرجى الاطّلاع أيضًا على extraVisitDurationForVisitType أدناه.

TravelMode

وسائل النقل التي يمكن استخدامها من قِبل المركبات

يجب أن تكون هذه الإعدادات مجموعة فرعية من أوضاع التنقّل في واجهة برمجة التطبيقات "الطرق المفضّلة" في "منصّة خرائط Google"، راجِع: https://developers.google.com/maps/documentation/routes_preferred/reference/rest/Shared.Types/RouteTravelMode.

عمليات التعداد
TRAVEL_MODE_UNSPECIFIED وضع سفر غير محدّد، ما يعادل DRIVING
DRIVING وضع التنقّل المرتبط باتجاهات القيادة (سيارة، وما إلى ذلك)
WALKING وضع السفر المرتبط باتجاهات المشي

RouteModifiers

تُحاط مجموعة من الشروط الاختيارية التي يجب استيفاؤها عند احتساب مسارات المركبات. يشبه هذا الإجراء العنصر RouteModifiers في واجهة برمجة التطبيقات المفضّلة للمسارات في "منصّة خرائط Google". يُرجى الاطّلاع على: https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteModifiers.

تمثيل JSON
{
  "avoidTolls": boolean,
  "avoidHighways": boolean,
  "avoidFerries": boolean,
  "avoidIndoor": boolean
}
الحقول
avoidTolls

boolean

لتحديد ما إذا كنت تريد تجنُّب الطرق ذات الرسوم في الحالات المعقولة سيتم منح الأولوية للمسارات التي لا تتضمّن طرقًا ذات رسوم عبور. لا ينطبق إلا على وسائل النقل الآلية.

avoidHighways

boolean

يحدّد ما إذا كان يجب تجنُّب الطرق السريعة كلما أمكن ذلك. وسيتم منح الأولوية للمسارات التي لا تحتوي على طرق سريعة. لا ينطبق إلا على وسائل النقل الآلية.

avoidFerries

boolean

تُحدِّد ما إذا كان يجب تجنُّب العبّارات كلما أمكن ذلك. سيتم منح الأولوية للمسارات التي لا تتضمّن السفر عبر العبّارات. لا ينطبق إلا على وسائل النقل الآلية.

avoidIndoor

boolean

اختيارية: تحدِّد ما إذا كان يجب تجنُّب التنقّل داخل المباني حيثما أمكن. سيتم منح الأولوية للمسارات التي لا تتضمّن التنقّل داخل المباني. ينطبق ذلك على وضع السفر WALKING فقط.

UnloadingPolicy

سياسة حول كيفية تفريغ حمولة المركبة لا ينطبق إلا على الشحنات التي تتضمّن عملية استلام وتسليم.

يمكن شحن البضائع الأخرى في أي مكان على المسار بغض النظر عن unloadingPolicy.

عمليات التعداد
UNLOADING_POLICY_UNSPECIFIED سياسة تفريغ غير محدّدة، يجب أن تتم عمليات التسليم بعد عمليات الاستلام المقابلة لها.
LAST_IN_FIRST_OUT يجب أن تتم عمليات التسليم بترتيب عكسي لعمليات الاستلام.
FIRST_IN_FIRST_OUT يجب أن تتم عمليات التسليم بالترتيب نفسه الذي تم به استلام الطلبات.

LoadLimit

تُحدِّد الحد الأقصى للحمولة التي يمكن أن تحملها المركبة، مثلاً "يمكن أن تحمل هذه الشاحنة ما يصل إلى 3500 كيلوغرام فقط". يمكنك الاطّلاع على loadLimits.

تمثيل JSON
{
  "softMaxLoad": string,
  "costPerUnitAboveSoftMax": number,
  "startLoadInterval": {
    object (Interval)
  },
  "endLoadInterval": {
    object (Interval)
  },
  "maxLoad": string
}
الحقول
softMaxLoad

string (int64 format)

حدّ غير حاسم للحمل يمكنك الاطّلاع على costPerUnitAboveSoftMax.

costPerUnitAboveSoftMax

number

إذا تجاوز الحمولة softMaxLoad على مسار هذه المركبة، يتم تطبيق عقوبة التكلفة التالية (مرة واحدة فقط لكل مركبة): (الحِمولة - softMaxLoad) * costPerUnitAboveSoftMax. تُجمع جميع التكاليف ويجب أن تكون بالوحدة نفسها المستخدَمة في Shipment.penalty_cost.

startLoadInterval

object (Interval)

الفاصل الزمني المقبول لتحميل المركبة في بداية المسار

endLoadInterval

object (Interval)

الفاصل الزمني المقبول لتحميل المركبة في نهاية المسار

maxLoad

string (int64 format)

الحد الأقصى المسموح به للحمل

الفاصل الزمني

الفاصل الزمني لمقدار الحمل المقبول

تمثيل JSON
{
  "min": string,
  "max": string
}
الحقول
min

string (int64 format)

الحد الأدنى للحمل المقبول يجب أن تكون القيمة أكبر من أو تساوي 0. في حال تحديد كلاهما، يجب أن تكون minmax.

max

string (int64 format)

الحد الأقصى للحمل المقبول يجب أن تكون القيمة أكبر من أو تساوي 0. في حال عدم تحديد الحد الأقصى للحمولة، لا تفرض هذه الرسالة أي قيود عليه. في حال تحديد كلاهما، يجب أن تكون minmax.

DurationLimit

حدّ يحدّد الحدّ الأقصى لمدة مسار مركبة يمكن أن يكون صلبًا أو لينًا.

عند تحديد حقل حدّ أدنى غير صارم، يجب تحديد الحدّ الأقصى غير الصارم والتكلفة المرتبطة به معًا.

تمثيل JSON
{
  "maxDuration": string,
  "softMaxDuration": string,
  "quadraticSoftMaxDuration": string,
  "costPerHourAfterSoftMax": number,
  "costPerSquareHourAfterQuadraticSoftMax": number
}
الحقول
maxDuration

string (Duration format)

حدّ ثابت يفرض ألا تتجاوز المدة maxDuration

المدة بالثواني مع ما يصل إلى تسعة أرقام كسور، وتنتهي بـ "s". مثال: "3.5s".

softMaxDuration

string (Duration format)

الحدّ المقبول هو حدّ لا يفرض الحدّ الأقصى لمدة الرحلة، ولكن عند مخالفته، يتسبب في تحمّل المسار تكلفة. تضاف هذه التكلفة إلى التكاليف الأخرى المحدّدة في النموذج، باستخدام الوحدة نفسها.

يجب أن تكون softMaxDuration غير سالبة في حال تحديدها. إذا تمّ أيضًا تحديد maxDuration، يجب أن تكون softMaxDuration أقل من maxDuration.

المدة بالثواني مع ما يصل إلى تسعة أرقام كسور، وتنتهي بـ "s". مثال: "3.5s".

quadraticSoftMaxDuration

string (Duration format)

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

يجب أن تكون quadraticSoftMaxDuration غير سالبة في حال تحديدها. إذا تمّ تحديد maxDuration أيضًا، يجب أن تكون quadraticSoftMaxDuration أقل من maxDuration، ويجب ألا يزيد الفرق عن يوم واحد:

maxDuration - quadraticSoftMaxDuration <= 86400 seconds

المدة بالثواني مع ما يصل إلى تسعة أرقام كسور، وتنتهي بـ "s". مثال: "3.5s".

costPerHourAfterSoftMax

number

التكلفة لكل ساعة يتم تحصيلها في حال انتهاك الحدّ الأقصى softMaxDuration تكون التكلفة الإضافية 0 إذا كانت المدة أقل من الحدّ الأدنى، وإلا تعتمد التكلفة على المدة على النحو التالي:

  costPerHourAfterSoftMax * (duration - softMaxDuration)

يجب أن تكون التكلفة غير سالبة.

costPerSquareHourAfterQuadraticSoftMax

number

التكلفة لكل ساعة مربّعة يتمّ تحصيلها في حال انتهاك الحدّ الأقصى quadraticSoftMaxDuration.

تكون التكلفة الإضافية 0 إذا كانت المدة أقل من الحدّ الأدنى، وإلا تعتمد التكلفة على المدة على النحو التالي:

  costPerSquareHourAfterQuadraticSoftMax *
  (duration - quadraticSoftMaxDuration)^2

يجب أن تكون التكلفة غير سالبة.

DistanceLimit

حدّ يحدّد أقصى مسافة يمكن قطعها يمكن أن يكون صلبًا أو لينًا.

في حال تحديد حدّ أقصى غير حاسم، يجب تحديد كلّ من softMaxMeters وcostPerKilometerAboveSoftMax ويجب ألا يكونا سالبين.

تمثيل JSON
{
  "maxMeters": string,
  "softMaxMeters": string,
  "costPerKilometerBelowSoftMax": number,
  "costPerKilometerAboveSoftMax": number
}
الحقول
maxMeters

string (int64 format)

حدّ ثابت يفرض ألا تتجاوز المسافة maxMeters يجب أن يكون الحدّ غير سالب.

softMaxMeters

string (int64 format)

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

إذا تم تحديد softMaxMeters، يجب أن يكون أقل من maxMeters ويجب ألا يكون سالبًا.

costPerKilometerBelowSoftMax

number

التكلفة المتكبّدة لكل كيلومتر، والتي تزيد حتى softMaxMeters، باستخدام الصيغة:

  min(distanceMeters, softMaxMeters) / 1000.0 *
  costPerKilometerBelowSoftMax.

هذه التكلفة غير متاحة في routeDistanceLimit.

costPerKilometerAboveSoftMax

number

التكلفة لكل كيلومتر يتم تحصيلها إذا كانت المسافة تتجاوز الحدّ الأقصى softMaxMeters. تكون التكلفة الإضافية 0 إذا كانت المسافة أقل من الحدّ الأقصى، وإلا تكون الصيغة المستخدَمة لاحتساب التكلفة على النحو التالي:

  (distanceMeters - softMaxMeters) / 1000.0 *
  costPerKilometerAboveSoftMax.

يجب أن تكون التكلفة غير سالبة.

BreakRule

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

  • أثناء التنقّل بين زيارتَين (بما في ذلك الوقت قبل الزيارة مباشرةً أو بعدها مباشرةً، ولكن ليس في منتصف الزيارة)، وفي هذه الحالة يتم تمديد وقت التنقّل المقابل بين الزيارات،
  • أو قبل بدء تشغيل المركبة (قد لا يتم تشغيل المركبة في منتصف فترة الراحة)، وفي هذه الحالة لا يؤثر ذلك في وقت بدء تشغيل المركبة.
  • أو بعد نهاية المركبة (بالمثل، مع وقت نهاية المركبة).
تمثيل JSON
{
  "breakRequests": [
    {
      object (BreakRequest)
    }
  ],
  "frequencyConstraints": [
    {
      object (FrequencyConstraint)
    }
  ]
}
الحقول
breakRequests[]

object (BreakRequest)

تسلسل الفواصل اطّلِع على رسالة BreakRequest.

frequencyConstraints[]

object (FrequencyConstraint)

قد تنطبق عدة FrequencyConstraint. يجب أن تستوفي جميعها BreakRequest هذا BreakRule. يُرجى الاطّلاع على FrequencyConstraint.

BreakRequest

يجب معرفة تسلسل الفواصل (أي عددها وترتيبها) التي تنطبق على كل مركبة مسبقًا. تحدِّد العناصر BreakRequest المتكرّرة هذا التسلسل بالترتيب الذي يجب أن تحدث به. قد تتداخل الفترات الزمنية (earliestStartTime / latestStartTime)، ولكن يجب أن تكون متوافقة مع الطلب (يتم وضع علامة في المربّع بجانب هذا الخيار).

تمثيل JSON
{
  "earliestStartTime": string,
  "latestStartTime": string,
  "minDuration": string
}
الحقول
earliestStartTime

string (Timestamp format)

مطلوب. الحدّ الأدنى (شاملاً) لبداية الاستراحة

يجب أن يكون طابعًا زمنيًا بالتنسيق RFC3339 UTC "Zulu"‎ وبدقة تصل إلى نانوثانية وما يصل إلى تسعة أرقام كسور. أمثلة: "2014-10-02T15:01:23Z" و"2014-10-02T15:01:23.045123456Z"

latestStartTime

string (Timestamp format)

مطلوب. الحدّ الأقصى (شاملاً) لبداية الاستراحة

يجب أن يكون طابعًا زمنيًا بالتنسيق RFC3339 UTC "Zulu"‎ وبدقة تصل إلى نانوثانية وما يصل إلى تسعة أرقام كسور. أمثلة: "2014-10-02T15:01:23Z" و"2014-10-02T15:01:23.045123456Z"

minDuration

string (Duration format)

مطلوب. الحد الأدنى لمدة الفاصل يجب أن تكون موجبة.

المدة بالثواني مع ما يصل إلى تسعة أرقام كسور، وتنتهي بـ "s". مثال: "3.5s".

FrequencyConstraint

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

{
   minBreakDuration { seconds: 3600 }         # 1 hour.
   maxInterBreakDuration { seconds: 39600 }  # 11 hours (12 - 1 = 11).
}

يجب أن يراعي توقيت الفواصل الزمنية ومدتها في الحلّ جميع هذه القيود، بالإضافة إلى الفترات الزمنية والحد الأدنى من المدّات المحدّدة في BreakRequest.

قد ينطبق FrequencyConstraint عمليًا على الفواصل غير المتتالية. على سبيل المثال، يراعي الجدول الزمني التالي مثال "ساعة واحدة كل 12 ساعة":

  04:00 vehicle start
   .. performing travel and visits ..
  09:00 1 hour break
  10:00 end of the break
   .. performing travel and visits ..
  12:00 20-min lunch break
  12:20 end of the break
   .. performing travel and visits ..
  21:00 1 hour break
  22:00 end of the break
   .. performing travel and visits ..
  23:59 vehicle end
تمثيل JSON
{
  "minBreakDuration": string,
  "maxInterBreakDuration": string
}
الحقول
minBreakDuration

string (Duration format)

مطلوب. الحد الأدنى لمدة الفاصل لهذا القيد غير سالب اطّلِع على وصف FrequencyConstraint.

المدة بالثواني مع ما يصل إلى تسعة أرقام كسور، وتنتهي بـ "s". مثال: "3.5s".

maxInterBreakDuration

string (Duration format)

مطلوب. الحد الأقصى المسموح به لأي فاصل زمني في المسار الذي لا يتضمّن فاصلًا duration >= minBreakDuration جزئيًا على الأقل يجب أن تكون موجبة.

المدة بالثواني مع ما يصل إلى تسعة أرقام كسور، وتنتهي بـ "s". مثال: "3.5s".

DurationDistanceMatrix

تُحدِّد مصفوفة المدة والمسافة من مواقع بدء الزيارة والمركبة إلى مواقع انتهاء الزيارة والمركبة.

تمثيل JSON
{
  "rows": [
    {
      object (Row)
    }
  ],
  "vehicleStartTag": string
}
الحقول
rows[]

object (Row)

تحدّد صفوف مصفوفة المدة والمسافة. يجب أن يحتوي على عدد عناصر يساوي ShipmentModel.duration_distance_matrix_src_tags.

vehicleStartTag

string

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

يجب أن يتطابق كل بدء مركبة مع مصفوفة واحدة بالضبط، أي أن يتطابق حقل startTags واحد بالضبط مع vehicleStartTag في مصفوفة (وهذه المصفوفة فقط).

يجب أن تحتوي جميع المصفوفات على vehicleStartTag مختلف.

الصف

تحدّد صفًا من مصفوفة المدة والمسافة.

تمثيل JSON
{
  "durations": [
    string
  ],
  "meters": [
    number
  ]
}
الحقول
durations[]

string (Duration format)

قيم المدة لصف معيّن يجب أن يحتوي على عدد عناصر يساوي ShipmentModel.duration_distance_matrix_dst_tags.

المدة بالثواني مع ما يصل إلى تسعة أرقام كسور، وتنتهي بـ "s". مثال: "3.5s".

meters[]

number

قيم المسافة لصف معيّن إذا لم تكن أي تكاليف أو قيود تشير إلى المسافات في النموذج، يمكن ترك هذا الحقل فارغًا، وإلا يجب أن يحتوي على عدد عناصر يساوي durations.

TransitionAttributes

تُحدِّد سمات الانتقالات بين زيارتَين متتاليتَين على مسار. قد تنطبق عدة TransitionAttributes على عملية النقل نفسها: في هذه الحالة، تُجمع كل التكاليف الإضافية وينطبق الحدّ الأقصى أو القيود الأكثر صرامة (وفقًا للدلالات الطبيعية "و").

تمثيل JSON
{
  "srcTag": string,
  "excludedSrcTag": string,
  "dstTag": string,
  "excludedDstTag": string,
  "cost": number,
  "costPerKilometer": number,
  "distanceLimit": {
    object (DistanceLimit)
  },
  "delay": string
}
الحقول
srcTag

string

علامات تحدّد مجموعة التحولات (src->dst) التي تنطبق عليها هذه السمات

تتطابق زيارة مصدر أو بدء مركبة إذا كان حقل VisitRequest.tags أو Vehicle.start_tags يحتوي على srcTag أو لا يحتوي على excludedSrcTag (حسب الحقل من هذين الحقلين غير الفارغ).

excludedSrcTag

string

يمكنك الاطّلاع على srcTag. يجب أن يكون srcTag أو excludedSrcTag واحدًا فقط غير فارغ.

dstTag

string

تتطابق زيارة الوجهة أو نهاية المركبة إذا كان الحقل VisitRequest.tags أو Vehicle.end_tags يتضمّن dstTag أو لا يتضمّن excludedDstTag (حسب الحقل من هذين الحقلين غير فارغ).

excludedDstTag

string

يمكنك الاطّلاع على dstTag. يجب أن يكون dstTag أو excludedDstTag واحدًا فقط غير فارغ.

cost

number

تحدّد تكلفة لتنفيذ هذا النقل. تكون هذه القيمة بالوحدة نفسها المستخدَمة في جميع التكاليف الأخرى في النموذج، ويجب ألا تكون سالبة. ويتم تطبيقها بالإضافة إلى جميع التكاليف الحالية الأخرى.

costPerKilometer

number

تحدّد تكلفة لكل كيلومتر تُطبَّق على المسافة المقطوعة أثناء تنفيذ هذا النقل. ويضاف إلى أي Vehicle.cost_per_kilometer محدّد على المركبات.

distanceLimit

object (DistanceLimit)

تحدّد هذه السمة حدًا أقصى للمسافة التي يتم قطعها أثناء تنفيذ هذا الانتقال.

اعتبارًا من حزيران (يونيو) 2021، أصبح بإمكانك استخدام الحدود الدنيا فقط.

delay

string (Duration format)

تُحدِّد هذه السمة تأخّرًا يحدث عند تنفيذ هذا الانتقال.

يحدث هذا التأخير دائمًا بعد إنهاء زيارة المصدر وقبل بدء زيارة الوجهة.

المدة بالثواني مع ما يصل إلى تسعة أرقام كسور، وتنتهي بـ "s". مثال: "3.5s".

ShipmentTypeIncompatibility

تُحدِّد حالات عدم التوافق بين الشحنات استنادًا إلى shipmentType. يتم حظر ظهور الشحنات غير المتوافقة على المسار نفسه استنادًا إلى وضع عدم التوافق.

تمثيل JSON
{
  "types": [
    string
  ],
  "incompatibilityMode": enum (IncompatibilityMode)
}
الحقول
types[]

string

قائمة بالأنواع غير المتوافقة الشحنتان اللتان تتضمّنان shipment_types مختلفًا عن تلك المدرَجة هما "غير متوافقتَين".

incompatibilityMode

enum (IncompatibilityMode)

الوضع الذي تم تطبيقه على عدم التوافق

IncompatibilityMode

أوضاع تحدّد كيفية حظر ظهور الشحنات غير المتوافقة على المسار نفسه

عمليات التعداد
INCOMPATIBILITY_MODE_UNSPECIFIED وضع عدم التوافق غير محدّد يجب عدم استخدام هذه القيمة مطلقًا.
NOT_PERFORMED_BY_SAME_VEHICLE في هذا الوضع، لا يمكن مطلقًا أن تشترك شحنتان من أنواع غير متوافقة في المركبة نفسها.
NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY

بالنسبة إلى شحنتَين بنوعَين غير متوافقَين في وضع عدم التوافق NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY:

  • إذا كان كلاهما لعملية استلام فقط (بدون عمليات تسليم) أو لعملية تسليم فقط (بدون عمليات استلام)، لا يمكنهما مشاركة المركبة نفسها على الإطلاق.
  • إذا كانت إحدى الشحنتَين تشمل عملية تسليم والأخرى عملية استلام، يمكن للشحنتَين استخدام المركبة نفسها إذا تم تسليم الشحنة الأولى قبل استلام الشحنة الثانية.

ShipmentTypeRequirement

تُحدِّد المتطلبات بين الشحنات استنادًا إلى shipmentType. يتم تحديد تفاصيل المتطلّب حسب وضع المتطلّب.

تمثيل JSON
{
  "requiredShipmentTypeAlternatives": [
    string
  ],
  "dependentShipmentTypes": [
    string
  ],
  "requirementMode": enum (RequirementMode)
}
الحقول
requiredShipmentTypeAlternatives[]

string

قائمة بأنواع الشحن البديلة المطلوبة من قِبل dependentShipmentTypes

dependentShipmentTypes[]

string

تتطلّب جميع الشحنات التي تحتوي على نوع في الحقل dependentShipmentTypes زيارة شحنة واحدة على الأقل من النوع requiredShipmentTypeAlternatives على المسار نفسه.

ملاحظة: لا يُسمح بسلسلة المتطلبات التي تعتمد فيها shipmentType على نفسها.

requirementMode

enum (RequirementMode)

الوضع الذي تم تطبيقه على الشرط

RequirementMode

الأوضاع التي تحدّد مظهر الشحنات التابعة على مسار معيّن

عمليات التعداد
REQUIREMENT_MODE_UNSPECIFIED وضع متطلبات غير محدّد يجب عدم استخدام هذه القيمة مطلقًا.
PERFORMED_BY_SAME_VEHICLE في هذا الوضع، يجب أن تتشارك جميع الشحنات "التابعة" المركبة نفسها مع شحنة واحدة على الأقل من الشحنات "المطلوبة".
IN_SAME_VEHICLE_AT_PICKUP_TIME

في وضع IN_SAME_VEHICLE_AT_PICKUP_TIME، يجب أن تتضمّن جميع الشحنات "التابعة" شحنة "مطلوبة" واحدة على الأقل في المركبة في وقت استلامها.

لذلك، يجب أن يتضمّن استلام الشحنة "التابع" أيًا مما يلي:

  • شحنة "مطلوبة" للتسليم فقط تم تسليمها على المسار بعد
  • شحنة "مطلوبة" تم استلامها على المسار قبلها، وإذا كانت الشحنة "المطلوبة" لها عملية تسليم، يجب تنفيذ عملية التسليم هذه بعد استلام الشحنة "التابعة".
IN_SAME_VEHICLE_AT_DELIVERY_TIME كما هو الحال من قبل، باستثناء أنّ الشحنات "التابعة" يجب أن تتضمّن شحنة "مطلوب" على مركبتها في وقت تسليمها.

PrecedenceRule

قاعدة الأولوية بين حدثَين (كل حدث هو استلام أو تسليم شحنة): يجب أن يبدأ الحدث "الثاني" بعد offsetDuration على الأقل من بدء الحدث "الأول".

يمكن أن تشير عدة أولويات إلى الأحداث نفسها (أو ذات الصلة)، على سبيل المثال: "يتم استلام الطلب (ب) بعد تسليم الطلب (أ)" و "يتم استلام الطلب (ج) بعد استلام الطلب (ب)".

بالإضافة إلى ذلك، لا تسري الأولويات إلا عند تنفيذ كلتا الشحنتَين ويتم تجاهلها بخلاف ذلك.

تمثيل JSON
{
  "firstIsDelivery": boolean,
  "secondIsDelivery": boolean,
  "offsetDuration": string,
  "firstIndex": integer,
  "secondIndex": integer
}
الحقول
firstIsDelivery

boolean

يشير إلى ما إذا كان الحدث "الأول" هو عملية إرسال.

secondIsDelivery

boolean

يشير إلى ما إذا كان الحدث "الثاني" تسليمًا.

offsetDuration

string (Duration format)

الفاصل الزمني بين الحدث "الأول" والحدث "الثاني". يمكن أن تكون سلبية.

المدة بالثواني مع ما يصل إلى تسعة أرقام كسور، وتنتهي بـ "s". مثال: "3.5s".

firstIndex

integer

فهرس الشحنة للحدث "الأول". يجب تحديد هذا الحقل.

secondIndex

integer

فهرس الشحنة للحدث "الثاني". يجب تحديد هذا الحقل.