פתרון בעיות העיצוב והתזמון של רשת השילוח של קווים (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מוצאTime { day: 4 } destinationArrivalTime { day: 7hourOfDay: 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. ערך היציאה של המקטע הראשון צריך להיות תואם ל-originPortId של הביקוש לסחורה. 2. ה-destinationPortId של המקטע האחרון חייב להיות תואם ל-destinationPortId של הביקוש לסחורה. 3. רגליים רציפות ערכי arrivalPortId ו-exiturePortId חייבים להיות זהים. 4. אם צוין עבור הביקוש לסחורות הזה, זמן ההובלה המקסימלי צריך להיות שווה למשך הזמן הכולל של הנתיב, או גדול ממנו. |
VesselServiceLegId
נתיב שירות לכלי שיט יחיד שמשמש בנתיב ביקוש לסחורות. למשל, נניח שיש שני שירותים לכלי שיט. הראשונה מורכבת משלוש רגליים (0, 1 ו-2 באינדקס) והשנייה (0 באינדקס של 0 ו-1). בנוסף, החלק הראשון של השירות הראשון מגיע לנמל היציאה של החלק השני של השירות.
ייצוג JSON |
---|
{ "vesselServiceIndex": integer, "vesselServiceLegIndex": integer } |
שדות | |
---|---|
vesselServiceIndex |
האינדקס של כלי השיט. |
vesselServiceLegIndex |
אינדקס של כלי השיט משירות כלי השיט שנוספו לאינדקס על ידי |