Method: scheduling.solveShiftGeneration

פתרון בעיה של יצירת תזוזה מ-SolveShiftGenerationRequest הנתון על ידי יצירת מעברים מתבניות Shift נתונות כדי לתת מענה לביקוש של העובדים.

בקשת HTTP

POST https://optimization.googleapis.com/v1/scheduling:solveShiftGeneration

בכתובת ה-URL נעשה שימוש בתחביר המרת קידוד של gRPC.

גוף הבקשה

גוף הבקשה מכיל נתונים במבנה הבא:

ייצוג JSON
{
  "solverConfig": {
    object (SolverConfig)
  },
  "shiftTemplates": [
    {
      object (ShiftTemplate)
    }
  ],
  "employeeDemands": [
    {
      object (EmployeeDemand)
    }
  ]
}
שדות
solverConfig

object (SolverConfig)

זה שינוי אופציונלי. פרמטרים לפותר.

shiftTemplates[]

object (ShiftTemplate)

חובה. קבוצה של תבניות Shift שמציינות כללים ליצירת שינויים.

employeeDemands[]

object (EmployeeDemand)

חובה. הביקוש הכולל של העובדים שצריך לכסות את השינויים שנוצרו על ידי shiftTemplates.

גוף התשובה

תשובה לבעיה של Shift Generation. אם הערך של solutionStatus שהוחזר הוא SOLVED, אז קבוצת שינויים חוקיים שנוצרה על ידי הפותר מוחזרת בפונקציה employeeSchedules. כדי ליצור לוח זמנים תקין לשינוי, המאפיינים הבאים צריכים להתקיים:

  1. כל שינוי שנוצר ב-employeeSchedules עומד בכללים המפורטים ב-ShiftTemplate התואם.
  2. כל אירוע שנבחר בכל התאמה עומד בכללים המפורטים ב-ShiftTemplate.Event התואם.
  3. המספר הכולל של העובדים שהוקצו לקבוצת השינויים שנוצרה מאותה ShiftTemplate לא עולה על maximumEmployeeCount מהתבנית.
  4. קבוצת העובדים המוקצים מכסה את הביקוש בכל מרווח נתון.

אם הפעולה בוצעה ללא שגיאות, גוף התגובה יכיל נתונים במבנה הבא:

ייצוג JSON
{
  "solutionStatus": enum (ShiftGenerationSolutionStatus),
  "employeeSchedules": [
    {
      object (EmployeeSchedule)
    }
  ],
  "demandCoverageViolations": [
    {
      object (DemandCoverageViolation)
    }
  ]
}
שדות
solutionStatus

enum (ShiftGenerationSolutionStatus)

הסטטוס של הפתרון שהוחזר. אם solutionStatus לא SOLVED, השדה employeeSchedules יהיה ריק.

employeeSchedules[]

object (EmployeeSchedule)

קבוצת משמרות שנוצרו על ידי הפותר יחד עם מספר העובדים שהוקצו לכל לוח זמנים.

demandCoverageViolations[]

object (DemandCoverageViolation)

הפרות של הכיסוי בביקוש על סמך employee_counts שהוקצה בemployeeSchedules הנתון. הערך של employeeDemands שצוין בבקשה נצברים. אם שני פרקי זמן של employee_demand חופפים, הביקוש יסוכם לאורך החלק החופף של הקטע.

SolverConfig

מציינת פרמטרים נוספים לפתרון הבעיה של Shift Generation.

ייצוג JSON
{
  "timeLimit": string,
  "multiDaySchedule": boolean,
  "shiftEventsCanChange": boolean
}
שדות
timeLimit

string (Duration format)

משך הזמן המקסימלי שצריך להמתין לפתרון הבעיה. אם לא מגדירים את ברירת המחדל, ברירת המחדל היא דקה. בחירת מגבלת הזמן צריכה להשתנות בהתאם לגודל הבעיה. דוגמה: כשרוצים לפתור מופע של 7 ימים עם 2 ShiftTemplates, כשבכל אחת יש כ-20 שעות התחלה אפשריות ומתקיים 2 אירועים עם כ-30 שעות התחלה אפשריות, ויומיים הנחה בשבוע, הערכים המומלצים הם: פחות מ-10 שניות לפתרונות מהירים (וסביר להניח שהם לא אופטימליים), (10 שניות, 300 שניות) לפתרונות איכות טובים ומעל 300 שניות. בתרחישים גדולים יותר, יכול להיות שיהיה צורך במגבלות זמן ארוכות יותר.

הערך הזה הוא לא מגבלה קשיחה והוא לא מביא בחשבון את תקורת התקשורת. זמן האחזור הצפוי לפתרון הבעיה עשוי מעט לחרוג מהערך הזה.

משך זמן בשניות עם עד תשע ספרות עשרוניות, שמסתיים ב-'s'. לדוגמה: "3.5s".

multiDaySchedule

boolean

אם הערך הוא True, הפתרון יוצר פעולות EmployeeSchedule שכוללות כמה התאמות (למשל, כדי ליצור לוח זמנים למשך שבוע). אחרת, כל EmployeeSchedule כולל רק שינוי אחד. בלוחות זמנים של כמה ימים, שעת ההתחלה של השינוי זהה בימים שונים, ומספר ימי החופשה בלוח זמנים כזה נקבע על ידי תבניות ההשתנות. ברירת המחדל היא False.

shiftEventsCanChange

boolean

אם True, ימי EmployeeSchedule מרובים עשויים לכלול שינויים שבהם שעת ההתחלה ושעת הסיום של האירועים שלהם משתנות בכל הימים. אחרת, לכל השינויים של EmployeeSchedule מסוים חייבים להיות אותם זמני התחלה וסיום של אותו אירוע. בכל מקרה, שעת ההתחלה ושעת הסיום זהות לכל המשמרות של לוח זמנים מרובה ימים. לכן, אם הערך של multiDaySchedule הוא False, המערכת תתעלם מהפרמטר הזה. אם מגדירים את הפרמטר הזה כ-TRUE, זמני פתרון ארוכים יותר. ברירת המחדל היא False.

ShiftTemplate

תבנית שמגדירה כללים ליצירת שינויים. משמרת היא יחידת עבודה שמציינת שעת התחלה ושעת סיום, ועשויה להכיל אירועים (לדוגמה, ארוחת צהריים, הפסקות וכו'). שינוי יוקצה לתאריך ספציפי בתשובה.

ייצוג JSON
{
  "id": string,
  "earliestStartTime": {
    object (TimeOfDay)
  },
  "latestStartTime": {
    object (TimeOfDay)
  },
  "durationMinutes": integer,
  "startTimeIncrementMinutes": integer,
  "daysOffCountPerWeek": integer,
  "eventTemplates": [
    {
      object (EventTemplate)
    }
  ],
  "minimumIntereventGapMinutes": integer,
  "maximumEmployeeCount": integer
}
שדות
id

string

המזהה הייחודי של התבנית הזו.

earliestStartTime

object (TimeOfDay)

השעה המוקדמת ביותר ביום שבה יכולה להתחיל משמרת. הערך הזה מצוין עם שעות ודקות; שניות וננו.

latestStartTime

object (TimeOfDay)

השעה המאוחרת ביותר ביום שבה יכולה להתחיל משמרת. הערך הזה מצוין עם שעות ודקות; שניות וננו. אם הערך הזה קטן מהערך earliestStartTime, שינוי שייווצר באמצעות התבנית הזו עשוי להתחיל לפני חצות או אחריה.

durationMinutes

integer

משך זמן קבוע של החלפה שנוצרה על ידי התבנית הזו.

startTimeIncrementMinutes

integer

מרווח הזמן (בדקות) ששימש ליצירת הקבוצה של זמני ההתחלה האפשריים בין earliestStartTime ל-latestStartTime. לדוגמה, אם שעת ההתחלה המוקדמת ביותר היא 8:00, שעת ההתחלה האחרונה היא 8:30 ושעת ההתחלה היא 10 דקות, אז כל זמני ההתחלה האפשריים של תבנית ההחלפה הזו הם: 8:00, 8:10, 8:20 ו-8:30.

daysOffCountPerWeek

integer

מספר קבוע של ימי הנחה בשבוע. אם עובד מסוים לא תוקצה למשמרת שמתחילה באותו יום, יש לו יום חופשה נתון. שבוע הוא 7 ימים ומתחיל ביום ראשון.

eventTemplates[]

object (EventTemplate)

כללים ליצירת אירועים לכל משמרת. אירוע אחד בדיוק ייכלל בכל שינוי עבור כל אירוע שצוין.

minimumIntereventGapMinutes

integer

מספר הדקות המינימלי בין סוף אירוע אחד לבין תחילת האירוע הבא.

maximumEmployeeCount

integer

המספר המקסימלי של עובדים שאפשר להקצות לכל המשמרות שנוצרו באמצעות התבנית הזו.

TimeOfDay

מייצג שעה ביום. התאריך ואזור הזמן לא משמעותיים או שהם מצוינים במקום אחר. יכול להיות ש-API יבחר לאפשר שניות מדלגות. הסוגים הקשורים הם google.type.Date ו-google.protobuf.Timestamp.

ייצוג JSON
{
  "hours": integer,
  "minutes": integer,
  "seconds": integer,
  "nanos": integer
}
שדות
hours

integer

שעות ביום בפורמט 24 שעות. צריך להיות מספר בין 0 ל-23. ממשק API עשוי לבחור לאפשר את הערך '24:00:00' לתרחישים כמו שעת הסגירה של העסק.

minutes

integer

דקות בשעה ביום. חייב להיות בין 0 ל-59.

seconds

integer

שניות ודקות. בדרך כלל הערך צריך להיות בין 0 ל-59. ה-API עשוי לאפשר את הערך 60 אם הוא מאפשר שניות מדלגות.

nanos

integer

שברי שניות בננו-שניות. חייב להיות בין 0 ל-999,999,999.

EventTemplate

תבנית שמגדירה כללים ליצירת אירוע יחיד שמתרחש במהלך שינוי שינוי. אירוע יכול לייצג פגישה, הפסקה, ארוחת צהריים וכו'.

ייצוג JSON
{
  "id": string,
  "minimumMinutesAfterShiftStart": integer,
  "maximumMinutesAfterShiftStart": integer,
  "durationMinutes": integer,
  "startTimeIncrementMinutes": integer
}
שדות
id

string

המזהה הייחודי של התבנית הזו.

minimumMinutesAfterShiftStart

integer

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

maximumMinutesAfterShiftStart

integer

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

durationMinutes

integer

משך זמן קבוע בדקות של האירוע.

startTimeIncrementMinutes

integer

מרווח הזמן (בדקות) ששימש ליצירת הקבוצה של זמני ההתחלה האפשריים של אירועים בין minimumMinutesAfterShiftStart ל-maximumMinutesAfterShiftStart. לדוגמה, אם מספר הדקות המינימלי לאחר התחלת המשמרת הוא 30, מספר הדקות המקסימלי לאחר התחלת המשמרת הוא 45 ומשך זמן ההתחלה הוא 5 דקות, האירוע יכול להתרחש 30, 35, 40 או 45 דקות לאחר תחילת המשמרת.

EmployeeDemand

מציינת את מספר העובדים שנדרשים כדי לכסות את הביקוש בפרק הזמן הנתון של DateTime.

ייצוג JSON
{
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },
  "employeeCount": integer
}
שדות
startDateTime

object (DateTime)

תחילת פרק הזמן של הביקוש הנתון (כולל). הערכים האלה ייקראו עד לדקה. שניות וכל היחידות הקטנים יותר לא נלקחים בחשבון.

endDateTime

object (DateTime)

סיום פרק הזמן של הדרישה הנתונה (לא כולל). הערכים האלה ייקראו עד לדקה. שניות וכל היחידות הקטנים יותר לא נלקחים בחשבון.

employeeCount

integer

מספר העובדים שנדרשים כדי לכסות את הביקוש למרווח הזה.

ShiftGenerationSolutionStatus

סטטוס הפתרון שסופק בתשובה של פותר.

טיפוסים בני מנייה (enum)
SHIFT_GENERATION_SOLUTION_STATUS_UNSPECIFIED סטטוס התגובה לא צוין.
SHIFT_GENERATION_SOLVED הפותר מצא פתרון במגבלת הזמן שצוינה.
SHIFT_GENERATION_NOT_SOLVED בעיה מנעה מהפותר ליצור שינויים.
SHIFT_GENERATION_NOT_SOLVED_DEADLINE_EXCEEDED לא ניתן היה ליצור התאמות כדי לכסות את הביקוש במסגרת הזמן שצוינה.

EmployeeSchedule

רשימה ממוינת של משמרות התואם ל-ShiftTemplate בודד שיוקצה למספר עובדים.

ייצוג JSON
{
  "shiftTemplateId": string,
  "shifts": [
    {
      object (ShiftWithEvents)
    }
  ],
  "employeeCount": integer
}
שדות
shiftTemplateId

string

מזהה התבנית ששימשה ליצירת קבוצת השינויים הזו.

shifts[]

object (ShiftWithEvents)

רשימת משמרות שאליהן מוקצה מספר עובדים אחד (employeeCount). התנודות והאירועים שנבחרו עבור לוח הזמנים נוצרו מתבנית אחת. ההתאמות ממוינות בסדר כרונולוגי ולא חופפות. אם הערך של SolverConfig.multi_day_schedule הוא True, יום חופשה מיוצג במרומז על ידי היעדר שינוי שיתחיל מאותו יום.

employeeCount

integer

מספר העובדים שצריך להקצות לקבוצת המשמרות הזו כדי לכסות את הביקוש.

ShiftWithEvents

מציין את תאריך ההתחלה ותאריך הסיום יחד עם רשימת אירועים קבועים של שינוי שנוצר על ידי הפותר.

ייצוג JSON
{
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },
  "events": [
    {
      object (Event)
    }
  ]
}
שדות
startDateTime

object (DateTime)

התאריך ושעת ההתחלה של המשמרת. הערך הזה מצוין עד לדקה; שניות ויחידות קטנות יותר לא ניתנות.

endDateTime

object (DateTime)

התאריך ושעת הסיום של המשמרת. הערך הזה מצוין עד לדקה; שניות ויחידות קטנות יותר לא ניתנות.

events[]

object (Event)

רשימת אירועים הכלולים בשינוי הזה, ממופים בדיוק אל אותם אירועי 'ShiftTemplate.Event' ובאותו סדר. אם הערך של SolverConfig.shift_events_can_change הוא True, זמני ההתחלה והסיום של האירועים עשויים להשתנות בכל ShiftWithEvents בלוח הזמנים הזה.

אירוע

מציין את תאריכי ההתחלה והסיום של אירוע ספציפי במשמרת שנוצרה על ידי הפותר.

ייצוג JSON
{
  "eventTemplateId": string,
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  }
}
שדות
eventTemplateId

string

המזהה של התבנית ששימשה ליצירת האירוע הזה.

startDateTime

object (DateTime)

התאריך ושעת ההתחלה של האירוע. הערך הזה מצוין עד לדקה; שניות ויחידות קטנות יותר לא ניתנות.

endDateTime

object (DateTime)

התאריך ושעת הסיום של האירוע. הערך הזה מצוין עד לדקה; שניות ויחידות קטנות יותר לא ניתנות.

DemandCoverageViolation

מציינת את ההפרה בכיסוי הביקוש במרווח הנתון. הביקוש של העובדים זהה בכל התקופה שצוינה.

ייצוג JSON
{
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },
  "coverageViolation": integer
}
שדות
startDateTime

object (DateTime)

התאריך ושעת ההתחלה של מרווח הביקוש (כולל). הערך הזה מצוין עד לדקה.

endDateTime

object (DateTime)

התאריך ושעת הסיום של תקופת הביקוש (לא כולל). הערך הזה מצוין עד לדקה.

coverageViolation

integer

הפרה של הכיסוי במהלך פרק הזמן שצוין. ערך חיובי מציין שיש עומס יתר בביקוש, וערך שלילי מציין שהביקוש בחסר.