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]、[1:40]、

字段
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 列表,而不是时间范围和地点。只有可分配到特定角色(或拥有特定技能)的员工才能满足此要求。

就给定角色和/或技能而言,当时间范围内每时每刻的员工人数至少达到 target_employee_count 人(或 shift_ids的每班轮班时),即满足保险范围要求。与此相对,如果在时间范围内的任何时间(或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

DemandCoverageViolation

指定给定时间间隔内的需求覆盖率违规情况。在整个指定的时间间隔内,员工需求是相同的。

字段
start_date_time

DateTime

需求间隔的开始日期和时间(含)。此值精确到分钟。

end_date_time

DateTime

需求间隔的结束日期(不含)。此值精确到分钟。

coverage_violation

int32

指定时间间隔内的覆盖范围违规。正值表示需求被覆盖,负值表示需求被低估。

员工

要安排的员工中的员工。

字段
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

可在此处向 resource_constraints 添加未在 scheduling_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 小时或连续的 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 生成问题的其他参数。

字段
time_limit

Duration

求解器应该在解题上花费的时间上限。如果未设置,则默认为 1 分钟。时间限制的选择应取决于问题的规模。举个例子,在解决一个包含 2 个 ShiftTemplates 的 7 天实例时,每个实例都有大约 20 个可能的开始时间,每个事件都有大约 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 代表非在职员工的身份。