Package google.research.optimization.v1

索引

优化

一个 One Platform API,提供了一组用于解决高级运营研究问题的优化求解器。MOE:begin_strip

DesignShippingNetwork

rpc DesignShippingNetwork(DesignShippingNetworkRequest) returns (DesignShippingNetworkResponse)

解决给定 DesignShippingNetworkRequest 的客运网络设计和调度问题 (LSNDSP)。

LSNDSP 是一个复杂的优化问题,旨在为客运网络找到最佳的设计和调度。目的是尽可能降低运营网络的总费用,同时尽可能多地满足港口之间的货运需求。

LSNDSP 可分为两个主要子问题:网络设计和调度。网络设计子问题决定了网络要处理的端口集、要在每条路线上部署的船只数量,以及船将经过的航线。时间安排子问题决定了船舶的航行时间表,并考虑了在港口之间航行所需的时间、装卸货物所需的时间以及港口之间的货物运输需求。

简而言之,LSNDSP 就是决定要提供服务的港口、使用多少艘船以及如何安排船舶安排,以便在最大程度地满足货物需求的同时,将运营网络的成本降至最低。LSNDSP 的一项具有挑战性的子组件是货运路线,它决定了要满足哪些需求以及将哪些航线分配给货物,从而最大限度地提高收入。

SolveMathOptModel

rpc SolveMathOptModel(SolveMathOptModelRequest) returns (SolveMathOptModelResponse)

求解输入模型并一次性返回结果。当您不需要回调、增量并且不需要跟踪求解进度时,请使用此方法。

SolveShiftGeneration

rpc SolveShiftGeneration(SolveShiftGenerationRequest) returns (SolveShiftGenerationResponse)

通过根据给定的班次模板生成班次,以满足员工需求,从而解决给定 SolveShiftGenerationRequest 中的班次生成问题。

SolveShiftScheduling

rpc SolveShiftScheduling(SolveShiftSchedulingRequest) returns (SolveShiftSchedulingResponse)

通过将员工分配至轮班,使员工的时间安排偏好最大化,并最大限度地减少违反排班限制的情况,解决给定 SolveShiftSchedulingRequest 中的固定排班安排问题。

DesignShippingNetworkRequest

请求包含 LSNDSP 的实例,并且必须包含要满足的一组端口、一组路段、一组船舶类别和一组商品需求。

字段
request_id

string

问题或请求 ID。

solver_parameters

SolverParameters

求解器的参数。

ports[]

Port

将在船只服务中调用的可能端口的列表。请求必须只包含此列表中的端口 ID。

leg_candidates[]

LegCandidate

将添加到船舶服务的潜在候选路段列表。请求必须仅包含此列表中的路程候选 ID。

vessel_classes[]

VesselClass

提供船舶服务的船只类别列表。请注意,同一类别的所有容器完全可以互换。请求必须仅包含此列表中的船只类别 ID。

commodity_demands[]

CommodityDemand

需要由船只服务履行的潜在商品(即集装箱)需求清单。

vessel_services[]

VesselService

可以提供有效的船舶服务网络(通常是网络的当前状态)作为优化的起点。

DesignShippingNetworkResponse

响应会将解决方案保存在请求中传递的 LSNDSP 实例中。它包含有效的船舶服务和商品需求路径网络。通过每个航段的总商品需求量不能超过服务该航段的船舶类别容量。请注意,不提供没有得到满足的船舶服务,始终是解决班轮航运网络的设计和时间安排问题的可行解决方案。

字段
request_id

string

与此响应关联的请求的 ID。

vessel_services[]

VesselService

船舶服务网络。对于每个类别,所使用的船只总数不得超过此类别的可用船只数量。

commodity_demand_paths[]

CommodityDemandPath

商品需求正通过的所有商品需求路径的列表。请注意,如果未发货,某些商品需求 ID 可能不会包含在内。或者,也可以部分满足商品需求。对于每项商品需求,履单总量不能超过总需求。最后,commodity_demand_paths 依赖于 vessel_services(请参阅 CommodityDemandPath 定义)。

SolveMathOptModelRequest

在 MathOpt 中请求一元远程求解。

字段
solver_type

SolverTypeProto

可选。用于以数字方式求解问题的求解器类型。请注意,如果求解器不支持模型中的特定特征,则优化过程将失败。

model

ModelProto

必需。表示要解决的优化问题的数学表示形式。

parameters

SolveParametersProto

可选。用于控制单次求解的参数。系统会专门处理 enable_output 参数。对于支持消息回调的求解器,将其设置为 true 会使服务器注册消息回调。生成的消息将在 SolveMathOptModelResponse.messages 中返回。对于其他求解器,将 enable_output 设置为 true 将导致错误。

model_parameters

ModelSolveParametersProto

可选。用于控制输入模型特有的单个求解的参数(如需了解与模型无关的参数,请参阅 SolveParametersProto)。

SolveMathOptModelResponse

MathOpt 中一元远程求解的响应。

字段
result

SolveResultProto

请求中求解模型的输出说明。

messages[]

string

如果使用了 SolveParametersProto.enable_output,则会包含支持消息回调的求解器的日志消息。

SolveShiftGenerationRequest

请求解决 Shift 类型的问题。每个 ShiftTemplate 中都概述了有关生成偏移的规则。单个 ShiftTemplate 可在响应中生成多个偏移。求解器生成和选择的偏移必须符合 ShiftTemplate 中概述的规则,并涵盖指定的员工需求。

字段
solver_config

SolverConfig

可选。求解器的参数。

shift_templates[]

ShiftTemplate

必需。一组班次模板,用于指定班次生成规则。

employee_demands[]

EmployeeDemand

必需。shift_templates产生的轮班需要覆盖的员工总需求。每个 EmployeeDemand 中指定的 DateTime 间隔必须是不相交的,并且不能相邻。

SolveShiftGenerationResponse

对 Shift 键生成问题的响应。如果返回的 solution_statusSOLVED,则 employee_schedules 中会返回由求解器生成的一组有效偏移。为了实现有效的轮班安排,您需要具备以下属性:

  1. employee_schedules 中生成的每次偏移都遵循相应 ShiftTemplate 中指定的规则。
  2. 每次调整中选择的每个事件都遵守相应 ShiftTemplate.Event 中指定的规则。
  3. 根据同一个 ShiftTemplate 生成一组轮班的员工总数不超过该模板的 maximum_employee_count
  4. 所分配的员工组会按一定的时间间隔满足客户的需求。

字段
solution_status

ShiftGenerationSolutionStatus

所返回解决方案的状态。如果 solution_status 不是 SOLVEDemployee_schedules 将为空。

employee_schedules[]

EmployeeSchedule

求解器生成的一组班次,以及分配给每个时间表的员工数。

SolveShiftSchedulingRequest

对 Worker Scheduling API 的请求。要求至少指定一组员工、一组轮班、一组员工可以担任的可能角色以及一组投保要求。覆盖率要求规定了一段时间内履行每个角色所需的员工人数。分配到某个班次的员工也只能分配到该班次的一个(且仅一个)角色,并且不能为员工分配两个重叠的班次。如需详细了解哪些因素使轮班分配有效,请参阅下面的 SolveShiftSchedulingResponse

可以为每个员工指定其他调度限制,以进一步约束问题。所有时间安排限制和覆盖范围要求都被赋予了优先级(MANDATORY、HIGH、MEDIUM、LOW)。优先级为 PRIORITY_MANDATORY 的所有约束条件都必须由求解器满足。求解器可能会违反具有任何其他优先级的约束条件,但会按优先级顺序最大限度地减少这些违规情况。如需详细了解如何处理每个限制条件的优先级,请参阅 Priority 枚举。

该求解器会尝试在给定的约束条件下最大限度提高每位员工的 ShiftPreference.preference 值。求解器不会为了满足更多偏好而违反约束条件;只有在给定约束条件下调度分配不可行时,求解器才会违反约束条件。

关于时间的注意事项:问题中的所有时间均使用 DateTime 消息指定。此消息包含一个“时区”字段。除非用户另行指定,否则系统会假定时区为 UTC。DateTime 消息只能精确到分钟;所有秒数和 nanos 都会被忽略。

字段
request_id

string

问题或请求 ID。

solve_parameters

SolveParameters

用于控制单次求解的参数。

employees[]

Employee

对所有有空的员工进行安排。

shifts[]

Shift

构成时间表的所有班次。

coverage_requirements[]

CoverageRequirement

整个规划范围的覆盖率要求。这些工作规定了在某个时间段或一系列轮班 ID 中,必须履行每项角色或具备某项技能的员工人数。必须通过时间范围或轮班 ID 列表指定所有覆盖范围要求(但不能同时指定两者)。覆盖率要求的时间范围(如果指定)不能与每个指定位置重叠。对于角色要求,这些限制条件的默认优先级为 PRIORITY_MANDATORY;对于技能要求,则默认优先级为 PRIORITY_LOW。如需了解详情,请参阅 Priority 枚举。

role_ids[]

string

员工团队所有可能的角色的列表。每位员工都必须至少有一个可以分配给轮班的角色。角色是指轮班期间的特定工作分配(例如注册护士、行政厨师、服务员等)。当员工分配到轮班时,系统也会为他们分配一种特定的角色。

skill_ids[]

string

列出了所有员工可能具备的技能。技能是指员工可能获得的、与具体可分配工作无关的任何额外资格(例如,认证、所讲的语言等)。此列表可以为空。员工被分配到某个轮班后,该员工必须完成该轮班所需的所有技能。

location_ids[]

string

时间表中相应班次的所有可能位置的列表。此列表可以为空。例如,当护士经理想要在一家医院的不同部门之间安排许多护士时,或者,酒店经理想要安排在多个酒店的员工时,可以指定不同的地理位置。

budget_requirements[]

BudgetRequirement

针对时间安排问题的预算规范。每项要求的默认优先级为 PRIORITY_LOW。如需了解详情,请参阅 Priority 枚举。

assignments_hint[]

ShiftAssignment

转换分配,用作调度问题的暂定解决方案(也称为解决方案提示)。如果分配与不可分配的班次或时间安排请求冲突,系统会忽略分配提示。

SolveShiftSchedulingResponse

对员工调度 API 的响应。对于每个响应,如果返回的 solution_statusNOT_SOLVED_DEADLINE_EXCEEDEDINFEASIBLE,则 shift_assignments 将为空。如果返回的 solution_statusOPTIMALFEASIBLE,则 shift_assignments 中会返回有效的移位赋值。对于有效的 shift 分配,必须具备以下属性:

  1. 每个员工 ID 都包含在请求中提供的员工集中。
  2. 分配给该员工的每个角色 ID 都包含在相应员工的角色 ID 集中。
  3. 每个班次 ID 都包含在请求中提供的一组班次中。
  4. 每个轮班 ID 都不是指定员工的不可分配的轮班 ID 之一。
  5. 员工绝不会有两轮重叠的轮班。
  6. 对于给定的时间表,没有违反任何优先级为 PRIORITY_MANDATORY 的限制条件或请求。

字段
request_id

string

与此响应关联的请求的 ID。

solution_status

SolutionStatus

所返回解决方案的状态。如果解决方案不可行或不可优化,此 proto 中的其他字段可能为空。如果状态为 NOT_SOLVED_DEADLINE_EXCEEDED,则表示已达到时间限制,而没有找到可行的解决方案或确定是否存在可行的解决方案。如果优先级“MANDATORY”的限制无法全部满足,请求可能会不可行。

shift_assignments[]

ShiftAssignment

所有分配的列表。每个 ShiftAssignment 均指定一名员工、他们分配到的班次以及为该次班分配的角色。

status_message

string

如果 solution_status 不是最佳值,则此字段可能包含有关求解器的更多信息。