索引
优化
一个 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[] |
求解器生成的一组班次,以及分配给每个时间表的员工人数。 |
demand_coverage_violations[] |
基于指定 |
SolveShiftSchedulingRequest
请求员工时间安排 API。该请求至少要指定一组员工、一组轮班、员工可以担任的一组可能的角色以及一组保修要求。保修范围要求指定了一段时间内履行各个角色所需的员工人数。已分配到轮班的员工也会被分配到该轮班的一个(且仅有一个)角色,不能将员工分配到两个重叠的轮班。请参阅以下 SolveShiftSchedulingResponse
,详细了解让班次分配有效的原因。
可以为每个员工指定其他计划约束,以进一步限制问题。所有调度限制和覆盖范围要求都具有优先级(强制性、高、中、低)。求解器必须满足优先级为 PRIORITY_MANDATORY
的所有约束条件。求解器可能会违反具有任何其他优先级的约束条件,但系统会按照优先级顺序尽量减少这些违规行为。如需详细了解如何处理每个限制条件的优先级,请参阅 Priority
枚举。
求解器会尝试在给定约束条件下使每个员工的 ShiftPreference.preference
值最大化。求解器不会为了满足更多偏好而违反约束条件;只有在给定约束条件下调度分配不可行时,才会违反约束条件。
关于时间的说明:问题中的所有时间都使用 DateTime 消息指定。此消息包含“时区”字段。除非用户另行指定,否则时区假定为 UTC。DateTime 消息只能精确到分钟;所有秒和纳秒都将被忽略。
字段 | |
---|---|
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
中返回有效的偏移分配。对于有效的轮班分配,应具备以下属性:
- 每个员工 ID 都包含在请求中指定的员工集中。
- 分配给员工的每个角色 ID 都包含在给定员工的角色 ID 集中。
- 每个班次 ID 都包含在请求中指定的班次集合中。
- 对于指定员工,每个班次 ID 都不是其中一个不可分配的班次 ID。
- 某位员工绝不会分配到两个重叠的班次。
- 对于指定的时间表,优先级为
PRIORITY_MANDATORY
的所有限制条件或请求均未违反。
字段 | |
---|---|
request_id |
与此响应关联的请求的 ID。 |
solution_status |
所返回解决方案的状态。如果解决方案不可行或不可优化,则此 proto 中的其他字段可能为空。如果状态为 NOT_SOLVED_DEADLINE_EXCEEDED,则表示在未找到可行解决方案或无法确定是否存在可行解决方案的情况下,已达到时间限制。如果优先级 MANDATORY 的限制条件无法全部满足,则请求可能是不可行的。 |
shift_assignments[] |
所有分配的列表。每个 |
status_message |
如果 |