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، قد تحتاج إلى ضبط هذه النافذة على فاصل زمني أصغر لتحسين الأداء (على سبيل المثال، في حال وضع نموذج ليوم واحد، يجب ضبط الحدود الزمنية العالمية على ذلك اليوم). في حال ترك السياسة بدون ضبط، سيتم استخدام يوم 1 كانون الثاني (يناير) 1970 (أي الثواني: 0، nanos: 0) وفقًا بالتوقيت العالمي المنسّق (UTC) كإعداد تلقائي.

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

globalEndTime

string (Timestamp format)

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

طابع زمني بتنسيق RFC3339 حسب التوقيت العالمي المنسَّق (UTC) "زولو" بدقة نانوثانية وما يصل إلى تسعة أرقام كسرية. أمثلة: "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.
  • مركبة واحدة تبدأ مسارها عند locA وتنتهي عند locA.
  • طلب زيارة لاستلام واحد في الموقع الجغرافي
model {
  vehicles { startTags: "locA"  endTags: "locA" }
  shipments { pickups { tags: "locB" } }
  durationDistanceMatrixSrcTags: "locA"
  durationDistanceMatrixSrcTags: "locB"
  durationDistanceMatrixDstTags: "locA"
  durationDistanceMatrixDstTags: "locB"
  durationDistanceMatrices {
    rows {  # from: locA
      durations { seconds: 0 }   meters: 0    # to: locA
      durations { seconds: 100 } meters: 1000 # to: locB
    }
    rows {  # from: locB
      durations { seconds: 102 } meters: 990 # to: locA
      durations { seconds: 0 }   meters: 0   # to: locB
    }
  }
}
  • هناك ثلاثة مواقع: locA وlocB وlocC.
  • مركبة واحدة تبدأ مسارها عند الموقع الجغرافي المحلي وتنتهي عند تحديد الموقع الجغرافي الحالي باستخدام مصفوفة "سريعة"
  • مركبة واحدة تبدأ مسارها في locB وتنتهي في locB، باستخدام المصفوفة "بطيء".
  • مركبة واحدة تبدأ مسارها عند الموقع الجغرافي وتنتهي عند انطلاقها باستخدام مصفوفة "سريع"
  • هناك طلب زيارة لاستلام واحد في 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) إلى الزيارات الأخرى في المصفوفة 1.

تتوافق العلامات مع 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) في المصفوفة 1.

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

transitionAttributes[]

object (TransitionAttributes)

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

shipmentTypeIncompatibilities[]

object (ShipmentTypeIncompatibility)

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

shipmentTypeRequirements[]

object (ShipmentTypeRequirement)

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

precedenceRules[]

object (PrecedenceRule)

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

maxActiveVehicles

integer

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

الشحن

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

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

string

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

pickups[]

object (VisitRequest)

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

deliveries[]

object (VisitRequest)

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

loadDemands

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

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

عنصر يحتوي على قائمة بأزواج "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].

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

يتم تغليف نقطة وسيطة. تشير نقاط الطرق إلى مواقع وصول ومغادرة طلبات الزيارات، ومواقع بدء المركبات ونهايتها.

تمثيل 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) "زولو" بدقة نانوثانية وما يصل إلى تسعة أرقام كسرية. أمثلة: "2014-10-02T15:01:23Z" و"2014-10-02T15:01:23.045123456Z".

endTime

string (Timestamp format)

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

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

softStartTime

string (Timestamp format)

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

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

softEndTime

string (Timestamp format)

وقت الانتهاء البسيط للنافذة الزمنية.

طابع زمني بتنسيق RFC3339 حسب التوقيت العالمي المنسَّق (UTC) "زولو" بدقة نانوثانية وما يصل إلى تسعة أرقام كسرية. أمثلة: "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))

تحدِّد هذه السياسة خريطة من سلاسل trafficTypes إلى المُدد. المدة هي الوقت بالإضافة إلى 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

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

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

string (int64 format)

حد أدنى بسيط للتحميل. يمكنك الاطّلاع على costPerUnitAboveSoftMax.

costPerUnitAboveSoftMax

number

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

startLoadInterval

object (Interval)

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

endLoadInterval

object (Interval)

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

maxLoad

string (int64 format)

الحد الأقصى المسموح به لحجم التحميل.

الفاصل

فاصل كميات التحميل المقبولة

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

string (int64 format)

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

max

string (int64 format)

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

DurationLimit

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

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

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

string (Duration format)

حد صارم يقيد المدة لتكون maxDuration على الأكثر.

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

softMaxDuration

string (Duration format)

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

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

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

quadraticSoftMaxDuration

string (Duration format)

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

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

maxDuration - quadraticSoftMaxDuration <= 86400 seconds

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

costPerHourAfterSoftMax

number

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

  costPerHourAfterSoftMax * (duration - softMaxDuration)

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

costPerSquareHourAfterQuadraticSoftMax

number

التكلفة لكل ساعة مربّعة يتم تكبدها في حال مخالفة الحدّ الأدنى الذي يبلغ quadraticSoftMaxDuration

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

  costPerSquareHourAfterQuadraticSoftMax *
  (duration - quadraticSoftMaxDuration)^2

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

DistanceLimit

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

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

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

string (int64 format)

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

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) "زولو" بدقة نانوثانية وما يصل إلى تسعة أرقام كسرية. أمثلة: "2014-10-02T15:01:23Z" و"2014-10-02T15:01:23.045123456Z".

latestStartTime

string (Timestamp format)

مطلوب. الحد الأقصى (شامل) في بداية الفاصل.

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

تمثيل 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/6، سيتم السماح بالحدود المسموح بها فقط.

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

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

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

string

تتضمّن هذه السمة قائمة بأنواع الشحن البديلة المطلوبة بموجب سياسة "dependentShipmentTypes".

dependentShipmentTypes[]

string

يجب الانتقال إلى المسار نفسه للاطّلاع على كل الشحنات من النوع requiredShipmentTypeAlternatives في الحقل dependentShipmentTypes.

ملاحظة: لا يُسمَح باستخدام سلاسل المتطلبات التي تعتمد عليها 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 على الأقل بعد "الأول" بدأت.

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

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