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 حسب التوقيت العالمي المنسَّق (UTC) 1 كانون الثاني (يناير) 1970 (أي الثواني: 0 و nanos: 0).

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

globalEndTime

string (Timestamp format)

في حال ترك هذه السياسة بدون ضبط، سيتم استخدام الوضع التلقائي 00:00:00 حسب التوقيت العالمي المنسَّق (UTC) 1 كانون الثاني (يناير) 1971 (أي الثواني: 31536000 وnanos: 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.
  • مركبة واحدة تبدأ مسارها في locA وتنتهي في locB، باستخدام المصفوفة "سريعة"
  • مركبة واحدة تبدأ مسارها في locB وتنتهي في locB، باستخدام المصفوفة "بطيئة"
  • مركبة واحدة تبدأ مسارها في locB وتنتهي في locB، باستخدام المصفوفة "سريعة"
  • طلب زيارة واحد للاستلام في الموقع الجغرافي
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) (resp. تحدّد 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)

مجموعات من shipping_types (أنواع_الشحن) غير المتوافقة (يُرجى الاطّلاع على 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" وما إلى ذلك. إذا لم يظهر مفتاح معيّن في الخريطة، سيتم اعتبار التحميل المقابل فارغًا.

عنصر يحتوي على قائمة من أزواج "key": value. مثال: { "name": "wrench", "mass": "1.3kg", "count": "3" }

allowedVehicleIndices[]

integer

تمثّل هذه السمة مجموعة المركبات التي يمكنها تنفيذ هذه الشحنة. ويمكن لجميع المركبات تنفيذ هذا الإجراء إذا كانت فارغة. تتوفّر المركبات حسب الفهرس الخاص بها في قائمة vehicles الخاصة بـ ShipmentModel.

costsPerVehicle[]

number

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

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

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

costsPerVehicleIndices[]

integer

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

pickupToDeliveryAbsoluteDetourLimit

string (Duration format)

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

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

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

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

مدة بالثواني يصل عددها إلى تسعة أرقام كسرية وتنتهي بـ "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

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

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

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

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

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.

عنصر يحتوي على قائمة من أزواج "key": value. مثال: { "name": "wrench", "mass": "1.3kg", "count": "3" }

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].

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

تتضمن هذه الطريقة نقطة وسيطة. تحدد نقاط الطرق مواقع الوصول والمغادرة فيvisitRequests ومواقع بدء ونهاية المركبات.

تمثيل 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، حيث يشير الرقم 0 إلى عنوان باتجاه الشمال، بينما يحدد الرقم 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` <= `softStartTime` <= `endTime` and
  0 <= `startTime` <= `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),
  "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.

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. في حال عدم ظهور مفتاح معيّن في هذه الخريطة، سيتم اعتبار السعة المقابلة غير محدودة.

عنصر يحتوي على قائمة من أزواج "key": value. مثال: { "name": "wrench", "mass": "1.3kg", "count": "3" }

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) سلاسل فارغة.

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

عنصر يحتوي على قائمة من أزواج "key": value. مثال: { "name": "wrench", "mass": "1.3kg", "count": "3" }

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 وضع السفر المقابل لاتجاهات المشي.

UnloadingPolicy

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

ويمكن إجراء عمليات شحن أخرى مجانًا في أي مكان على المسار بشكل مستقل عن unloadingPolicy.

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

LoadLimit

تحدّد هذه السمة حد الحمولة الذي ينطبق على أي مركبة، على سبيل المثال "لا يمكن لهذه الشاحنة حمل أكثر من 3, 500 كلغ". يمكنك الاطّلاع على 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,
  "costPerKilometerAboveSoftMax": number
}
الحقول
maxMeters

string (int64 format)

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

softMaxMeters

string (int64 format)

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

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

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/2021، ستتم إتاحة الحدود القصوى فقط.

delay

string (Duration format)

تحدِّد هذه السياسة المهلة الزمنية عند تنفيذ عملية النقل هذه.

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

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

ShipmentTypeIncompatibility

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

تمثيل 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

تحدد هذه السمة المتطلبات بين عمليات الشحن استنادًا إلى نوع الشحن الخاص بها. يتم تحديد تفاصيل المتطلبات من خلال وضع المتطلبات.

تمثيل 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

مؤشر الشحن للحدث "الثاني" يجب تحديد هذا الحقل.