حلّ مشكلة تصميم وجدولة شبكة شحن السفن (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" OriginDepartureTime { day: 4 }destinationArrivalTime { day: 7 hourOfDay: 12 } } يُحدِّد هذه المراحل خطوط الخدمة لمدة أسبوع واحد تمر عبر منفذين مع مدة بقاء المنفذين 12 ساعة.
تمثيل 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. يجب أن يتطابق عنصر مغادرة PortId في المرحلة الأولى مع assetPortId لطلب السلع. 2. يجب أن يتطابق DestinationPortId في المرحلة الأخيرة مع DestinationPortId للطلب على السلع. 3- ساقان متتابعتان يجب أن يتطابق رقم accessPortId مع باب PayId. 4. وإذا تمّ توفير هذا الحدّ الأقصى للطلب على السلع، يجب أن يكون أكبر من المدة الإجمالية للمسار أو مساوية لها. |
VesselServiceLegId
محطة خدمة سفينة واحدة مستخدَمة في مسار الطلب على السلع الأساسية على سبيل المثال، لنفرض أنّ هناك خدمتَين للسفن. تتكون الطريقة الأولى من ثلاثة أرجل (المفهرسة 0 و1 و2) والثانية (المفهرسة 0 و1). بالإضافة إلى ذلك، تصل المرحلة الأولى من الخدمة الأولى إلى منفذ مغادرة المرحلة الثانية من الخدمة الثانية. مسار سلع يتألف من مسار سلع يتألف من ثلاثة هيكل خدمة سفينة.
تمثيل JSON |
---|
{ "vesselServiceIndex": integer, "vesselServiceLegIndex": integer } |
الحقول | |
---|---|
vesselServiceIndex |
فهرس خدمة السفن. |
vesselServiceLegIndex |
تم فهرسة الجزء الساق من خدمة السفينة من قِبل " |