索引
优化
一个 One Platform API,提供了一组用于解决高级运营研究问题的优化求解器。MOE:begin_strip
DesignShippingNetwork |
---|
解决给定 LSNDSP 是一个复杂的优化问题,旨在为客运网络找到最佳的设计和调度。目的是尽可能降低运营网络的总费用,同时尽可能多地满足港口之间的货运需求。 LSNDSP 可分为两个主要子问题:网络设计和调度。网络设计子问题决定了网络要处理的端口集、要在每条路线上部署的船只数量,以及船将经过的航线。时间安排子问题决定了船舶的航行时间表,并考虑了在港口之间航行所需的时间、装卸货物所需的时间以及港口之间的货物运输需求。 简而言之,LSNDSP 就是决定要提供服务的港口、使用多少艘船以及如何安排船舶安排,以便在最大程度地满足货物需求的同时,将运营网络的成本降至最低。LSNDSP 的一项具有挑战性的子组件是货运路线,它决定了要满足哪些需求以及将哪些航线分配给货物,从而最大限度地提高收入。 |
SolveMathOptModel |
---|
求解输入模型并一次性返回结果。当您不需要回调、增量并且不需要跟踪求解进度时,请使用此方法。 |
SolveShiftGeneration |
---|
通过根据给定的班次模板生成班次,以满足员工需求,从而解决给定 |
SolveShiftScheduling |
---|
通过将员工分配至轮班,使员工的时间安排偏好最大化,并最大限度地减少违反排班限制的情况,解决给定 |
DesignShippingNetworkRequest
请求包含 LSNDSP 的实例,并且必须包含要满足的一组端口、一组路段、一组船舶类别和一组商品需求。
字段 | |
---|---|
request_id |
问题或请求 ID。 |
solver_parameters |
求解器的参数。 |
ports[] |
将在船只服务中调用的可能端口的列表。请求必须只包含此列表中的端口 ID。 |
leg_candidates[] |
将添加到船舶服务的潜在候选路段列表。请求必须仅包含此列表中的路程候选 ID。 |
vessel_classes[] |
提供船舶服务的船只类别列表。请注意,同一类别的所有容器完全可以互换。请求必须仅包含此列表中的船只类别 ID。 |
commodity_demands[] |
需要由船只服务履行的潜在商品(即集装箱)需求清单。 |
vessel_services[] |
可以提供有效的船舶服务网络(通常是网络的当前状态)作为优化的起点。 |
DesignShippingNetworkResponse
响应会将解决方案保存在请求中传递的 LSNDSP 实例中。它包含有效的船舶服务和商品需求路径网络。通过每个航段的总商品需求量不能超过服务该航段的船舶类别容量。请注意,不提供没有得到满足的船舶服务,始终是解决班轮航运网络的设计和时间安排问题的可行解决方案。
字段 | |
---|---|
request_id |
与此响应关联的请求的 ID。 |
vessel_services[] |
船舶服务网络。对于每个类别,所使用的船只总数不得超过此类别的可用船只数量。 |
commodity_demand_paths[] |
商品需求正通过的所有商品需求路径的列表。请注意,如果未发货,某些商品需求 ID 可能不会包含在内。或者,也可以部分满足商品需求。对于每项商品需求,履单总量不能超过总需求。最后,commodity_demand_paths 依赖于 vessel_services(请参阅 CommodityDemandPath 定义)。 |
SolveMathOptModelRequest
在 MathOpt 中请求一元远程求解。
字段 | |
---|---|
solver_type |
可选。用于以数字方式求解问题的求解器类型。请注意,如果求解器不支持模型中的特定特征,则优化过程将失败。 |
model |
必需。表示要解决的优化问题的数学表示形式。 |
parameters |
可选。用于控制单次求解的参数。系统会专门处理 enable_output 参数。对于支持消息回调的求解器,将其设置为 true 会使服务器注册消息回调。生成的消息将在 SolveMathOptModelResponse.messages 中返回。对于其他求解器,将 enable_output 设置为 true 将导致错误。 |
model_parameters |
可选。用于控制输入模型特有的单个求解的参数(如需了解与模型无关的参数,请参阅 SolveParametersProto)。 |
SolveMathOptModelResponse
MathOpt 中一元远程求解的响应。
字段 | |
---|---|
result |
请求中求解模型的输出说明。 |
messages[] |
如果使用了 SolveParametersProto.enable_output,则会包含支持消息回调的求解器的日志消息。 |
SolveShiftGenerationRequest
请求解决 Shift 类型的问题。每个 ShiftTemplate 中都概述了有关生成偏移的规则。单个 ShiftTemplate 可在响应中生成多个偏移。求解器生成和选择的偏移必须符合 ShiftTemplate 中概述的规则,并涵盖指定的员工需求。
字段 | |
---|---|
solver_config |
可选。求解器的参数。 |
shift_templates[] |
必需。一组班次模板,用于指定班次生成规则。 |
employee_demands[] |
必需。 |
SolveShiftGenerationResponse
对 Shift 键生成问题的响应。如果返回的 solution_status
为 SOLVED
,则 employee_schedules
中会返回由求解器生成的一组有效偏移。为了实现有效的轮班安排,您需要具备以下属性:
- 在
employee_schedules
中生成的每次偏移都遵循相应ShiftTemplate
中指定的规则。 - 每次调整中选择的每个事件都遵守相应
ShiftTemplate.Event
中指定的规则。 - 根据同一个 ShiftTemplate 生成一组轮班的员工总数不超过该模板的
maximum_employee_count
。 - 所分配的员工组会按一定的时间间隔满足客户的需求。
字段 | |
---|---|
solution_status |
所返回解决方案的状态。如果 |
employee_schedules[] |
求解器生成的一组班次,以及分配给每个时间表的员工数。 |
SolveShiftSchedulingRequest
对 Worker Scheduling API 的请求。要求至少指定一组员工、一组轮班、一组员工可以担任的可能角色以及一组投保要求。覆盖率要求规定了一段时间内履行每个角色所需的员工人数。分配到某个班次的员工也只能分配到该班次的一个(且仅一个)角色,并且不能为员工分配两个重叠的班次。如需详细了解哪些因素使轮班分配有效,请参阅下面的 SolveShiftSchedulingResponse
。
可以为每个员工指定其他调度限制,以进一步约束问题。所有时间安排限制和覆盖范围要求都被赋予了优先级(MANDATORY、HIGH、MEDIUM、LOW)。优先级为 PRIORITY_MANDATORY
的所有约束条件都必须由求解器满足。求解器可能会违反具有任何其他优先级的约束条件,但会按优先级顺序最大限度地减少这些违规情况。如需详细了解如何处理每个限制条件的优先级,请参阅 Priority
枚举。
该求解器会尝试在给定的约束条件下最大限度提高每位员工的 ShiftPreference.preference
值。求解器不会为了满足更多偏好而违反约束条件;只有在给定约束条件下调度分配不可行时,求解器才会违反约束条件。
关于时间的注意事项:问题中的所有时间均使用 DateTime 消息指定。此消息包含一个“时区”字段。除非用户另行指定,否则系统会假定时区为 UTC。DateTime 消息只能精确到分钟;所有秒数和 nanos 都会被忽略。
字段 | |
---|---|
request_id |
问题或请求 ID。 |
solve_parameters |
用于控制单次求解的参数。 |
employees[] |
对所有有空的员工进行安排。 |
shifts[] |
构成时间表的所有班次。 |
coverage_requirements[] |
整个规划范围的覆盖率要求。这些工作规定了在某个时间段或一系列轮班 ID 中,必须履行每项角色或具备某项技能的员工人数。必须通过时间范围或轮班 ID 列表指定所有覆盖范围要求(但不能同时指定两者)。覆盖率要求的时间范围(如果指定)不能与每个指定位置重叠。对于角色要求,这些限制条件的默认优先级为 |
role_ids[] |
员工团队所有可能的角色的列表。每位员工都必须至少有一个可以分配给轮班的角色。角色是指轮班期间的特定工作分配(例如注册护士、行政厨师、服务员等)。当员工分配到轮班时,系统也会为他们分配一种特定的角色。 |
skill_ids[] |
列出了所有员工可能具备的技能。技能是指员工可能获得的、与具体可分配工作无关的任何额外资格(例如,认证、所讲的语言等)。此列表可以为空。员工被分配到某个轮班后,该员工必须完成该轮班所需的所有技能。 |
location_ids[] |
时间表中相应班次的所有可能位置的列表。此列表可以为空。例如,当护士经理想要在一家医院的不同部门之间安排许多护士时,或者,酒店经理想要安排在多个酒店的员工时,可以指定不同的地理位置。 |
budget_requirements[] |
针对时间安排问题的预算规范。每项要求的默认优先级为 |
assignments_hint[] |
转换分配,用作调度问题的暂定解决方案(也称为解决方案提示)。如果分配与不可分配的班次或时间安排请求冲突,系统会忽略分配提示。 |
SolveShiftSchedulingResponse
对员工调度 API 的响应。对于每个响应,如果返回的 solution_status
为 NOT_SOLVED_DEADLINE_EXCEEDED
或 INFEASIBLE
,则 shift_assignments
将为空。如果返回的 solution_status
为 OPTIMAL
或 FEASIBLE
,则 shift_assignments
中会返回有效的移位赋值。对于有效的 shift 分配,必须具备以下属性:
- 每个员工 ID 都包含在请求中提供的员工集中。
- 分配给该员工的每个角色 ID 都包含在相应员工的角色 ID 集中。
- 每个班次 ID 都包含在请求中提供的一组班次中。
- 每个轮班 ID 都不是指定员工的不可分配的轮班 ID 之一。
- 员工绝不会有两轮重叠的轮班。
- 对于给定的时间表,没有违反任何优先级为
PRIORITY_MANDATORY
的限制条件或请求。
字段 | |
---|---|
request_id |
与此响应关联的请求的 ID。 |
solution_status |
所返回解决方案的状态。如果解决方案不可行或不可优化,此 proto 中的其他字段可能为空。如果状态为 NOT_SOLVED_DEADLINE_EXCEEDED,则表示已达到时间限制,而没有找到可行的解决方案或确定是否存在可行的解决方案。如果优先级“MANDATORY”的限制无法全部满足,请求可能会不可行。 |
shift_assignments[] |
所有分配的列表。每个 |
status_message |
如果 |