Method: shipping.designShippingNetwork

حلّ مسألة تصميم شبكة شحن البطانة وجدولتها (LSNDSP) من DesignShippingNetworkRequest المحدّد.

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

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

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

طلب HTTP

POST https://optimization.googleapis.com/v1/shipping:designShippingNetwork

يستخدم عنوان URL بنية تحويل الترميز gRPC.

نص الطلب

يحتوي نص الطلب على بيانات بالبنية التالية:

تمثيل JSON
{
  "requestId": string,
  "solverParameters": {
    object (SolverParameters)
  },
  "ports": [
    {
      object (Port)
    }
  ],
  "legCandidates": [
    {
      object (LegCandidate)
    }
  ],
  "vesselClasses": [
    {
      object (VesselClass)
    }
  ],
  "commodityDemands": [
    {
      object (CommodityDemand)
    }
  ],
  "vesselServices": [
    {
      object (VesselService)
    }
  ]
}
الحقول
requestId

string

معرّف المشكلة أو الطلب

solverParameters

object (SolverParameters)

معلَمات أداة الحلّ

ports[]

object (Port)

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

legCandidates[]

object (LegCandidate)

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

vesselClasses[]

object (VesselClass)

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

commodityDemands[]

object (CommodityDemand)

قائمة بالطلبات المحتملة للسلع (أي الحاويات) التي يجب أن تلبيها خدمات السفن.

vesselServices[]

object (VesselService)

يمكن توفير شبكة من خدمات السفن الصالحة (عادةً الحالة الحالية للشبكة) لاستخدامها كنقطة بداية لعملية التحسين.

نص الاستجابة

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

إذا كانت الاستجابة ناجحة، سيحتوي نص الاستجابة على بيانات بالبنية التالية:

تمثيل JSON
{
  "requestId": string,
  "vesselServices": [
    {
      object (VesselService)
    }
  ],
  "commodityDemandPaths": [
    {
      object (CommodityDemandPath)
    }
  ]
}
الحقول
requestId

string

رقم تعريف الطلب الذي يرتبط به هذا الرد.

vesselServices[]

object (VesselService)

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

commodityDemandPaths[]

object (CommodityDemandPath)

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

SolverParameters

يشير ذلك المصطلح إلى معلَمات تتحكّم في حل واحد لـ LSNDSP.

تمثيل JSON
{
  "timeLimit": string
}
الحقول
timeLimit

string (Duration format)

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

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

المنفذ

المنفذ، على سبيل المثال الوحدة الطرفية أو جميع أطراف المنفذ.

تمثيل JSON
{
  "id": string,
  "minimumPortStayDuration": {
    object (Duration)
  },
  "minimumTransshipmentDuration": {
    object (Duration)
  },
  "transshipmentCost": number,
  "vesselClassCosts": {
    string: {
      object (VesselCost)
    },
    ...
  }
}
الحقول
id

string

المعرّف الفريد الذي تم تعيينه لهذا المنفذ

minimumPortStayDuration

object (Duration)

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

minimumTransshipmentDuration

object (Duration)

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

transshipmentCost

number

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

vesselClassCosts

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

التكاليف التي تم تكبدها عند استدعاء هذا المنفذ الذي تم ربطه بواسطة معرّف فئة السفينة. لا يمكن لفئة السفينة استدعاء هذا المنفذ إلا إذا كان له مدخل في هذه الخريطة.

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

المدة

يتم تحديد المدة (الإقامة في المنفذ/الشحن، النقل العام حسب الطلب) على أساس كل ساعة.

تمثيل JSON
{
  "hours": string
}
الحقول
hours

string (int64 format)

عدد الساعات التي تحدِّد المدة.

VesselCost

يتم تحديد تكلفة الاتصال بالسفينة للاتصال والإقامة في هذا المنفذ على أنّها دالة خطية لمدة الإقامة (fixedCost + hourlyCost * ساعة).

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

number

تكلفة ثابتة لطلب هذا المنفذ

hourlyCost

number

تكلفة الإقامة في هذا الميناء بالساعة

LegCandidate

ساق خدمة السفن يمكن أن تكون هناك عدة أرجل مرشحة بين الميناءين نفسهما، على سبيل المثال، تمثيل طرق مختلفة في المحيط و/أو سرعات السفن.

تمثيل JSON
{
  "id": string,
  "departurePortId": string,
  "arrivalPortId": string,
  "duration": {
    object (Duration)
  },
  "vesselClassCosts": {
    string: number,
    ...
  }
}
الحقول
id

string

معرّف فريد يتم تعيينه لمرشح الساق هذا.

departurePortId

string

رقم تعريف منفذ المغادرة

arrivalPortId

string

رقم تعريف ميناء الوصول

duration

object (Duration)

مدة الساق.

vesselClassCosts

map (key: string, value: number)

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

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

VesselClass

فئة السفن، أي مجموعة من السفن لديها الخصائص نفسها. لا توجد طريقة للتمييز بين سفينتين من نفس الفئة.

تمثيل JSON
{
  "id": string,
  "containerCapacity": string,
  "vesselCount": string
}
الحقول
id

string

المعرّف الفريد الذي تم تعيينه لفئة السفينة هذه.

containerCapacity

string (int64 format)

سعة فئة السفينة (في الحاويات)

vesselCount

string (int64 format)

عدد السفن في فئة السفن هذه.

CommodityDemand

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

تمثيل JSON
{
  "id": string,
  "originPortId": string,
  "destinationPortId": string,
  "containerCount": string,
  "freightRate": number,
  "maximumTransitDuration": {
    object (Duration)
  }
}
الحقول
id

string

معرّف فريد تمّ تعيينه لهذا الطلب على السلع

originPortId

string

رقم تعريف منفذ المصدر

destinationPortId

string

رقم تعريف المنفذ الوجهة

containerCount

string (int64 format)

الحدّ الأقصى لعدد الحاويات المطلوب توصيلها

freightRate

number

معدل الشحن لكل حاوية (ما قد يشمل عقوبة على عدم تلبية الطلب) من المفترض أن تُزيل تكلفة التحميل والتفريغ لكل حاوية في المصدر والوجهة.

maximumTransitDuration

object (Duration)

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

VesselService

خدمة السفن التي يمكن استخدامها لتلبية المتطلبات على السلع. ملاحظة مهمة: من الافتراض الحالي أنّ الخدمات تتم على أساس أسبوعي ولا يمكن أن تتجاوز مدة الإقامة في المنفذ أسبوعًا واحدًا. ضع في اعتبارك التسلسل التالي لرحلات خدمة السفينة: vesselServiceLegs { legCandidateId: "0->1" originDepartureTime {} destinationArrivalTime { day: 3 hourOfDay: 12 } } vesselServiceLegs { legCandidateId: "1->0" origin DepartureTime {day Department} {d->1" originDepartureTime {} destinationArrivalTime { day: 3 hourOfDay: 12 } } vesselServiceLegs { legCandidateId: "1->0" origin DepartureTime {day: 4" of Returning days:

تمثيل JSON
{
  "vesselClassId": string,
  "vesselServiceLegs": [
    {
      object (VesselServiceLeg)
    }
  ]
}
الحقول
vesselClassId

string

معرّف فئة السفينة التي تقدّم الخدمة.

vesselServiceLegs[]

object (VesselServiceLeg)

للحصول على خدمة صالحة للسفن، تحتفظ السمات التالية بما يلي: 1. لا يمكن أن يكون الحقل فارغًا. 2. يجب أن تتطابق معلومات destinationPortId مع originPortId في أرجل متتالية (بما في ذلك في المرحلتين الأخيرة والأولى).

VesselServiceLeg

ساق واحدة من خدمة السفينة.

تمثيل JSON
{
  "legCandidateId": string,
  "originDepartureTime": {
    object (ScheduleTime)
  },
  "destinationArrivalTime": {
    object (ScheduleTime)
  }
}
الحقول
legCandidateId

string

تم تخصيص رقم تعريف مرشح الساق.

originDepartureTime

object (ScheduleTime)

وقت المغادرة في منفذ المصدر وفقًا للجدول الزمني الأسبوعي.

destinationArrivalTime

object (ScheduleTime)

وقت الوصول إلى ميناء الوجهة وفقًا للجدول الزمني الأسبوعي.

ScheduleTime

يتم تحديد وقت الجدول الزمني (مغادرة/وصول السفينة أو الطلب) بوتيرة أسبوعية في ساعة معيّنة.

تمثيل JSON
{
  "day": string,
  "hourOfDay": integer
}
الحقول
day

string (int64 format)

يوم في الجدول الزمني. اليوم 0 هو أول يوم ممكن.

hourOfDay

integer

يجب أن تكون ساعة اليوم من وقت الجدول الزمني عددًا صحيحًا يتراوح بين 0 و23.

CommodityDemandPath

الخدمات والمنافذ المختلفة التي يأخذها جزء من الطلب على سلعة معيّنة. تستند المؤشرات المستخدمة أدناه إلى ترتيب خدمات السفينة في الاستجابة وترتيب أرجل الخدمة في كل خدمة على حدة.

تمثيل JSON
{
  "commodityDemandId": string,
  "containerCount": string,
  "vesselServiceLegIds": [
    {
      object (VesselServiceLegId)
    }
  ]
}
الحقول
commodityDemandId

string

تم استيفاء معرّف الطلب على السلع.

containerCount

string (int64 format)

عدد الحاويات التي تمر عبر هذا المسار. يجب ألا يتجاوز إجمالي الكمية التي تم توصيلها الطلب الإجمالي لكل طلب.

vesselServiceLegIds[]

object (VesselServiceLegId)

قائمة بمعرّفات أرجل خدمة السفينة التي تم إجراؤها خلال هذا المسار. بالنسبة إلى مسار الطلب الصالح على السلع، تتضمّن السمات التالية ما يلي: 1. يجب أن يتطابق حقل originPortId في المحطة الأولى مع originPortId لطلب السلعة. 2. يجب أن يتطابق حقل destinationPortId في المحطة الأخيرة مع destinationPortId لطلب السلعة. 3- يجب أن تتطابق بيانات ReachPortId المتتالية مع ExitPortId. 4. وفي حال توفير هذا الطلب على السلع، يجب أن تكون الحدّ الأقصى لمدة النقل أكبر من المدة الإجمالية للمسار أو مساويًا لها.

VesselServiceLegId

ساق خدمة سفينة واحدة تُستخدم في مسار الطلب على السلع على سبيل المثال، ضع في الاعتبار أن هناك خدمتين للسفن. وتتكون الدرجة الأولى من ثلاث أرجل (تمت فهرستها 0 و1 و2) والثانية (مفهرسة 0 و1). بالإضافة إلى ذلك، تصل المرحلة الأولى من الخدمة الأولى إلى ميناء المغادرة من المحطة الثانية من الخدمة الثانية. مسار السلع المكوّن من أرقام تعريف أرجل خدمة السفينة الثلاثة التالية: {vesselServiceIndexIndex: 0, vesselServiceLegIndex: 2} {vesselServiceIndex: 0, vesselServiceLegIndex: 0} {vesselServiceIndex: 1، vesselServiceIndexIndex: 1، vesselServiceLegIndex: 10، يعني أنّ كل خدمة متتالية، تشمل الخدمة رقم 2، على أنّ كل خدمة متتابعة من الخدمة الأولى، على أن تكون كل خدمة متتابعة من الخدمة الأولى.

تمثيل JSON
{
  "vesselServiceIndex": integer,
  "vesselServiceLegIndex": integer
}
الحقول
vesselServiceIndex

integer

فهرس خدمة السفينة.

vesselServiceLegIndex

integer

مؤشر ساق خدمة السفينة مفهرسًا من قِبل vesselServiceIndex