Soluciona um problema de programação de turnos fixo do SolveShiftSchedulingRequest
fornecido, atribuindo funcionários a turnos de modo que os as preferências de programação são maximizadas e as violações de restrições de agendamento são minimizadas.
Solicitação HTTP
POST https://optimization.googleapis.com/v1/scheduling:solveShiftScheduling
O URL usa a sintaxe de transcodificação gRPC.
Corpo da solicitação
O corpo da solicitação contém dados com a seguinte estrutura:
Representação JSON |
---|
{ "requestId": string, "solveParameters": { object ( |
Campos | |
---|---|
requestId |
ID do problema ou da solicitação. |
solveParameters |
Parâmetros para controlar uma única solução do problema. |
employees[] |
Todos os funcionários disponíveis a serem programados. |
shifts[] |
Todos os turnos para formar o cronograma. |
coverageRequirements[] |
Requisitos de cobertura para todo o horizonte de planejamento. Elas especificam o número de funcionários que devem desempenhar cada função ou ter uma habilidade durante um período ou uma lista de IDs de turno. Todos os requisitos de cobertura precisam ser especificados com períodos ou uma lista de IDs de turnos, mas não com ambos. Os períodos (se informados) dos requisitos de cobertura não podem se sobrepor para cada local. O nível de prioridade padrão para cada uma dessas restrições é |
roleIds[] |
Lista de todas as funções possíveis dos funcionários. Cada funcionário precisa ter pelo menos uma função que possa ser atribuída a ele em um turno. Uma função se refere a uma atribuição de trabalho específica durante um turno (ou seja, enfermeiro, chefe executivo, garçom etc.). Quando um funcionário é atribuído a um turno, ele também recebe uma única função específica. |
skillIds[] |
Lista de todas as habilidades possíveis na força de trabalho. Uma habilidade se refere a qualquer qualificação extra que um funcionário possa ter que não esteja relacionada a um trabalho específico atribuído a ela (ou seja, certificações, idiomas falados etc.). Esta lista pode estar vazia. Quando um funcionário é designado para um turno, ele deve ter todas as habilidades necessárias para esse turno. |
locationIds[] |
Lista de todos os locais possíveis para o conjunto de turnos na programação. Esta lista pode estar vazia. Especificar locais diferentes pode ser útil quando, por exemplo, um gerente de enfermagem quer agendar muitos enfermeiros de diferentes unidades de um hospital ou, por outro exemplo, um gerente de hotel quer agendar funcionários em vários hotéis. |
budgetRequirements[] |
Especificação de orçamento para o problema de agendamento. O nível de prioridade padrão para cada um desses requisitos é |
assignmentsHint[] |
Mude as atribuições para usar como uma solução provisória (também conhecida como dica de solução) para o problema de agendamento. As dicas de atribuição serão ignoradas se a atribuição contradizer um turno não atribuível ou uma solicitação de programação. |
Corpo da resposta
Resposta da API de programação da força de trabalho. Para cada resposta, o shiftAssignments
vai estar vazio se o solutionStatus
retornado for NOT_SOLVED_DEADLINE_EXCEEDED
ou INFEASIBLE
. Se o solutionStatus
retornado for OPTIMAL
ou FEASIBLE
, uma atribuição de turno válida será retornada em shiftAssignments
. Para uma atribuição de turno válida, as seguintes propriedades são mantidas:
- Cada ID de funcionário está contido no conjunto de funcionários fornecido na solicitação.
- Cada ID de função atribuído ao funcionário está contido no conjunto de IDs de função do funcionário em questão.
- Cada ID de turno está contido no conjunto de turnos fornecido na solicitação.
- Cada ID de turno não é um dos IDs de turno não atribuíveis do funcionário em questão.
- Um funcionário nunca será atribuído a dois turnos sobrepostos.
- Na programação especificada, nenhuma das restrições ou solicitações com nível de prioridade
PRIORITY_MANDATORY
foi violada.
Se bem-sucedido, o corpo da resposta incluirá dados com a estrutura a seguir:
Representação JSON |
---|
{ "requestId": string, "solutionStatus": enum ( |
Campos | |
---|---|
requestId |
O ID da solicitação à qual esta resposta está associada. |
solutionStatus |
Status da solução retornada. Se a solução não for viável ou otimizada, outros campos no proto poderão ficar vazios. Se o status for NOT_SOLVED_DEADLINE_EXCEEDED, significa que o limite de tempo foi atingido sem que houvesse uma solução viável ou determinasse se existe uma solução viável. As solicitações podem ser inviáveis se as restrições do nível de prioridade MANDATORY não puderem ser atendidas. |
shiftAssignments[] |
Lista de todas as atribuições. Cada |
statusMessage |
Se |
SolveParameters
Parâmetros que controlam uma única solução do problema da programação de turnos.
Representação JSON |
---|
{ "timeLimit": string } |
Campos | |
---|---|
timeLimit |
O tempo máximo que o solucionador deve gastar no problema. Se não for definido, o padrão será um minuto. Esse valor não é um limite fixo e não considera a sobrecarga de comunicação. A latência esperada para resolver o problema pode exceder um pouco esse valor. Duração em segundos com até nove dígitos fracionários, terminando em " |
Funcionário
Um funcionário da força de trabalho a ser agendado.
Representação JSON |
---|
{ "id": string, "roleIds": [ string ], "skillIds": [ string ], "shiftPreferences": [ { object ( |
Campos | |
---|---|
id |
ID exclusivo atribuído a este funcionário. |
roleIds[] |
IDs de funções que este funcionário pode realizar. É preciso especificar pelo menos um papel. Quando um funcionário é atribuído a um turno, ele também recebe uma única função dessa lista. O funcionário pode receber diferentes funções durante a janela de agendamento. |
skillIds[] |
IDs de habilidade desse funcionário. Esta lista pode estar vazia. Quando um funcionário é designado para um turno, ele usa qualquer subconjunto das habilidades listadas aqui para cobrir os requisitos de habilidade durante todo o turno atribuído. |
shiftPreferences[] |
Mudar as preferências desse funcionário. Os turnos especificados aqui representam aqueles a que o funcionário gostaria de ser designado durante a janela de agendamento. Os IDs de turno especificados em |
schedulingConstraints[] |
Lista de restrições de agendamento para esse funcionário. O nível de prioridade padrão para cada uma dessas restrições é |
resourceConstraints[] |
Outras restrições de programação não especificadas em |
shiftRequests[] |
Lista de solicitações de turno do funcionário. A solicitação pode ser para que um funcionário seja atribuído ou não a turnos específicos. Qualquer atribuição de agendamento fixo para o funcionário pode ser representada por uma |
hourlyContract |
Contrato que especifica taxas horárias regulares e extras para o funcionário. |
ShiftPreference
Uma preferência numérica por um ID de turno específico.
Representação JSON |
---|
{ "shiftId": string, "preference": integer } |
Campos | |
---|---|
shiftId |
ID do turno para o qual a preferência é especificada. |
preference |
Valores maiores de preferência indicam uma mudança mais desejável. |
SchedulingConstraint
Restrição de programação específica para determinado funcionário. A restrição especificada é aplicada apenas durante o intervalo [startDateTime,
endDateTime)
determinado.
Representação JSON |
---|
{ "priority": enum ( |
Campos | |
---|---|
priority |
Nível de prioridade para esta restrição de programação. A prioridade padrão para todas as restrições de programação é |
startDateTime |
O horário de início em que essa restrição de programação se aplica (inclusivo). |
endDateTime |
O horário de término em que esta restrição de programação se aplica (exclusivo). |
Campo de união type . O tipo de restrição especificada. Cada restrição é aplicada somente dentro do período especificado acima. type pode ser apenas de um dos tipos a seguir: |
|
minimumMinutes |
Número mínimo de minutos que o funcionário pode trabalhar. Se o funcionário for atribuído a um turno que se sobrepõe (total ou parcialmente) à janela de tempo, o número de minutos que o turno se sobrepõe à janela de tempo será incluído nessa contagem. |
maximumMinutes |
Número máximo de minutos que o funcionário pode trabalhar na janela de tempo. Se o funcionário for atribuído a um turno que se sobrepõe (total ou parcialmente) à janela de tempo, o número de minutos que o turno se sobrepõe à janela de tempo será incluído nessa contagem. |
minimumConsecutiveWorkDays |
Número mínimo de dias consecutivos em que o funcionário pode trabalhar. Um funcionário trabalha em um dia específico se receber um turno que começa nesse mesmo dia. Todos os turnos atribuídos ao funcionário que começam na janela de tempo são incluídos nessa contagem. |
maximumConsecutiveWorkDays |
Número máximo de dias consecutivos em que o funcionário pode trabalhar. Um funcionário trabalha em um dia específico se receber um turno que começa nesse mesmo dia. Todos os turnos atribuídos ao funcionário que começam na janela de tempo são incluídos nessa contagem. |
minimumShiftCount |
Número mínimo de turnos em que o funcionário pode trabalhar. Qualquer turno atribuído ao funcionário e que se sobreponha totalmente à janela de tempo é incluído nessa contagem. |
maximumShiftCount |
Número máximo de turnos em que o funcionário pode trabalhar. Qualquer turno atribuído ao funcionário e que se sobreponha totalmente à janela de tempo é incluído nessa contagem. |
minimumRestMinutes |
Número mínimo de minutos que o funcionário precisa descansar após o final de um turno antes de ser atribuído a outro. Essa restrição se aplica a todos os pares de turnos totalmente incluídos em [ |
Prioridade
O nível de prioridade para qualquer restrição no cronograma de um funcionário ou os requisitos de cobertura. Isso inclui SchedulingConstraint
, ResourceConstraint
, ShiftRequest
e CoverageRequirement
. Como pode haver restrições conflitantes, nem sempre é possível satisfazer todas as restrições. Assim, cada tipo de restrição tem uma prioridade (dada pelo usuário ou por um padrão) que informa ao solucionador a importância relativa de todas as restrições dadas a uma programação completa.
Enums | |
---|---|
PRIORITY_UNSPECIFIED |
Nível de prioridade desconhecido. |
PRIORITY_LOW |
O nível de prioridade mais baixo. As restrições com essa prioridade são menos importantes que as outras. Elas são as primeiras a serem consideradas por violação se não for possível encontrar uma solução viável. |
PRIORITY_MEDIUM |
Nível de prioridade médio. As restrições com essa prioridade são mais importantes do que aquelas com prioridade PRIORITY_LOW , mas menos importantes que as com prioridade PRIORITY_HIGH . Se não for possível encontrar uma solução viável depois de relaxar todas as restrições com prioridade PRIORITY_LOW , as restrições com prioridade PRIORITY_MEDIUM serão consideradas em seguida para violação. |
PRIORITY_HIGH |
O nível de prioridade mais alto. As restrições com esse nível de prioridade são as mais importantes. Elas são as últimas a serem consideradas para violação se não for possível encontrar uma solução viável após a flexibilização das restrições dos níveis de prioridade mais baixos. |
PRIORITY_MANDATORY |
O nível de prioridade que representa algo que não pode ser violado pelo solucionador. Se o solucionador estiver retornando SolutionStatus.INFEASIBLE , isso pode ser devido a muitas restrições de PRIORITY_MANDATORY . |
ResourceConstraint
Restrição geral que limita a quantidade de um determinado "recurso" usada por um funcionário. Essa é uma versão abstrata da SchedulingConstraint
mais específica e mais flexível para o usuário. Muitas restrições de programação que não podem ser especificadas no SchedulingConstraint.type
podem ser definidas com essa mensagem.
Representação JSON |
---|
{
"priority": enum ( |
Campos | |
---|---|
priority |
Nível de prioridade dessa restrição de recurso. A prioridade padrão para todas as restrições de recursos é |
resourceUsages |
Quantidade de recursos usados por turnos. Por exemplo, se essa restrição se aplicar às horas mínima e máxima trabalhadas por um funcionário em uma semana específica, o mapa conterá as mudanças que ocorrerem nessa semana e a duração de cada turno em horas. Um objeto com uma lista de pares |
minimumResourceUsage |
Uso mínimo de recursos para atender a uma restrição de recursos. |
maximumResourceUsage |
Uso máximo de recursos para atender a uma restrição de recursos. |
ShiftRequest
A solicitação de um funcionário para ser atribuído ou não a turnos específicos.
Representação JSON |
---|
{ "priority": enum ( |
Campos | |
---|---|
priority |
Nível de prioridade dessa solicitação de programação. A prioridade padrão para todas as solicitações de programação é |
shiftIds[] |
Os IDs de turno da solicitação de programação. |
type |
Tipo de solicitação, por exemplo, se a solicitação é atribuída ou não ao conjunto de turnos. |
WorkStatus
Se um funcionário está trabalhando ou não.
Enums | |
---|---|
WORK_STATUS_UNSPECIFIED |
Status do trabalho desconhecido. |
STATUS_WORK |
Status que representa um funcionário que trabalha. |
STATUS_NOT_WORK |
Status que representa um funcionário desempregado. |
HourlyContract
Especifica uma taxa por hora básica, diferenciais de taxas e multiplicadores de horas extras para determinar a remuneração de um funcionário. Observe que os regulamentos em locais diferentes podem exigir um cálculo diferente de compensação por horas extras. O solucionador faz uma aproximação da compensação por tempo extra para minimizar uma representação do custo total ou atender a um orçamento (consulte BudgetRequirement
). Ele não é uma ferramenta para calcular a folha de pagamento.
Representação JSON |
---|
{
"baseHourlyRate": number,
"hourlyRateShiftDifferentials": {
string: number,
...
},
"overtimePeriods": [
{
object ( |
Campos | |
---|---|
baseHourlyRate |
A compensação pelo trabalho em uma hora que não seja horas extras. Se várias taxas forem aplicadas ao funcionário, os diferenciais de taxas serão aplicados em relação a essa taxa por hora básica. Além disso, se houver várias taxas, a taxa básica por hora precisará ser a mínima dessas taxas. |
hourlyRateShiftDifferentials |
É o diferencial da taxa por hora, pago sobre Um objeto com uma lista de pares |
overtimePeriods[] |
Uma lista de todos os períodos em que as horas extras precisam ser computadas. Esses períodos não podem se sobrepor. |
OvertimePeriod
Um período fixo e regularmente recorrente (normalmente 168 horas ou sete períodos consecutivos de 24 horas) que é usado para determinar o valor da compensação de horas extras. Cada período tem um multiplicador de horas extras (por exemplo, 1.5) em relação ao baseHourlyRate
e um limite para o número de horas que são consideradas trabalho normal (sem horas extras). Qualquer mudança que se sobreponha à janela de tempo de startDateTime
(inclusiva) e endDateTime
(exclusiva) é contabilizada no total de horas trabalhadas no período. Se a sobreposição for parcial, somente as horas sobrepostas serão contabilizadas.
Representação JSON |
---|
{ "overtimeMultiplier": number, "startDateTime": { object ( |
Campos | |
---|---|
overtimeMultiplier |
Multiplicador para calcular a taxa por hora de horas extras (precisa ser maior ou igual a 1,0). A taxa por hora de horas extras normalmente é calculada como |
startDateTime |
Horário de início do período da prorrogação. Se um turno se sobrepuser a esse período, as horas dessa mudança serão contadas a partir de |
endDateTime |
Hora de término da prorrogação. Se um turno se sobrepuser a esse período, as horas dessa mudança serão contadas até |
maximumRegularHours |
Número máximo de horas de trabalho pagas a uma taxa normal (sem horas extras). Essa quantidade precisa ser positiva. |
Shift
Um turno especifica uma janela de tempo fixa em que os funcionários podem trabalhar.
Representação JSON |
---|
{ "id": string, "locationId": string, "startDateTime": { object ( |
Campos | |
---|---|
id |
ID exclusivo atribuído a este turno. |
locationId |
ID do local em que essa mudança é trabalhada. Pode ficar vazio. |
startDateTime |
O horário de início do turno (inclusivo). |
endDateTime |
O horário de término do turno (não incluso). No momento, o solucionador só permite mudanças com menos de 24 horas de duração. |
breakRules[] |
Uma lista de regras de violação que ocorrem durante o turno. Os funcionários que trabalham nesse turno recebem um intervalo por |
BreakRule
uma regra que determina quando um intervalo pode começar dentro de um turno e a duração dele. A lista de todas as possíveis quebras consideradas é determinada em incrementos de ruleIncrementMinutes
. Por exemplo, se uma regra de intervalo estiver modelando um intervalo de 30 minutos que pode começar entre 10h00 e 11h00, e o incremento da regra for de 20 minutos, a lista de intervalos considerados será: [10:00, 10:30], [10:20, 10:50], [10:40, 11,3]
Representação JSON |
---|
{ "earliestStartTime": { object ( |
Campos | |
---|---|
earliestStartTime |
O primeiro horário de início do intervalo (inclusive). Apenas |
latestStartTime |
O último horário de início do intervalo (inclusive). Apenas |
durationMinutes |
Duração do intervalo em minutos. |
ruleIncrementMinutes |
[Opcional] É o acréscimo de minutos em minutos para todos os intervalos que podem ser considerados nesta regra de intervalo. Se não for definido, o padrão será |
CoverageRequirement
Um requisito de cobertura especifica o número de funcionários necessários para um conjunto de funções e/ou habilidades durante um determinado período e em um determinado local. Os intervalos DateTime em um local específico não podem se sobrepor. Como alternativa, é possível fornecer uma lista de códigos de turno em vez de uma janela de tempo e um local. Somente os funcionários que podem ser atribuídos à função específica (ou que possuem a habilidade específica) podem atender a esse requisito.
Para uma determinada função e/ou habilidade, o requisito de cobertura é atendido quando pelo menos targetEmployeeCount
de funcionários estão trabalhando a cada momento da janela de tempo (ou a cada turno em shiftIds
). Por outro lado, o requisito de cobertura será violado se, em algum momento do período (ou para qualquer um dos turnos em shiftIds
), houver menos de targetEmployeeCount
de funcionários trabalhando nesse período. Mais funcionários que trabalham do que targetEmployeeCount
ainda cumpre o requisito, mas o solucionador minimiza o excesso de funcionários.
Representação JSON |
---|
{ "startDateTime": { object ( |
Campos | |
---|---|
startDateTime |
O horário de início do requisito de cobertura (inclusivo). Se definido, |
endDateTime |
O horário de término do requisito de cobertura (não incluso). Se definido, |
locationId |
Local onde os funcionários são necessários. |
shiftIds[] |
Se definidos, os requisitos de função e habilidade serão aplicados individualmente a cada ID de turno na lista. Se shiftIds não estiverem vazios, |
roleRequirements[] |
Número obrigatório de funcionários atribuídos aos papéis especificados durante o período. No máximo, um |
skillRequirements[] |
Número obrigatório de funcionários com as habilidades específicas atribuídas aos turnos durante a janela de tempo. É necessário fornecer no máximo um |
RoleRequirement
Número obrigatório de funcionários atribuídos à função especificada durante o período.
Representação JSON |
---|
{
"roleId": string,
"targetEmployeeCount": integer,
"priority": enum ( |
Campos | |
---|---|
roleId |
ID do papel para o requisito. |
targetEmployeeCount |
Número desejado de funcionários atribuídos à função durante o período. |
priority |
Nível de prioridade para essa restrição de requisito. A prioridade padrão para todas as restrições de recursos é |
SkillRequirement
Número obrigatório de funcionários que estão trabalhando durante o período e possuem a habilidade especificada.
Representação JSON |
---|
{
"skillId": string,
"targetEmployeeCount": integer,
"priority": enum ( |
Campos | |
---|---|
skillId |
ID da habilidade para o requisito. |
targetEmployeeCount |
Número desejado de funcionários com a habilidade determinada que estão trabalhando durante o período. |
priority |
Nível de prioridade para essa restrição de requisito. A prioridade padrão para todas as restrições de recursos é |
BudgetRequirement
Requisitos de orçamento para um determinado intervalo.
Representação JSON |
---|
{ "totalBudget": number, "startDateTime": { object ( |
Campos | |
---|---|
totalBudget |
Orçamento total para o intervalo especificado. Será necessário fornecer um orçamento total se a prioridade for Se |
startDateTime |
Horário de início de aplicação desse orçamento. Se o horário de início não for especificado, ele será o primeiro de todos os turnos especificados. |
endDateTime |
Horário de término de aplicação do orçamento. Se um horário de término não for especificado, ele será definido como o horário de término mais recente de todos os turnos especificados. |
priority |
Nível de prioridade para atender ao requisito de orçamento durante o período especificado. A prioridade padrão é Se essa prioridade for maior do que outras prioridades de restrição e se |
ShiftAssignment
Um funcionário para atribuir um turno de funções.
Representação JSON |
---|
{
"employeeId": string,
"shiftId": string,
"roleId": string,
"breaks": [
{
object ( |
Campos | |
---|---|
employeeId |
O ID do funcionário que está sendo atribuído. |
shiftId |
ID de turno atribuído ao funcionário. |
roleId |
ID da função atribuída ao funcionário no turno. |
breaks[] |
Lista de intervalos para esta atribuição de turno. |
Intervalo
Período em que um funcionário interrompe o trabalho durante um turno.
Representação JSON |
---|
{
"startDateTime": {
object ( |
Campos | |
---|---|
startDateTime |
O horário de início de uma pausa. |
durationMinutes |
Duração do intervalo em minutos. |
SolutionStatus
Status da solução (ou seja, uma programação) fornecido na resposta de um solucionador.
Enums | |
---|---|
SOLUTION_STATUS_UNSPECIFIED |
Status não especificado para a resposta. |
FEASIBLE |
A programação de retorno é viável, mas pode não ser a ideal. |
OPTIMAL |
A programação de devolução é a ideal. |
INFEASIBLE |
Não há uma programação viável para as restrições fornecidas. O solucionador pode retornar esse valor se algum subconjunto das restrições com nível de prioridade PRIORITY_MANDATORY não puder ser atendido. |
NOT_SOLVED |
Nenhuma programação foi encontrada. |
NOT_SOLVED_DEADLINE_EXCEEDED |
Nenhuma programação foi encontrada dentro do limite de tempo. |