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מוצאTime { day: 4 } destinationArrivalTime { day: 7hourOfDay: 12 } } השורות האלה מגדירות קווי שירות למשך שבוע אחד שעוברים בשתי יציאות, ובשתי היציאות זמני השהייה הם 12 שעות.

ייצוג 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 של הביקוש לסחורה. 2. ה-destinationPortId של המקטע האחרון חייב להיות תואם ל-destinationPortId של הביקוש לסחורה. 3. רגליים רציפות ערכי arrivalPortId ו-exiturePortId חייבים להיות זהים. 4. אם צוין עבור הביקוש לסחורות הזה, זמן ההובלה המקסימלי צריך להיות שווה למשך הזמן הכולל של הנתיב, או גדול ממנו.

VesselServiceLegId

נתיב שירות לכלי שיט יחיד שמשמש בנתיב ביקוש לסחורות. למשל, נניח שיש שני שירותים לכלי שיט. הראשונה מורכבת משלוש רגליים (0, 1 ו-2 באינדקס) והשנייה (0 באינדקס של 0 ו-1). בנוסף, החלק הראשון של השירות הראשון מגיע לנמל היציאה של החלק השני של השירות.

ייצוג JSON
{
  "vesselServiceIndex": integer,
  "vesselServiceLegIndex": integer
}
שדות
vesselServiceIndex

integer

האינדקס של כלי השיט.

vesselServiceLegIndex

integer

אינדקס של כלי השיט משירות כלי השיט שנוספו לאינדקס על ידי vesselServiceIndex.