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产生的班次需要涵盖的员工需求总量。

SolveShiftGenerationResponse

对 Shift 生成问题的响应。如果返回的 solution_statusSOLVED,系统会在 employee_schedules 中返回求解器生成的一组有效偏移。对于有效的轮班时间表,应具备以下属性:

  1. employee_schedules 中生成的每个偏移都遵循相应 ShiftTemplate 中指定的规则。
  2. 每次班次中选择的每个事件都遵循相应 ShiftTemplate.Event 中指定的规则。
  3. 分配到从同一 ShiftTemplate 生成的一组轮班的员工总数不超过该模板的 maximum_employee_count
  4. 分配的员工组在每个给定时间间隔内满足需求。

字段
solution_status

ShiftGenerationSolutionStatus

所返回解决方案的状态。如果 solution_status 不为 SOLVED,则 employee_schedules 将为空。

employee_schedules[]

EmployeeSchedule

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

demand_coverage_violations[]

DemandCoverageViolation

基于指定employee_schedules中的指定employee_counts,需求覆盖率违规。请求中指定的 employee_demands 会进行汇总 - 如果两个 employee_demand 区间重叠,则需求的总和将与区间的重叠部分相加。

SolveShiftSchedulingRequest

请求员工时间安排 API。该请求至少要指定一组员工、一组轮班、员工可以担任的一组可能的角色以及一组保修要求。保修范围要求指定了一段时间内履行各个角色所需的员工人数。已分配到轮班的员工也会被分配到该轮班的一个(且仅有一个)角色,不能将员工分配到两个重叠的轮班。请参阅以下 SolveShiftSchedulingResponse,详细了解让班次分配有效的原因。

可以为每个员工指定其他计划约束,以进一步限制问题。所有调度限制和覆盖范围要求都具有优先级(强制性、高、中、低)。求解器必须满足优先级为 PRIORITY_MANDATORY 的所有约束条件。求解器可能会违反具有任何其他优先级的约束条件,但系统会按照优先级顺序尽量减少这些违规行为。如需详细了解如何处理每个限制条件的优先级,请参阅 Priority 枚举。

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

关于时间的说明:问题中的所有时间都使用 DateTime 消息指定。此消息包含“时区”字段。除非用户另行指定,否则时区假定为 UTC。DateTime 消息只能精确到分钟;所有秒和纳秒都将被忽略。

字段
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 中返回有效的偏移分配。对于有效的轮班分配,应具备以下属性:

  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 不是最佳值,则此字段可能包含有关求解器的其他信息。