حلّ مسألة تصميم شبكة شحن البطانة وجدولتها (LSNDSP) من DesignShippingNetworkRequest
المحدّد.
يمثل LSNDSP مشكلة تحسين معقدة تبحث عن التصميم الأمثل وجدولة شبكة شحن البطانات. الهدف هو تقليل التكلفة الإجمالية لتشغيل الشبكة مع تلبية أكبر قدر ممكن من طلب الشحن بين المنافذ.
يمكن تقسيم LSNDSP إلى مشكلتين فرعيتين رئيسيتين: تصميم الشبكة والجدولة. تحدد مشكلة تصميم الشبكة الفرعية مجموعة المنافذ التي ستخدمها الشبكة، وعدد السفن التي سيتم نشرها على كل مسار، والمسارات التي ستسلكها السفن. تحدد مشكلة الجدولة الفرعية جداول الإبحار للسفن، مع الأخذ في الاعتبار الوقت الذي يستغرقه الإبحار بين المنافذ، والوقت الذي يستغرقه تحميل وتفريغ البضائع، والطلب على نقل البضائع بين الموانئ.
بعبارة بسيطة، تكمن مشكلة LSNDSP في تحديد الموانئ التي سيتم خدمتها، وعدد السفن التي يجب استخدامها، وكيفية جدولة السفن بحيث يتم تقليل تكلفة تشغيل الشبكة مع زيادة الإيرادات إلى أقصى حد لتلبية طلب الشحن. يعد توجيه البضائع من المكوّنات الفرعية الصعبة في LSNDSP تحديد الطلبات التي يجب تلبيتها والمسارات التي ينبغي تخصيصها للشحن من أجل زيادة الإيرادات إلى أقصى حد.
طلب HTTP
POST https://optimization.googleapis.com/v1/shipping:designShippingNetwork
يستخدم عنوان URL بنية تحويل الترميز gRPC.
نص الطلب
يحتوي نص الطلب على بيانات بالبنية التالية:
تمثيل JSON |
---|
{ "requestId": string, "solverParameters": { object ( |
الحقول | |
---|---|
requestId |
معرّف المشكلة أو الطلب |
solverParameters |
معلَمات أداة الحلّ |
ports[] |
قائمة بالمنافذ المحتملة المطلوب طلبها في خدمات السفن. يجب أن يحتوي الطلب فقط على معرّفات المنافذ الواردة في هذه القائمة. |
legCandidates[] |
قائمة بالمرشحين المحتملين الذين يمكن إضافتهم إلى خدمات السفينة يجب أن يحتوي الطلب فقط على المُعرّفات المرشحة للمراحل الواردة في هذه القائمة. |
vesselClasses[] |
قائمة بفئات السفن لتقديم خدمات السفن. لاحظ أن جميع السفن من نفس الفئة قابلة للتبديل بالكامل. يجب أن يحتوي الطلب فقط على معرّفات فئة السفينة في هذه القائمة. |
commodityDemands[] |
قائمة بالطلبات المحتملة للسلع (أي الحاويات) التي يجب أن تلبيها خدمات السفن. |
vesselServices[] |
يمكن توفير شبكة من خدمات السفن الصالحة (عادةً الحالة الحالية للشبكة) لاستخدامها كنقطة بداية لعملية التحسين. |
نص الاستجابة
تحتفظ الاستجابة بالحلّ الخاص بمثيل LSNDSP الذي تم تمريره في الطلب. وهي تحتوي على شبكة صالحة من خدمات السفن ومسارات الطلب على السلع. ولا يمكن أن يتجاوز إجمالي الطلب على السلع التي تمر في كل مرحلة سعة فئة السفينة التي تغطي هذه المرحلة. تجدر الإشارة إلى أنّ عدم توفّر خدمات السفن بدون تلبية طلب معيّن هو دائمًا حل عملي لمشكلة تصميم شبكة شحن السفن وجدولتها.
إذا كانت الاستجابة ناجحة، سيحتوي نص الاستجابة على بيانات بالبنية التالية:
تمثيل JSON |
---|
{ "requestId": string, "vesselServices": [ { object ( |
الحقول | |
---|---|
requestId |
رقم تعريف الطلب الذي يرتبط به هذا الرد. |
vesselServices[] |
شبكة من خدمات السفن. بالنسبة إلى كل فئة سفينة، لا يمكن أن يتجاوز إجمالي عدد السفن المستخدمة عدد السفن المتاحة لهذه الفئة. |
commodityDemandPaths[] |
قائمة بجميع مسارات الطلب على السلع التي يتم من خلالها شحن الطلب الإيجابي على السلع. يُرجى العلم أنّه قد لا يتم تضمين بعض معرّفات الطلب على السلع في حال عدم شحن الطلب. بدلاً من ذلك، يمكن تلبية الطلب على السلع بشكل جزئي. يجب ألا يتجاوز إجمالي الكمية التي تم توصيلها الطلب الإجمالي لكل طلب. أخيرًا، تعتمد commodityDemandPaths على vesselServices (الاطّلاع على تعريف CommodityDemandPath). |
SolverParameters
يشير ذلك المصطلح إلى معلَمات تتحكّم في حل واحد لـ LSNDSP.
تمثيل JSON |
---|
{ "timeLimit": string } |
الحقول | |
---|---|
timeLimit |
الحدّ الأقصى للوقت الذي يجب أن يقضيه الحلّ في حلّ المسألة. هذه القيمة ليست حدًا صارمًا ولا تأخذ في الحسبان النفقات العامة للاتصال. قد يتجاوز وقت الاستجابة المتوقع لحل المشكلة هذه القيمة قليلاً. مدة بالثواني يصل عددها إلى تسعة أرقام كسرية وتنتهي بـ " |
المنفذ
المنفذ، على سبيل المثال الوحدة الطرفية أو جميع أطراف المنفذ.
تمثيل JSON |
---|
{ "id": string, "minimumPortStayDuration": { object ( |
الحقول | |
---|---|
id |
المعرّف الفريد الذي تم تعيينه لهذا المنفذ |
minimumPortStayDuration |
الحد الأدنى لمدة الإقامة لمكالمة المنفذ. تفترض معظم الدراسات أنها ثابتة لأن المنافذ عادةً ما تخصص المزيد من الرافعات لسفن أكبر ذات أعداد كبيرة من الحركة، لأنها تشغل مساحة أكبر. |
minimumTransshipmentDuration |
الحد الأدنى لمدة النقل في ميناء معيّن، بما في ذلك المدة اللازمة لتفريغ الحاوية وإعادة تحميلها في سفينة أخرى |
transshipmentCost |
تمثّل هذه السمة تكلفة نقل شحن الحاوية. ستكون هذه القيمة عادةً أقل من مجموع عمليات التحميل والتفريغ، لأنّ الشحن لا يتطلب أوراقًا جمركية في الميناء. |
vesselClassCosts |
التكاليف التي تم تكبدها عند استدعاء هذا المنفذ الذي تم ربطه بواسطة معرّف فئة السفينة. لا يمكن لفئة السفينة استدعاء هذا المنفذ إلا إذا كان له مدخل في هذه الخريطة. عنصر يحتوي على قائمة من أزواج |
المدة
يتم تحديد المدة (الإقامة في المنفذ/الشحن، النقل العام حسب الطلب) على أساس كل ساعة.
تمثيل JSON |
---|
{ "hours": string } |
الحقول | |
---|---|
hours |
عدد الساعات التي تحدِّد المدة. |
VesselCost
يتم تحديد تكلفة الاتصال بالسفينة للاتصال والإقامة في هذا المنفذ على أنّها دالة خطية لمدة الإقامة (fixedCost
+ hourlyCost
* ساعة).
تمثيل JSON |
---|
{ "fixedCost": number, "hourlyCost": number } |
الحقول | |
---|---|
fixedCost |
تكلفة ثابتة لطلب هذا المنفذ |
hourlyCost |
تكلفة الإقامة في هذا الميناء بالساعة |
LegCandidate
ساق خدمة السفن يمكن أن تكون هناك عدة أرجل مرشحة بين الميناءين نفسهما، على سبيل المثال، تمثيل طرق مختلفة في المحيط و/أو سرعات السفن.
تمثيل JSON |
---|
{
"id": string,
"departurePortId": string,
"arrivalPortId": string,
"duration": {
object ( |
الحقول | |
---|---|
id |
معرّف فريد يتم تعيينه لمرشح الساق هذا. |
departurePortId |
رقم تعريف منفذ المغادرة |
arrivalPortId |
رقم تعريف ميناء الوصول |
duration |
مدة الساق. |
vesselClassCosts |
تكلفة تخصيص ساق المرشح هذه لفئة سفينة معيّنة. ويمكن أن يشمل ذلك تكلفة تشغيل السفينة وتكلفة المخابئ وتكلفة الاستئجار. لا يمكن لفئة السفن الإبحار عبر هذه الساق المرشحة إلا إذا كان لها إدخال في هذه الخريطة. عنصر يحتوي على قائمة من أزواج |
VesselClass
فئة السفن، أي مجموعة من السفن لديها الخصائص نفسها. لا توجد طريقة للتمييز بين سفينتين من نفس الفئة.
تمثيل JSON |
---|
{ "id": string, "containerCapacity": string, "vesselCount": string } |
الحقول | |
---|---|
id |
المعرّف الفريد الذي تم تعيينه لفئة السفينة هذه. |
containerCapacity |
سعة فئة السفينة (في الحاويات) |
vesselCount |
عدد السفن في فئة السفن هذه. |
CommodityDemand
الطلب على السلع، أي الطلب المحتمل الذي تنفّذه جهة الشحن.
تمثيل JSON |
---|
{
"id": string,
"originPortId": string,
"destinationPortId": string,
"containerCount": string,
"freightRate": number,
"maximumTransitDuration": {
object ( |
الحقول | |
---|---|
id |
معرّف فريد تمّ تعيينه لهذا الطلب على السلع |
originPortId |
رقم تعريف منفذ المصدر |
destinationPortId |
رقم تعريف المنفذ الوجهة |
containerCount |
الحدّ الأقصى لعدد الحاويات المطلوب توصيلها |
freightRate |
معدل الشحن لكل حاوية (ما قد يشمل عقوبة على عدم تلبية الطلب) من المفترض أن تُزيل تكلفة التحميل والتفريغ لكل حاوية في المصدر والوجهة. |
maximumTransitDuration |
الحدّ الأقصى لمدة النقل (في حال ضبطه، يجب أن يكون إيجابيًا تمامًا). يتم تحديد مدة النقل من وقت وصول السفينة الأولى التي توفّر هذا الطلب من ميناء نقطة الانطلاق إلى الوقت الذي تصل فيه آخر سفينة تخدم هذا الطلب إلى ميناء الوجهة. |
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 ( |
الحقول | |
---|---|
vesselClassId |
معرّف فئة السفينة التي تقدّم الخدمة. |
vesselServiceLegs[] |
للحصول على خدمة صالحة للسفن، تحتفظ السمات التالية بما يلي: 1. لا يمكن أن يكون الحقل فارغًا. 2. يجب أن تتطابق معلومات destinationPortId مع originPortId في أرجل متتالية (بما في ذلك في المرحلتين الأخيرة والأولى). |
VesselServiceLeg
ساق واحدة من خدمة السفينة.
تمثيل JSON |
---|
{ "legCandidateId": string, "originDepartureTime": { object ( |
الحقول | |
---|---|
legCandidateId |
تم تخصيص رقم تعريف مرشح الساق. |
originDepartureTime |
وقت المغادرة في منفذ المصدر وفقًا للجدول الزمني الأسبوعي. |
destinationArrivalTime |
وقت الوصول إلى ميناء الوجهة وفقًا للجدول الزمني الأسبوعي. |
ScheduleTime
يتم تحديد وقت الجدول الزمني (مغادرة/وصول السفينة أو الطلب) بوتيرة أسبوعية في ساعة معيّنة.
تمثيل JSON |
---|
{ "day": string, "hourOfDay": integer } |
الحقول | |
---|---|
day |
يوم في الجدول الزمني. اليوم 0 هو أول يوم ممكن. |
hourOfDay |
يجب أن تكون ساعة اليوم من وقت الجدول الزمني عددًا صحيحًا يتراوح بين 0 و23. |
CommodityDemandPath
الخدمات والمنافذ المختلفة التي يأخذها جزء من الطلب على سلعة معيّنة. تستند المؤشرات المستخدمة أدناه إلى ترتيب خدمات السفينة في الاستجابة وترتيب أرجل الخدمة في كل خدمة على حدة.
تمثيل JSON |
---|
{
"commodityDemandId": string,
"containerCount": string,
"vesselServiceLegIds": [
{
object ( |
الحقول | |
---|---|
commodityDemandId |
تم استيفاء معرّف الطلب على السلع. |
containerCount |
عدد الحاويات التي تمر عبر هذا المسار. يجب ألا يتجاوز إجمالي الكمية التي تم توصيلها الطلب الإجمالي لكل طلب. |
vesselServiceLegIds[] |
قائمة بمعرّفات أرجل خدمة السفينة التي تم إجراؤها خلال هذا المسار. بالنسبة إلى مسار الطلب الصالح على السلع، تتضمّن السمات التالية ما يلي: 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 |
فهرس خدمة السفينة. |
vesselServiceLegIndex |
مؤشر ساق خدمة السفينة مفهرسًا من قِبل |