ShipmentModel

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

  • تكلفة توجيه المركبات (مجموع التكلفة لكل الوقت الإجمالي والتكلفة لكل وقت السفر والتكلفة الثابتة لجميع المركبات)
  • عقوبات الشحن غير المنفَّذ
  • تكلفة المدة الإجمالية لعمليات الشحن
تمثيل JSON
{
  "shipments": [
    {
      object (Shipment)
    }
  ],
  "vehicles": [
    {
      object (Vehicle)
    }
  ],
  "objectives": [
    {
      object (Objective)
    }
  ],
  "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)

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

objectives[]

object (Objective)

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

تجريبي: يمكنك الاطّلاع على https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request لمزيد من التفاصيل.

globalStartTime

string (Timestamp format)

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

يجب أن يكون النطاق الزمني للنموذج أقل من عام واحد، أي يجب أن يكون الفرق بين globalEndTime وglobalStartTime أقل من 31536000 ثانية.

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

يستخدم المعيار RFC 3339، حيث يكون الناتج الذي يتم إنشاؤه مُمثلاً بالتوقيت العالمي المنسَّق مع حرف Z في النهاية ويستخدم الأرقام الجزئية 0 أو 3 أو 6 أو 9. تُقبل أيضًا المعادلات الأخرى التي لا تستخدم حرف Z. أمثلة: "2014-10-02T15:01:23Z" أو "2014-10-02T15:01:23.045123456Z" أو "2014-10-02T15:01:23+05:30".

globalEndTime

string (Timestamp format)

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

يستخدم المعيار RFC 3339، حيث يكون الناتج الذي يتم إنشاؤه مُمثلاً بالتوقيت العالمي المنسَّق مع حرف Z في النهاية ويستخدم الأرقام الجزئية 0 أو 3 أو 6 أو 9. تُقبل أيضًا المعادلات الأخرى التي لا تستخدم حرف Z. أمثلة: "2014-10-02T15:01:23Z" أو "2014-10-02T15:01:23.045123456Z" أو "2014-10-02T15:01:23+05:30".

globalDurationCostPerHour

number

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

durationDistanceMatrices[]

object (DurationDistanceMatrix)

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

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

  • هناك موقعان جغرافيان: locA وlocB.
  • مركبة واحدة تبدأ مسارها في 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 وتنتهي فيه، باستخدام المصفوفة "slow".
  • مركبة واحدة تبدأ مسارها وتنتهي منه في الموقع locB، باستخدام مصفوفة "سريع".
  • طلب واحد لزيارة مكان الاستلام في locC
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)

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

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

إذا تم تحديد كل من الحدود النسبية والمطلقة في الشحنة نفسها، سيتم استخدام الحد الأكثر تقييدًا لكل زوج ممكن من عمليات الاستلام/التسليم. اعتبارًا من 10/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))

إذا تم تحديد كل من الحدود النسبية والمطلقة في الشحنة نفسها، سيتم استخدام الحد الأكثر تقييدًا لكل زوج ممكن من عمليات الاستلام/التسليم. اعتبارًا من 10/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,
  "avoidUTurns": boolean
}
الحقول
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 المقابل.

avoidUTurns

boolean

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

تجريبية: يُرجى الاطّلاع على https://developers.google.com/maps/tt/route-optimization/experimental/u-turn-avoidance/make-request لمزيد من التفاصيل.

LatLng

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

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

number

تمثّل هذه السمة خط العرض بالدرجات. يجب أن يكون ضمن النطاق [-90.0, +90.0].

longitude

number

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

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

تغليف نقطة طريق تحدّد نقاط الطريق المواقع الجغرافية للوصول والمغادرة في VisitRequests، والمواقع الجغرافية للبدء والانتهاء في Vehicles.

تمثيل JSON
{
  "sideOfRoad": boolean,
  "vehicleStopover": 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

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

vehicleStopover

boolean

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

تجريبي: قد يتغيّر سلوك هذا الحقل أو يتوقف عن الوجود في المستقبل.

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

object (Location)

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

placeId

string

تمثّل هذه السمة رقم تعريف المكان الخاص بنقطة الاهتمام المرتبط بنقطة الطريق.

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

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

تتضمّن هذه السمة موقعًا جغرافيًا (نقطة جغرافية واتجاهًا اختياريًا).

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

يستخدم المعيار RFC 3339، حيث يكون الناتج الذي يتم إنشاؤه مُمثلاً بالتوقيت العالمي المنسَّق مع حرف Z في النهاية ويستخدم الأرقام الجزئية 0 أو 3 أو 6 أو 9. تُقبل أيضًا المعادلات الأخرى التي لا تستخدم حرف Z. أمثلة: "2014-10-02T15:01:23Z" أو "2014-10-02T15:01:23.045123456Z" أو "2014-10-02T15:01:23+05:30".

endTime

string (Timestamp format)

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

يستخدم المعيار RFC 3339، حيث يكون الناتج الذي يتم إنشاؤه مُمثلاً بالتوقيت العالمي المنسَّق مع حرف Z في النهاية ويستخدم الأرقام الجزئية 0 أو 3 أو 6 أو 9. تُقبل أيضًا المعادلات الأخرى التي لا تستخدم حرف Z. أمثلة: "2014-10-02T15:01:23Z" أو "2014-10-02T15:01:23.045123456Z" أو "2014-10-02T15:01:23+05:30".

softStartTime

string (Timestamp format)

تمثّل هذه السمة وقت البدء المحدّد للفترة الزمنية.

يستخدم المعيار RFC 3339، حيث يكون الناتج الذي يتم إنشاؤه مُمثلاً بالتوقيت العالمي المنسَّق مع حرف Z في النهاية ويستخدم الأرقام الجزئية 0 أو 3 أو 6 أو 9. تُقبل أيضًا المعادلات الأخرى التي لا تستخدم حرف Z. أمثلة: "2014-10-02T15:01:23Z" أو "2014-10-02T15:01:23.045123456Z" أو "2014-10-02T15:01:23+05:30".

softEndTime

string (Timestamp format)

تمثّل هذه السمة وقت انتهاء الفترة الزمنية.

يستخدم المعيار RFC 3339، حيث يكون الناتج الذي يتم إنشاؤه مُمثلاً بالتوقيت العالمي المنسَّق مع حرف Z في النهاية ويستخدم الأرقام الجزئية 0 أو 3 أو 6 أو 9. تُقبل أيضًا المعادلات الأخرى التي لا تستخدم حرف Z. أمثلة: "2014-10-02T15:01:23Z" أو "2014-10-02T15:01:23.045123456Z" أو "2014-10-02T15:01:23+05:30".

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 Maps Platform Routes API، راجِع: https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteTravelMode

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

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

RouteModifiers

تتضمّن هذه السمة مجموعة من الشروط الاختيارية التي يجب استيفاؤها عند احتساب مسارات المركبات. يشبه ذلك RouteModifiers في واجهة برمجة التطبيقات "المسارات المفضّلة" من Google Maps Platform. يمكنك الاطّلاع على: 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,
  "costPerKilometer": {
    object (LoadCost)
  },
  "costPerTraveledHour": {
    object (LoadCost)
  }
}
الحقول
softMaxLoad

string (int64 format)

حدّ أقصى مرن لعملية التحميل يمكنك الاطّلاع على costPerUnitAboveSoftMax.

costPerUnitAboveSoftMax

number

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

startLoadInterval

object (Interval)

تمثّل هذه السمة الفاصل الزمني المقبول لتحميل المركبة في بداية المسار.

endLoadInterval

object (Interval)

تعرض هذه السمة الفترة الزمنية المقبولة لتحميل المركبة في نهاية المسار.

maxLoad

string (int64 format)

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

costPerKilometer

object (LoadCost)

تكلفة نقل وحدة واحدة من الحمولة لمسافة كيلومتر واحد لهذه المركبة يمكن استخدام ذلك كبديل لاستهلاك الوقود: إذا كان الحمل عبارة عن وزن (بالنيوتن)، فإنّ الحمل*كيلومتر يكون له بُعد الطاقة.

تجريبي: يمكنك الانتقال إلى https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request لمزيد من التفاصيل.

costPerTraveledHour

object (LoadCost)

تكلفة التنقّل بوحدة حمولة واحدة خلال ساعة واحدة لهذه المركبة

تجريبي: يمكنك الانتقال إلى https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request لمزيد من التفاصيل.

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

فترة مبالغ التحميل المقبولة

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

string (int64 format)

الحد الأدنى المقبول للتحميل يجب أن تكون القيمة ≥ 0. إذا تم تحديد كليهما، يجب أن تكون قيمة min أصغر من أو تساوي قيمة max.

max

string (int64 format)

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

LoadCost

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

  • min(load, loadThreshold) * costPerUnitBelowThreshold
  • max(0, load - loadThreshold) * costPerUnitAboveThreshold

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

load_limit {
  key: "weight"
  value {
    costPerKilometer {
      loadThreshold: 15
      costPerUnitBelowThreshold: 2.0
      costPerUnitAboveThreshold: 10.0
    }
  }
}

ومسارها هو البدء، والاستلام، والاستلام، والتسليم، والتسليم، والانتهاء مع عمليات الانتقال التالية:

transition { vehicle_load['weight'] { amount: 0 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 20 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
             travelDistanceMeters: 1000.0 }

عندئذٍ تكون التكلفة التي تتحمّلها هذه LoadCost هي (cost_below * load_below * kilometers + cost_above * load_above * kms)

  • الانتقال 0: 0.0
  • الانتقال 1: 2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
  • المرحلة الانتقالية 2: 2.0 * 15 * 1.0 + 10.0 * (20 - 15) * 1.0 = 80.0
  • الانتقال 3: 2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
  • الانتقال 4: 0.0

إذًا، يكون LoadCost على طول المسار 120.0.

ومع ذلك، إذا كان المسار هو start,pickup,delivery,pickup,delivery,end مع عمليات الانتقال:

transition { vehicle_load['weight'] { amount: 0 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
             travelDistanceMeters: 1000.0 }

عندئذٍ تكون التكلفة التي تتحمّلها LoadCost هي

  • الانتقال 0: 0.0
  • الانتقال 1: 2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
  • الانتقال 2: 0.0
  • الانتقال 3: 2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
  • الانتقال 4: 0.0

في هذه الحالة، تكون قيمة LoadCost على طول المسار 40.0.

LoadCost يجعل الحلول التي تتضمّن انتقالات محمّلة بشكل كبير أكثر تكلفة.

تجريبي: يمكنك الانتقال إلى https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request لمزيد من التفاصيل.

تمثيل JSON
{
  "loadThreshold": string,
  "costPerUnitBelowThreshold": number,
  "costPerUnitAboveThreshold": number
}
الحقول
loadThreshold

string (int64 format)

مقدار الحمل الذي يتغيّر عنده سعر نقل وحدة الحمل من costPerUnitBelowThreshold إلى costPerUnitAboveThreshold. يجب أن تكون القيمة >= 0.

costPerUnitBelowThreshold

number

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

costPerUnitAboveThreshold

number

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

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)

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

يستخدم المعيار RFC 3339، حيث يكون الناتج الذي يتم إنشاؤه مُمثلاً بالتوقيت العالمي المنسَّق مع حرف Z في النهاية ويستخدم الأرقام الجزئية 0 أو 3 أو 6 أو 9. تُقبل أيضًا المعادلات الأخرى التي لا تستخدم حرف Z. أمثلة: "2014-10-02T15:01:23Z" أو "2014-10-02T15:01:23.045123456Z" أو "2014-10-02T15:01:23+05:30".

latestStartTime

string (Timestamp format)

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

يستخدم المعيار RFC 3339، حيث يكون الناتج الذي يتم إنشاؤه مُمثلاً بالتوقيت العالمي المنسَّق مع حرف Z في النهاية ويستخدم الأرقام الجزئية 0 أو 3 أو 6 أو 9. تُقبل أيضًا المعادلات الأخرى التي لا تستخدم حرف Z. أمثلة: "2014-10-02T15:01:23Z" أو "2014-10-02T15:01:23.045123456Z" أو "2014-10-02T15:01:23+05:30".

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"

الهدف

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

تجريبي: يمكنك الاطّلاع على https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request لمزيد من التفاصيل.

تمثيل JSON
{
  "type": enum (Type),
  "weight": number
}
الحقول
type

enum (Type)

نوع الهدف.

weight

number

مقدار أهمية هذا الهدف مقارنةً بالأهداف الأخرى يمكن أن يكون هذا أي رقم غير سالب، ولا يلزم أن يكون مجموع الأوزان 1. تكون الأوزان تلقائيًا 1.0.

النوع

نوع الهدف الذي سيتم ربطه بمجموعة من التكاليف.

عمليات التعداد
DEFAULT سيتم استخدام مجموعة تلقائية من التكاليف لضمان التوصّل إلى حلّ معقول. ملاحظة: يمكن استخدام هذا الهدف بمفرده، ولكن سيتم أيضًا إضافته دائمًا بالوزن 1.0، كأساس، إلى الأهداف التي يحدّدها المستخدم، إذا لم يكن موجودًا من قبل.
MIN_DISTANCE أهداف "الحدّ الأدنى" تقليل إجمالي المسافة المقطوعة
MIN_WORKING_TIME تقليل إجمالي وقت العمل، الذي يتم جمعه على مستوى جميع المركبات
MIN_TRAVEL_TIME كما هو موضّح أعلاه، ولكن مع التركيز على مدة الرحلة فقط.
MIN_NUM_VEHICLES تقليل عدد المركبات المستخدَمة

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 على عملية الانتقال نفسها: في هذه الحالة، يتم جمع كل التكاليف الإضافية ويتم تطبيق القيد أو الحد الأكثر صرامة (باتّباع دلالات "AND" الطبيعية).

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

string

علامات تحدّد مجموعة عمليات الانتقال (من المصدر إلى الوجهة) التي تنطبق عليها هذه السمات.

تتطابق زيارة المصدر أو بدء تشغيل المركبة إذا كان الحقل 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/06، لا يمكن استخدام سوى الحدود المرنة.

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

في هذا الوضع، لا يمكن أبدًا أن تكون شحنتان من أنواع غير متوافقة في المركبة نفسها في الوقت نفسه:

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

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 على الأقل من بدء الحدث "الأول".

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

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

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

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