Package google.research.optimization.v1.workforce

索引

休息时间

员工在轮班期间打断其工作的时间段。

字段
start_date_time

DateTime

广告插播开始时间。

duration_minutes

int32

广告插播时长(分钟)。

BreakRule

一条规则,用于确定何时可以在轮班和轮班中开始广告插播。所有被视为可能的广告插播时间点的列表是以 rule_increment_minutes 为增量确定的。例如,如果广告插播规则建模为从 10:00 到 11:00 之间开始的 30 分钟插播时间点,且规则增量为 20 分钟,则系统考虑的插播时间点列表为:[10:00, 10:30]、[10:20, 10:50]、[10:10, 0.1]、11

字段
earliest_start_time

DateTime

广告插播的最早开始时间(含此时间)。只能设置 hoursminutes

latest_start_time

DateTime

广告插播时间点的最晚开始时间(含此时间)。只能设置 hoursminutes

duration_minutes

int32

广告插播时长(分钟)。

rule_increment_minutes

int32

[可选] 此广告插播规则可考虑的所有广告插播时间点的时间增量(以分钟为单位)。如果未设置,则默认为 duration_minutes

BudgetRequirement

给定时间间隔内的预算要求。

字段
total_budget

double

指定时间间隔内的总预算。如果优先级为 PRIORITY_MANDATORY,则必须提供总预算。

如果未设置 total_budget,则系统会根据指定的 priority 最大限度地降低时间表的总费用。例如,如果预算的 priorityPRIORITY_MEDIUM,则求解器会在减少任何优先级为 PRIORITY_LOW 的限制条件违规之前降低费用。

start_date_time

DateTime

此预算适用的开始时间。如果未指定开始时间,则系统会将其设置为所有指定班次的最早开始时间。

end_date_time

DateTime

此预算应用的结束时间。如果未指定结束时间,则系统会将其设置为所有指定班次的最晚结束时间。

priority

Priority

在指定时间范围内满足预算要求的优先级。默认优先级为 PRIORITY_LOW。如果优先级设置为 PRIORITY_MANDATORY,则必须设置 total_budget

请注意,如果此优先级高于其他限制条件优先级,并且 total_budget 很紧,则生成的时间表可能会严重违反员工限制或覆盖范围要求。

CoverageRequirement

覆盖范围要求规定了在特定的时间范围内和/或地点在特定地点,担任一组角色和/或技能所需的员工人数。特定位置的日期时间间隔不能重叠。或者,也可以提供轮班 ID 列表,而不是时段和位置。只有可以分配给特定角色(或具备特定技能)的员工才能满足此要求。

对于给定的职位和/或技能,如果相应时间范围内每个时刻(或shift_ids的每次班次)都至少有 target_employee_count 名员工在工作,则满足覆盖率要求。相反,如果在时间范围内的任何时间点(或shift_ids的任何班次)在该时间范围内工作的员工数少于 target_employee_count,则不符合覆盖率要求。比 target_employee_count 中的在职员工数多出仍然符合要求,但求解器可以最大限度地减少员工过多。

字段
start_date_time

DateTime

覆盖率要求的开始时间(含此时间)。如果设置了此字段,则 shift_ids 必须为空。

end_date_time

DateTime

覆盖率要求的结束时间(不含边界值)。如果设置了此字段,则 shift_ids 必须为空。

location_id

string

员工工作地点。“shift_ids”不为空,此字段必须为空。

shift_ids[]

string

如果已设置,角色和技能要求会分别应用于此列表中的每个轮班 ID。如果 shift_ids 不为空,则 start_date_timeend_date_timelocation_id 必须为空。

role_requirements[]

RoleRequirement

在时间范围内要分配给指定角色的所需员工人数。最多只能为每个角色 ID 指定一个 role_requirement。每项要求的默认优先级均为 PRIORITY_MANDATORY。如果在该时间范围内任何时间点为指定角色分配的员工少于 target_employee_count 人,则违反这些限制条件。

skill_requirements[]

SkillRequirement

在相应时间范围内分配到轮班的必需员工人数。每个技能 ID 最多只能提供一个 skill_requirement。每项要求的默认优先级均为 PRIORITY_LOW。如果在这段时间内拥有指定技能的员工数少于 target_employee_count,则违反这些约束条件。

RoleRequirement

在时间范围内要分配给指定角色的所需员工人数。

字段
role_id

string

要求的角色 ID。

target_employee_count

int32

在时间范围内分配给该角色的预期员工数量。

priority

Priority

此要求限制条件的优先级。所有资源限制条件的默认优先级均为 PRIORITY_MANDATORY

SkillRequirement

在指定时间范围内工作并具备指定技能的必要员工人数。

字段
skill_id

string

要求的技能 ID。

target_employee_count

int32

符合指定技能的在一定时间范围内工作的理想员工数。

priority

Priority

此要求限制条件的优先级。所有资源限制条件的默认优先级均为 PRIORITY_LOW

员工

要安排的一名员工。

字段
id

string

分配给此员工的唯一 ID。

role_ids[]

string

此员工可以执行的角色 ID。必须至少指定一个角色。当员工被分配到某个轮班时,他们也会分配到此列表中的单个角色。在时间安排期间,员工可能会被分配不同的角色。

skill_ids[]

string

此员工拥有的技能 ID。此列表可以为空。员工分配到某个轮班后,该员工会在分配给该轮班的整个期间使用本文所列的任意技能组合来满足技能要求。

shift_preferences[]

ShiftPreference

调整此员工的偏好。此处指定的班次表示希望员工在时间安排期间分配到的班次。shift_preferences 中指定的班次 ID 必须是唯一的。该求解器会尝试尽可能提高所有满足的 shift_preferencesShiftPreference.preference 值的总和。

scheduling_constraints[]

SchedulingConstraint

此员工的时间安排限制条件列表。其中每个约束条件的默认优先级都是 PRIORITY_MEDIUM。如需了解详情,请参阅 Priority 枚举。

resource_constraints[]

ResourceConstraint

未在 scheduling_constraints 中指定的任何其他时间安排限制条件可在此处添加到 resource_constraints 中。ResourceConstraint 是一种更抽象的表示法,用于限制员工的资源。其中每个约束条件的默认优先级都是 PRIORITY_MEDIUM。如需了解详情,请参阅 Priority 枚举。

shift_requests[]

ShiftRequest

员工的轮班请求列表。申请可以指派某个员工,也可以不为其分配特定班次。员工的任何固定时间安排分配都可以用优先级为 PRIORITY_MANDATORYShiftRequest 表示。一个轮班 ID 最多可出现在此员工的一个日程安排请求中。所有这些请求的默认优先级为 PRIORITY_LOW。如需了解详情,请参阅 Priority 枚举。

hourly_contract

HourlyContract

规定员工按时费率和加班费率计算的合同。

EmployeeDemand

指定在给定日期时间间隔内满足需求所需的员工数。

字段
start_date_time

DateTime

指定需求(含边界值)的时间范围的开始时间。这些值会读到分钟;秒和所有较小的单位都会被忽略。

end_date_time

DateTime

指定需求(不含边界)的时间间隔结束值。这些值会读到分钟;秒和所有较小的单位都会被忽略。

employee_count

int32

满足此间隔期间的需求所需的员工数。

EmployeeSchedule

一个有序排班列表,对应于要分配给多个员工的单个 ShiftTemplate

字段
shift_template_id

string

用于生成此组偏移的模板的 ID。

shifts[]

ShiftWithEvents

已分配 employee_count 名员工的班次列表。为时间表选择的轮班和事件是使用单个模板生成的。偏移按时间顺序排序,且不重叠。如果 SolverConfig.multi_day_schedule 为 true,则隐含从当天开始调整的日期。

employee_count

int32

应分配到该组班次以覆盖需求的员工数。

ShiftWithEvents

指定开始日期和结束日期,以及求解器生成的偏移固定事件列表。

字段
start_date_time

DateTime

班次开始日期和时间。该值精确到分钟;不提供秒和更小的单位。

end_date_time

DateTime

轮班结束日期和时间。该值精确到分钟;不提供秒和更小的单位。

events[]

Event

此偏移中包含的事件的列表,这些事件准确映射到 ShiftTemplate.Event,且顺序相同。如果 SolverConfig.shift_events_can_change 为 true,则在此时间表的所有 ShiftWithEvents 中,活动的开始时间和结束时间可能会有所不同。

事件

指定求解器生成的偏移中特定事件的开始和结束日期时间。

字段
event_template_id

string

用于生成此事件的模板的 ID。

start_date_time

DateTime

事件的开始日期和时间。该值精确到分钟;不提供秒和更小的单位。

end_date_time

DateTime

活动的结束日期和时间。该值精确到分钟;不提供秒和更小的单位。

EventTemplate

模板,用于指定生成轮班期间发生的单个事件的规则。活动可能表示会议、休息、午餐等。

字段
id

string

此模板的唯一 ID。

minimum_minutes_after_shift_start

int32

轮班开始后,此事件可以开始的最短分钟数。

maximum_minutes_after_shift_start

int32

轮班开始后,此事件可以开始的分钟数上限。

duration_minutes

int32

此事件的固定时长(以分钟为单位)。

start_time_increment_minutes

int32

用于生成一组可能的事件开始时间的时间增量(以分钟为单位),介于 minimum_minutes_after_shift_startmaximum_minutes_after_shift_start 之间。例如,如果轮班开始后的最短分钟数为 30,开始轮班后最长的分钟数为 45,而开始时间增量为 5 分钟,那么事件可能会在轮班开始后 30、35、40 或 45 分钟内发生。

HourlyContract

指定基本小时费率、差价和加班系数,以确定员工的薪酬。请注意,不同地方的法规对加班薪酬的计算方式可能有所不同。求解器可以估算加班时间的薪酬,以尽可能降低总费用的替代价值或达到预算要求(请参阅 BudgetRequirement)。它不用作计算工资的工具。

字段
base_hourly_rate

double

非加班时间的工资。如果员工适用多个费率,则会根据此基本小时费率应用差价。此外,如果存在多种费率,则基本每小时费率应为这些费率中的最小值。

hourly_rate_shift_differentials

map<string, double>

每小时费率差额,在 base_hourly_rate的基础上支付。例如,如果基本每小时费率为 $30/小时,“shift_1”的费率为 $40/小时,“shift_2”的费率为 $45/小时,那么 proto 表示法为:base_hourly_rate: 30 hourly_rate_shift_differentials {key: "shift_1" value: 10} hourly_rate_shift_differentials {key: "shift_2" value: 15}

overtime_periods[]

OvertimePeriod

需要计算加时时间的所有时间段的列表。这些时间段不能重叠。

OvertimePeriod

一个有周期、定期重复的固定期限(通常为 168 小时或连续 7 个 24 小时的时间段),用于确定加班工资的金额。每个时间段都有一个加时系数(例如,1.5) 相对于base_hourly_rate,以及被视为常规(非加班)工作时间的小时数限制。与 start_date_time(含)和 end_date_time(不含)时间范围重叠的任何班次都会计入该时间段内的工作小时数。如果重叠部分是重叠的,则系统只会计算重叠的小时数。

字段
overtime_multiplier

double

用于计算加班每小时比率的乘数(必须大于或等于 1.0)。每小时加班比率通常计算方式为 base_hourly_rate * overtime_multiplier。如果通过 hourly_rate_shift_differentials 给出了多个速率,求解器会使用一段时间内适用的速率的简单平均值来估算该时间内的每小时速率。注意:不同地方的法规对加班薪酬的计算方式可能有所不同。求解器可以估算加班薪酬,以最大限度降低总费用或达到预算要求,但它并不是用于计算工资的工具。

start_date_time

DateTime

加时赛的开始时间。如果这次班次与此次班次重叠,则此次班次调整时间将从 start_date_time开始计算。

end_date_time

DateTime

加时赛的结束时间。如果这次班次与此次班次重叠,则此次班次班次最多会计入 end_date_time 次。

maximum_regular_hours

double

按常规(非加班)费率支付的工作时间上限。此数量必须为正数。

优先级

对员工日程表或保险范围要求的任何限制条件的优先级。包括 SchedulingConstraintResourceConstraintShiftRequestCoverageRequirement。由于可能存在相互冲突的约束条件,因此并不总是能满足所有约束条件。因此,每种约束条件类型都有一个优先级(由用户指定或默认),告知求解器给定完整时间表的所有约束的相对重要性。

枚举
PRIORITY_UNSPECIFIED 未知优先级。
PRIORITY_LOW 最低优先级。具有此优先级的限制条件比其他限制条件重要。如果找不到可行的解决方案,该团队会第一个被视为违规。
PRIORITY_MEDIUM 优先级为“中”。具有此优先级的约束条件比优先级为 PRIORITY_LOW 的约束条件更重要,但优先级为 PRIORITY_HIGH 的约束条件不太重要。如果在优先级为 PRIORITY_LOW 放宽所有约束条件后找不到可行的解决方案,则优先级为 PRIORITY_MEDIUM 的约束条件接下来会认为违规。
PRIORITY_HIGH 最高优先级。具有此优先级的限制是最重要的限制。如果在放宽优先级较低的限制条件后仍无法找到可行的解决方案,则此类审核将是最后一项违规内容。
PRIORITY_MANDATORY 表示求解器不能违反的优先级的优先级。如果求解器返回 SolutionStatus.INFEASIBLE,可能是因为 PRIORITY_MANDATORY 约束条件过多。

ResourceConstraint

一种一般限制条件,用于限制员工所使用的特定“资源”的数量。这是更具体的 SchedulingConstraint 的抽象版本,对用户来说更灵活。许多无法在 SchedulingConstraint.type 中指定的时间安排限制条件都可以使用此消息指定。

字段
priority

Priority

此资源限制条件的优先级。所有资源限制条件的默认优先级均为 PRIORITY_MEDIUM

resource_usages

map<string, double>

轮班使用的资源量。例如,如果此限制条件适用于员工在特定一周内的最短和最长工作时数,则此映射将包含当周轮班和每次班次的时长(以小时为单位)。

minimum_resource_usage

double

要满足资源限制条件的最低资源用量。

maximum_resource_usage

double

要满足资源限制条件的最大资源用量。

SchedulingConstraint

特定员工的特定日程安排限制条件。指定的约束条件仅在给定间隔 [start_date_time, end_date_time) 内应用。

字段
priority

Priority

此时间安排限制条件的优先级。所有时间安排限制条件的默认优先级均为 PRIORITY_MEDIUM

start_date_time

DateTime

应用此时间安排限制条件的开始时间(含此时间)。

end_date_time

DateTime

应用此投放时间限制条件的结束时间(不含)。

联合字段 type。指定的限制条件的类型。每个限制条件仅在上述指定的时间范围内应用。type 只能是下列其中一项:
minimum_minutes

int32

员工可以工作的最少分钟数。如果分配给员工的轮班与(完全或部分)时间窗口重叠,则这次轮班与时间窗口重叠的分钟数将包含在计数中。

maximum_minutes

int32

员工可以在时间范围内工作的分钟数上限。如果分配给员工的轮班与(完全或部分)时间窗口重叠,则这次轮班与时间窗口重叠的分钟数将包含在计数中。

minimum_consecutive_work_days

int32

员工可以连续工作的最短天数。如果员工分配到的班次是在某天开始的,则该员工会在特定日期工作。员工分配到的任何班次在这段时间内开始,都计入此次数中。

maximum_consecutive_work_days

int32

员工可以连续工作的最长天数。如果员工分配到的班次是在某天开始的,则该员工会在特定日期工作。员工分配到的任何班次在这段时间内开始,都计入此次数中。

minimum_shift_count

int32

员工可以工作的最小排班次数。员工分配到的任何班次与时间窗口完全重叠,都计入此次数中。

maximum_shift_count

int32

员工可以工作的轮班次数上限。员工分配到的任何班次与时间窗口完全重叠,都计入此次数中。

minimum_rest_minutes

int32

一轮班结束后,员工在被分配到另一轮班次之前必须休息的最短分钟数。此约束条件适用于 [start_date_timeend_date_time] 中完全包含的每一对偏移。

Shift

轮班指定了员工可以工作的固定时间范围。

字段
id

string

为此班次分配的唯一 ID。

location_id

string

进行此班次调整的地理位置 ID。此字段可以为空。

start_date_time

DateTime

班次的开始时间(含此时间)。

end_date_time

DateTime

轮班的结束时间(不含班次)。目前,该求解器仅支持时长少于 24 小时的偏移。

break_rules[]

BreakRule

在轮班期间出现的换行规则列表。执行这种轮班的员工会按照break_rule安排一次休息时间,在此期间,员工无法满足其履行的角色的需求。每个 BreakRule 的时间范围必须完全包含在此偏移的时间范围内。

ShiftAssignment

一名员工负责转换角色。

字段
employee_id

string

要分配的员工 ID。

shift_id

string

分配给员工的轮班 ID。

role_id

string

分配给员工的角色 ID。

breaks[]

Break

此轮班分配任务的插播时间点列表。

ShiftGenerationSolutionStatus

求解器响应中提供的解状态。

枚举
SHIFT_GENERATION_SOLUTION_STATUS_UNSPECIFIED 未指定的响应状态。
SHIFT_GENERATION_SOLVED 求解器在规定的时间内找到了解决方案。
SHIFT_GENERATION_NOT_SOLVED 某个问题导致求解器无法产生位移。
SHIFT_GENERATION_NOT_SOLVED_DEADLINE_EXCEEDED 无法在指定时间内按需求调整预算。

ShiftPreference

特定轮班 ID 的数字偏好设置。

字段
shift_id

string

为其指定偏好设置的 Shift ID。

preference

int32

偏好值越大,表示效果的转变越可取。

ShiftRequest

员工提出的分配或不分配到特定班次的请求。

字段
priority

Priority

此时间安排请求的优先级。所有时间安排请求的默认优先级均为 PRIORITY_LOW

shift_ids[]

string

时间安排请求的轮班 ID。

type

WorkStatus

请求类型,例如是否将该请求分配给该轮班。

ShiftTemplate

指定生成偏移的规则的模板。轮班是指定开始时间和结束时间的工作单元,可能会包含活动(如午餐、休息等)。系统会在回复中的特定日期分配偏移。

字段
id

string

此模板的唯一 ID。

earliest_start_time

TimeOfDay

一天中开始轮班的最早时间。此值使用小时和分钟指定;系统会忽略秒和纳米。

latest_start_time

TimeOfDay

一天中可以开始调整的最晚时间。此值使用小时和分钟指定;系统会忽略秒和纳米。如果此值小于 earliest_start_time,则此模板生成的偏移可能会在午夜之前或之后开始。

duration_minutes

int32

此模板生成的偏移的固定时长。

start_time_increment_minutes

int32

用于生成一组可能的开始时间(介于 earliest_start_timelatest_start_time 之间)的时间增量(以分钟为单位)。例如,如果最早的开始时间是 8:00,最晚的开始时间是 8:30,开始时间增量是 10 分钟,那么此轮班模板的所有可能开始时间为:8:00、8:10、8:20 和 8:30。

days_off_count_per_week

int32

每周固定的休息天数。如果员工没有分配到从当天开始的轮班,则该员工可以休息。一周为 7 天,从星期日开始。

event_templates[]

EventTemplate

用于为每个班次生成事件的规则。对于指定的每个事件,每个班次将只包含一个事件。

minimum_interevent_gap_minutes

int32

一项活动结束和下一项活动开始之间的最短分钟数。

maximum_employee_count

int32

此模板生成的所有班次可分配的员工数量上限。

SolutionStatus

求解器响应中提供的解(即时间表)状态。

枚举
SOLUTION_STATUS_UNSPECIFIED 未指定的响应状态。
FEASIBLE 返回的时间表可行,但可能不是最佳选择。
OPTIMAL 返回的时间表是最佳的。
INFEASIBLE 对于给定的约束条件,不存在可行的时间表。如果无法满足优先级为 PRIORITY_MANDATORY 的限制条件的任何子集,求解器可能会返回此值。
NOT_SOLVED 未找到任何时间表。
NOT_SOLVED_DEADLINE_EXCEEDED 在指定时间限制内找不到时间表。

SolveParameters

用于控制轮班调度问题单次求解的参数。

字段
time_limit

Duration

求解器在问题上花费的时间上限。如果未设置,则默认为 1 分钟。

这个值不是硬性限制,也没有考虑通信开销。解决该问题的预期延迟时间可能会略微超过此值。

SolverConfig

指定用于解决“Shift Generation”问题的其他参数。

字段
time_limit

Duration

求解器在问题上花费的时间上限。如果未设置,则默认为 1 分钟。时间限制的选择应取决于问题的规模。举个例子,当使用 2 个 ShiftTemplates 处理一个 7 天的实例时,每个实例都有大约 20 个可能的开始时间,并举办 2 个活动,开始时间约为 30 天,每周休息两天。建议值为:<10 秒(适用于快速解决方案,可能不太理想),10 秒、300 秒)(适用于优质解决方案)和 300 秒以上(适用于执行详尽搜索)。较大的实例可能需要更长的时间限制。

这个值不是硬性限制,也没有考虑通信开销。解决该问题的预期延迟时间可能会略微超过此值。

multi_day_schedule

bool

如果为 true,求解器会生成包含多项偏移的 EmployeeSchedule(例如,生成为期一周的时间表)。否则,每个 EmployeeSchedule 都只包含一个偏移。多日时间表会假定轮班的开始时间在各天相同,并且此类时间表中的休假天数由轮班模板决定。默认值为 false。

shift_events_can_change

bool

如果为 true,多日 EmployeeSchedule 可能会包含轮班,即其活动的开始时间和结束时间在每一天都有所差异。否则,特定 EmployeeSchedule 的所有班次都必须具有相同的事件开始时间和结束时间。无论是哪种情况,多日时间表中的所有班次都会具有相同的开始和结束时间。因此,如果 multi_day_schedule 为 false,此参数会被忽略。将此参数设置为 true 可能会导致求解时间变长。默认值为 false。

WorkStatus

员工是否在工作。

枚举
WORK_STATUS_UNSPECIFIED 工作状态未知。
STATUS_WORK 代表在职员工的状态。
STATUS_NOT_WORK 代表非职员工的状态。