Method: scheduling.solveShiftGeneration

حلّ مشكلة إنشاء التحولات من SolveShiftGenerationRequest المحدد عن طريق إنشاء ورديات من نماذج نوبات عمل معينة من أجل تغطية طلب الموظفين.

طلب 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)

مطلوب. مجموعة من نماذج نوبات العمل التي تحدِّد قواعد إنشاء ورديات

employeeDemands[]

object (EmployeeDemand)

مطلوب. إجمالي طلب الموظفين الذي يجب أن تغطّيه الورديات الناتجة عن "shiftTemplates"

نص الاستجابة

الاستجابة لمشكلة إنشاء Shift. إذا كانت قيمة 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.

تمثيل JSON
{
  "timeLimit": string,
  "multiDaySchedule": boolean,
  "shiftEventsCanChange": boolean
}
الحقول
timeLimit

string (Duration format)

الحد الأقصى للوقت الذي يجب أن تقضيه أداة الحلّ في المسألة وفي حال ترك هذه السياسة بدون ضبط، سيتم ضبط القيمة التلقائية على دقيقة واحدة. يجب أن يعتمد اختيار حد زمني على حجم المشكلة. على سبيل المثال، عند حلّ مثيل من 7 أيام يحتوي على 2 ShiftTemplates، ولكل منها 20 مرة بدء محتمَلة تقريبًا، وعقد حدثَين بمدة بدء محتملة تبلغ 30 مرة تقريبًا، ويومان عطلة في الأسبوع، القيم المقترَحة هي: <10 ثوانٍ للحلول السريعة (وعلى الأرجح دون المستوى الأمثل) (10 ثوانٍ و300 ثانية) للحصول على حلول عالية الجودة، وأكثر من 300 مرة لطلب بحث شامل. قد تتطلب الأجهزة الافتراضية الأكبر حجمًا حدودًا زمنية أطول.

هذه القيمة ليست حدًا صارمًا ولا تأخذ في الاعتبار النفقات العامة للاتصال. قد يتجاوز وقت الاستجابة المتوقّع لحل المشكلة هذه القيمة قليلاً.

مدة بالثواني مكونة من تسعة أرقام كسور كحد أقصى وتنتهي بالأرقام "s" مثال: "3.5s"

multiDaySchedule

boolean

في حال كانت القيمة صحيحة، تُنشئ أداة الحلّ EmployeeSchedule تتضمّن عدة ورديات (على سبيل المثال، لإنشاء جدول زمني لمدة أسبوع). وبخلاف ذلك، تحتوي كل EmployeeSchedule على وردية واحدة فقط. تفترض الجداول الزمنية المتعددة الأيام أن وقت بدء الوردية هو نفسه عبر الأيام، ويتم تحديد عدد أيام الإجازة في هذا الجدول بواسطة نماذج الوردية. القيمة التلقائية هي "خطأ".

shiftEventsCanChange

boolean

في حال كان هذا صحيحًا، قد تتضمّن EmployeeSchedule الممتدة لعدة أيام نوبات يختلف فيها وقت بدء الأحداث وانتهائها على مدار جميع الأيام. وبخلاف ذلك، يجب أن يتم تحديد وقت بدء الحدث وانتهائه لجميع الورديات في حدث EmployeeSchedule معيّن. وفي كلتا الحالتين، يكون لجميع التحولات في جدول زمني متعدد الأيام وقت البدء والانتهاء نفسه. وبالتالي، يتم تجاهل هذه المَعلمة إذا كانت السمة multiDaySchedule خطأ. قد يؤدّي ضبط هذه المَعلمة على "صحيح" إلى إطالة أوقات الحل. القيمة التلقائية هي "خطأ".

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)

أقرب وقت في اليوم يمكن أن تبدأ فيه الوردية. يتم تحديد هذه القيمة بالساعات والدقائق. يتم تجاهل الثواني وإطارات nanos.

latestStartTime

object (TimeOfDay)

آخر وقت في اليوم يمكن أن يبدأ فيه التحويل. يتم تحديد هذه القيمة بالساعات والدقائق. يتم تجاهل الثواني وإطارات nanos. إذا كانت هذه القيمة أقل من 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

يمثل وقتًا من اليوم. إما أن التاريخ والمنطقة الزمنية ليست مهمة أو تم تحديدها في مكان آخر. قد تختار واجهة برمجة التطبيقات السماح بالثواني. الأنواع ذات الصلة هي google.type.Date وgoogle.protobuf.Timestamp.

تمثيل JSON
{
  "hours": integer,
  "minutes": integer,
  "seconds": integer,
  "nanos": integer
}
الحقول
hours

integer

ساعات اليوم بتنسيق 24 ساعة. يجب أن تتراوح القيمة بين 0 و23. قد تختار واجهة برمجة التطبيقات السماح بالقيمة "24:00:00" لسيناريوهات مثل موعد إغلاق العمل.

minutes

integer

دقائق من ساعات اليوم. يجب أن تتراوح القيمة بين 0 و59.

seconds

integer

ثواني الدقائق من الوقت. يجب أن تتراوح القيمة عادةً بين 0 و59. وقد تسمح واجهة برمجة التطبيقات بالقيمة 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

تحدِّد هذه السمة عدد الموظفين المطلوبين لتغطية الطلب في الفترة الزمنية المحدّدة التي تشمل التاريخ والوقت.

تمثيل JSON
{
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },
  "employeeCount": integer
}
الحقول
startDateTime

object (DateTime)

بداية الفاصل الزمني للطلب المحدّد (شامل). تتم قراءة هذه القيم حتى دقيقة واحدة؛ يتم تجاهل كل الوحدات الأصغر حجمًا.

endDateTime

object (DateTime)

نهاية الفاصل الزمني للطلب المحدَّد (غير شامل) تتم قراءة هذه القيم حتى دقيقة واحدة؛ يتم تجاهل كل الوحدات الأصغر حجمًا.

employeeCount

integer

عدد الموظفين المطلوبين لتغطية الطلب خلال هذه الفترة الزمنية.

ShiftGenerationSolutionStatus

حالة الحلّ المقدَّمة في الردّ على أداة الحلّ

عمليات التعداد
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 صحيحة، يتم تمثيل يوم عطلة ضمنيًا بعدم وجود تغيير بدءًا من ذلك اليوم.

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 على "صحيح"، قد يختلف وقتَا بدء الأحداث وانتهائها على مستوى 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

مخالفة متعلقة بالتغطية خلال الفترة الزمنية المحدّدة. تشير القيمة الموجبة إلى أنّ الطلب مغطى، وتشير القيمة السالبة إلى أنّ الطلب مغطى.