Method: scheduling.solveShiftGeneration

Giải quyết vấn đề tạo ca làm việc từ SolveShiftGenerationRequest cho trước bằng cách tạo ca làm việc từ các mẫu ca làm việc nhất định để đáp ứng nhu cầu của nhân viên.

Yêu cầu HTTP

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

URL sử dụng cú pháp Chuyển mã gRPC.

Nội dung yêu cầu

Nội dung yêu cầu chứa dữ liệu có cấu trúc sau:

Biểu diễn dưới dạng JSON
{
  "solverConfig": {
    object (SolverConfig)
  },
  "shiftTemplates": [
    {
      object (ShiftTemplate)
    }
  ],
  "employeeDemands": [
    {
      object (EmployeeDemand)
    }
  ]
}
Trường
solverConfig

object (SolverConfig)

Không bắt buộc. Các tham số cho trình giải.

shiftTemplates[]

object (ShiftTemplate)

Bắt buộc. Bộ mẫu ca làm việc chỉ định các quy tắc tạo ca làm việc.

employeeDemands[]

object (EmployeeDemand)

Bắt buộc. Tổng nhu cầu của nhân viên mà những ca làm việc do shiftTemplates tạo ra cần đáp ứng.

Nội dung phản hồi

Câu trả lời cho vấn đề Tạo ca làm việc. Nếu solutionStatus trả về là SOLVED, thì một tập hợp các ca hợp lệ do trình giải quyết tạo ra sẽ được trả về trong employeeSchedules. Để có lịch chuyển đổi hợp lệ, các thuộc tính sau sẽ được giữ lại:

  1. Mỗi lượt chuyển được tạo trong employeeSchedules đều tuân thủ các quy tắc được chỉ định trong ShiftTemplate tương ứng.
  2. Mỗi sự kiện được chọn trong mỗi ca đều tuân thủ các quy tắc được chỉ định trong ShiftTemplate.Event tương ứng.
  3. Tổng số nhân viên được chỉ định cho nhóm ca làm việc được tạo từ cùng một ShiftTemplate không vượt quá maximumEmployeeCount trong mẫu đó.
  4. Nhóm nhân viên được chỉ định sẽ đáp ứng nhu cầu tại mỗi khoảng thời gian nhất định.

Nếu thành công, phần nội dung phản hồi sẽ chứa dữ liệu có cấu trúc sau:

Biểu diễn dưới dạng JSON
{
  "solutionStatus": enum (ShiftGenerationSolutionStatus),
  "employeeSchedules": [
    {
      object (EmployeeSchedule)
    }
  ],
  "demandCoverageViolations": [
    {
      object (DemandCoverageViolation)
    }
  ]
}
Trường
solutionStatus

enum (ShiftGenerationSolutionStatus)

Trạng thái của giải pháp được trả về. Nếu solutionStatus không phải là SOLVED, employeeSchedules sẽ trống.

employeeSchedules[]

object (EmployeeSchedule)

Nhóm ca làm việc do trình giải quyết tạo ra cùng với số lượng nhân viên được chỉ định cho mỗi lịch làm việc.

demandCoverageViolations[]

object (DemandCoverageViolation)

Các lỗi vi phạm về mức độ phù hợp của nhu cầu dựa trên employee_counts được chỉ định trong employeeSchedules đã cho. employeeDemands được cung cấp trong yêu cầu được tổng hợp – nếu 2 khoảng thời gian employee_demand trùng lặp, thì nhu cầu sẽ được cộng lại trên phần trùng lặp của khoảng thời gian.

SolverConfig

Chỉ định các tham số bổ sung để giải bài tập Tạo ca làm việc.

Biểu diễn dưới dạng JSON
{
  "timeLimit": string,
  "multiDaySchedule": boolean,
  "shiftEventsCanChange": boolean
}
Trường
timeLimit

string (Duration format)

Thời gian tối đa mà người giải toán nên dành cho bài toán đó. Nếu bạn không đặt chính sách này, thì thời gian mặc định sẽ là 1 phút. Việc lựa chọn giới hạn thời gian phải phụ thuộc vào quy mô của vấn đề. Ví dụ: khi giải quyết thực thể 7 ngày với 2 ShiftTemplates, mỗi sự kiện có khoảng 20 thời gian bắt đầu có thể và tổ chức 2 sự kiện với khoảng 30 thời gian bắt đầu có thể và hai ngày nghỉ mỗi tuần, các giá trị được đề xuất là: <10 giây cho các giải pháp nhanh (và có thể dưới 10 giây), (10 giây, 300 giây) cho các giải pháp chất lượng tốt và hơn 300 giây cho một tìm kiếm đầy đủ. Các thực thể lớn hơn có thể cần giới hạn thời gian lâu hơn.

Giá trị này không phải là giới hạn cố định và không tính đến chi phí liên lạc. Độ trễ dự kiến để giải quyết vấn đề có thể hơi vượt quá giá trị này.

Thời lượng tính bằng giây với tối đa 9 chữ số phân số, kết thúc bằng "s". Ví dụ: "3.5s".

multiDaySchedule

boolean

Nếu đúng, trình giải sẽ tạo các EmployeeSchedule có nhiều ca làm việc (ví dụ: để tạo lịch biểu kéo dài một tuần). Nếu không, mỗi EmployeeSchedule sẽ bao gồm đúng một ca làm việc. Lịch biểu nhiều ngày giả định rằng thời gian bắt đầu ca làm việc là như nhau qua các ngày và số ngày nghỉ trong lịch biểu như vậy được xác định bằng mẫu ca làm việc. Mặc định là sai.

shiftEventsCanChange

boolean

Nếu đúng, các EmployeeSchedule nhiều ngày có thể bao gồm những ca làm việc có thời gian bắt đầu và kết thúc sự kiện thay đổi trong tất cả các ngày. Nếu không, tất cả các lượt chuyển của một EmployeeSchedule cụ thể phải có thời gian bắt đầu và thời gian kết thúc của cùng một sự kiện. Trong cả hai trường hợp, tất cả các ca làm việc của lịch biểu nhiều ngày đều có cùng thời gian bắt đầu và kết thúc. Do đó, tham số này sẽ bị bỏ qua nếu multiDaySchedule là false. Nếu bạn đặt thông số này thành true, thì thời gian giải quyết có thể lâu hơn. Mặc định là sai.

ShiftTemplate

Mẫu chỉ định quy tắc tạo ca làm việc. Ca làm việc là một đơn vị công việc chỉ định thời gian bắt đầu, thời gian kết thúc và có thể chứa các sự kiện (chẳng hạn như bữa trưa, giờ nghỉ giải lao, v.v.). Một ca làm việc sẽ được gán một ngày cụ thể trong câu trả lời.

Biểu diễn dưới dạng JSON
{
  "id": string,
  "earliestStartTime": {
    object (TimeOfDay)
  },
  "latestStartTime": {
    object (TimeOfDay)
  },
  "durationMinutes": integer,
  "startTimeIncrementMinutes": integer,
  "daysOffCountPerWeek": integer,
  "eventTemplates": [
    {
      object (EventTemplate)
    }
  ],
  "minimumIntereventGapMinutes": integer,
  "maximumEmployeeCount": integer
}
Trường
id

string

Mã nhận dạng duy nhất của mẫu này.

earliestStartTime

object (TimeOfDay)

Thời điểm sớm nhất trong ngày mà quá trình chuyển có thể bắt đầu. Giá trị này được chỉ định bằng giờ và phút; giây và nano bị bỏ qua.

latestStartTime

object (TimeOfDay)

Thời điểm muộn nhất trong ngày mà quá trình làm việc có thể bắt đầu. Giá trị này được chỉ định bằng giờ và phút; giây và nano bị bỏ qua. Nếu giá trị này nhỏ hơn earliestStartTime, thì ca làm việc do mẫu này tạo có thể bắt đầu trước hoặc sau nửa đêm.

durationMinutes

integer

Đã sửa thời lượng thay đổi do mẫu này tạo.

startTimeIncrementMinutes

integer

Độ tăng thời gian (tính bằng phút) dùng để tạo tập hợp thời gian bắt đầu có thể có từ earliestStartTime đến latestStartTime. Ví dụ: nếu thời gian bắt đầu sớm nhất là 8:00, thời gian bắt đầu muộn nhất là 8:30 và thời gian bắt đầu tăng là 10 phút, thì tất cả thời gian bắt đầu có thể có cho mẫu ca làm việc này là: 8:00, 8:10, 8:20 và 8:30.

daysOffCountPerWeek

integer

Số ngày nghỉ mỗi tuần cố định. Nhân viên được nghỉ một ngày nếu không được phân vào ca làm việc bắt đầu vào ngày hôm đó. Một tuần có 7 ngày và bắt đầu vào Chủ Nhật.

eventTemplates[]

object (EventTemplate)

Quy tắc tạo sự kiện cho mỗi lượt chuyển. Chỉ một sự kiện sẽ được đưa vào mỗi ca thực hiện đối với mỗi Sự kiện được chỉ định.

minimumIntereventGapMinutes

integer

Số phút tối thiểu giữa thời điểm kết thúc một sự kiện và bắt đầu sự kiện tiếp theo.

maximumEmployeeCount

integer

Số lượng nhân viên tối đa có thể được chỉ định cho tất cả các ca làm việc do mẫu này tạo.

TimeOfDay

Đại diện cho thời gian trong ngày. Ngày và múi giờ không quan trọng hoặc được chỉ định ở nơi khác. API có thể chọn cho phép giây nhuận. Các loại có liên quan là google.type.Dategoogle.protobuf.Timestamp.

Biểu diễn dưới dạng JSON
{
  "hours": integer,
  "minutes": integer,
  "seconds": integer,
  "nanos": integer
}
Trường
hours

integer

Giờ trong ngày ở định dạng 24 giờ. Nên ở từ 0 đến 23. Một API có thể chọn cho phép giá trị "24:00:00" cho các tình huống như thời gian đóng cửa doanh nghiệp.

minutes

integer

Số phút trong ngày. Phải từ 0 đến 59.

seconds

integer

Số giây của thời gian. Giá trị thường phải từ 0 đến 59. Một API có thể cho phép giá trị 60 nếu cho phép bật-giây.

nanos

integer

Các phân số của giây tính bằng nano giây. Giá trị phải nằm trong khoảng từ 0 đến 999.999.999.

EventTemplate

Mẫu chỉ định các quy tắc để tạo một sự kiện đơn lẻ xảy ra trong một ca làm việc. Sự kiện có thể đại diện cho một cuộc họp, giờ nghỉ giải lao, bữa trưa, v.v.

Biểu diễn dưới dạng JSON
{
  "id": string,
  "minimumMinutesAfterShiftStart": integer,
  "maximumMinutesAfterShiftStart": integer,
  "durationMinutes": integer,
  "startTimeIncrementMinutes": integer
}
Trường
id

string

Mã nhận dạng duy nhất của mẫu này.

minimumMinutesAfterShiftStart

integer

Số phút tối thiểu sau khi bắt đầu ca làm việc mà sự kiện này có thể bắt đầu.

maximumMinutesAfterShiftStart

integer

Số phút tối đa sau khi bắt đầu ca làm việc mà sự kiện này có thể bắt đầu.

durationMinutes

integer

Thời lượng cố định tính bằng phút của sự kiện này.

startTimeIncrementMinutes

integer

Độ tăng thời gian (tính bằng phút) dùng để tạo tập hợp thời gian bắt đầu sự kiện có thể xảy ra từ minimumMinutesAfterShiftStart đến maximumMinutesAfterShiftStart. Ví dụ: nếu số phút tối thiểu sau khi bắt đầu ca làm việc là 30, số phút tối đa sau khi bắt đầu ca làm việc là 45 và khoảng thời gian bắt đầu tăng là 5 phút, sự kiện có thể diễn ra sau 30, 35, 40 hoặc 45 phút sau khi bắt đầu ca làm việc.

EmployeeDemand

Chỉ định số lượng nhân viên cần thiết để đáp ứng nhu cầu trong khoảng thời gian DateTime đã cho.

Biểu diễn dưới dạng JSON
{
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },
  "employeeCount": integer
}
Trường
startDateTime

object (DateTime)

Bắt đầu khoảng thời gian cho nhu cầu đã cho (bao gồm cả hai giá trị này). Các giá trị này được đọc xuống từng phút; giây và tất cả các đơn vị nhỏ hơn sẽ bị bỏ qua.

endDateTime

object (DateTime)

Kết thúc khoảng thời gian cho nhu cầu đã cho (không bao gồm). Các giá trị này được đọc xuống từng phút; giây và tất cả các đơn vị nhỏ hơn sẽ bị bỏ qua.

employeeCount

integer

Số lượng nhân viên cần thiết để đáp ứng nhu cầu cho khoảng thời gian này.

ShiftGenerationSolutionStatus

Trạng thái giải pháp được đưa ra trong câu trả lời của trình giải quyết.

Enum
SHIFT_GENERATION_SOLUTION_STATUS_UNSPECIFIED Trạng thái chưa xác định của phản hồi.
SHIFT_GENERATION_SOLVED Trình giải toán đã tìm ra lời giải trong giới hạn thời gian đưa ra.
SHIFT_GENERATION_NOT_SOLVED Một vấn đề đã khiến trình giải quyết không tạo được ca làm việc.
SHIFT_GENERATION_NOT_SOLVED_DEADLINE_EXCEEDED Không thể tạo ca làm việc để đáp ứng nhu cầu này trong khoảng thời gian đã cho.

EmployeeSchedule

Danh sách các ca làm việc theo thứ tự tương ứng với một ShiftTemplate được chỉ định cho một số nhân viên.

Biểu diễn dưới dạng JSON
{
  "shiftTemplateId": string,
  "shifts": [
    {
      object (ShiftWithEvents)
    }
  ],
  "employeeCount": integer
}
Trường
shiftTemplateId

string

Mã của mẫu được dùng để tạo nhóm ca làm việc này.

shifts[]

object (ShiftWithEvents)

Danh sách ca làm việc mà employeeCount nhân viên được chỉ định. Các ca và sự kiện được chọn cho lịch biểu được tạo từ một mẫu duy nhất. Các ca làm việc được sắp xếp theo trình tự thời gian và không chồng chéo nhau. Nếu SolverConfig.multi_day_schedule là đúng, thì một ngày nghỉ sẽ được biểu thị ngầm khi không có ca làm việc bắt đầu vào ngày đó.

employeeCount

integer

Số lượng nhân viên cần được chỉ định cho nhóm ca làm việc này để đáp ứng nhu cầu.

ShiftWithEvents

Cho biết ngày bắt đầu và ngày kết thúc cùng với danh sách các sự kiện cố định của ca làm việc do người giải quyết tạo ra.

Biểu diễn dưới dạng JSON
{
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },
  "events": [
    {
      object (Event)
    }
  ]
}
Trường
startDateTime

object (DateTime)

Ngày và giờ bắt đầu ca làm việc. Giá trị này được chỉ định theo phút; giây và đơn vị nhỏ hơn không được cung cấp.

endDateTime

object (DateTime)

Ngày và giờ kết thúc ca làm việc. Giá trị này được chỉ định theo phút; giây và đơn vị nhỏ hơn không được cung cấp.

events[]

object (Event)

Danh sách các sự kiện có trong lượt chuyển này, được ánh xạ chính xác đến và theo cùng thứ tự với ShiftTemplate.Event. Nếu giá trị SolverConfig.shift_events_can_change là true, thời gian bắt đầu và thời gian kết thúc của các sự kiện có thể khác nhau trên toàn bộ ShiftWithEvents của lịch biểu này.

Sự kiện

Chỉ định thời gian bắt đầu và kết thúc của một sự kiện cụ thể trong ca làm việc do trình giải quyết tạo ra.

Biểu diễn dưới dạng JSON
{
  "eventTemplateId": string,
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  }
}
Trường
eventTemplateId

string

Mã của mẫu được dùng để tạo sự kiện này.

startDateTime

object (DateTime)

Ngày và giờ bắt đầu sự kiện. Giá trị này được chỉ định theo phút; giây và đơn vị nhỏ hơn không được cung cấp.

endDateTime

object (DateTime)

Ngày và giờ kết thúc sự kiện. Giá trị này được chỉ định theo phút; giây và đơn vị nhỏ hơn không được cung cấp.

DemandCoverageViolation

Chỉ định lỗi vi phạm về mức độ phù hợp của nhu cầu trong khoảng thời gian nhất định. Nhu cầu của nhân viên là như nhau trong toàn bộ khoảng thời gian được chỉ định.

Biểu diễn dưới dạng JSON
{
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },
  "coverageViolation": integer
}
Trường
startDateTime

object (DateTime)

Ngày và giờ bắt đầu của khoảng thời gian theo nhu cầu (bao gồm cả ngày này). Giá trị này được chỉ định theo phút.

endDateTime

object (DateTime)

Ngày và giờ kết thúc của khoảng thời gian theo nhu cầu (không bao gồm). Giá trị này được chỉ định theo phút.

coverageViolation

integer

Vi phạm mức độ phù hợp trong khoảng thời gian chỉ định. Giá trị dương cho biết nhu cầu bị vượt quá và giá trị âm cho biết nhu cầu không được khai thác.