解决给定 DesignShippingNetworkRequest
的客运网络设计和调度问题 (LSNDSP)。
LSNDSP 是一个复杂的优化问题,旨在为客运网络找到最佳的设计和调度。目的是尽可能降低运营网络的总费用,同时尽可能多地满足港口之间的货运需求。
LSNDSP 可分为两个主要子问题:网络设计和调度。网络设计子问题决定了网络要处理的端口集、要在每条路线上部署的船只数量,以及船将经过的航线。时间安排子问题决定了船舶的航行时间表,并考虑了在港口之间航行所需的时间、装卸货物所需的时间以及港口之间的货物运输需求。
简而言之,LSNDSP 就是决定要提供服务的港口、使用多少艘船以及如何安排船舶安排,以便在最大程度地满足货物需求的同时,将运营网络的成本降至最低。LSNDSP 的一项具有挑战性的子组件是货运路线,它决定了要满足哪些需求以及将哪些航线分配给货物,从而最大限度地提高收入。
HTTP 请求
POST https://optimization.googleapis.com/v1/shipping:designShippingNetwork
网址采用 gRPC 转码语法。
请求正文
请求正文中包含结构如下的数据:
JSON 表示法 |
---|
{ "requestId": string, "solverParameters": { object ( |
字段 | |
---|---|
requestId |
问题或请求 ID。 |
solverParameters |
求解器的参数。 |
ports[] |
将在船只服务中调用的可能端口的列表。请求必须只包含此列表中的端口 ID。 |
legCandidates[] |
将添加到船舶服务的潜在候选路段列表。请求必须仅包含此列表中的路程候选 ID。 |
vesselClasses[] |
提供船舶服务的船只类别列表。请注意,同一类别的所有容器完全可以互换。请求必须仅包含此列表中的船只类别 ID。 |
commodityDemands[] |
需要由船只服务履行的潜在商品(即集装箱)需求清单。 |
vesselServices[] |
可以提供有效的船舶服务网络(通常是网络的当前状态)作为优化的起点。 |
响应正文
响应会将解决方案保存在请求中传递的 LSNDSP 实例中。它包含有效的船舶服务和商品需求路径网络。通过每个航段的总商品需求量不能超过服务该航段的船舶类别容量。请注意,不提供没有得到满足的船舶服务,始终是解决班轮航运网络的设计和时间安排问题的可行解决方案。
如果成功,响应正文将包含结构如下的数据:
JSON 表示法 |
---|
{ "requestId": string, "vesselServices": [ { object ( |
字段 | |
---|---|
requestId |
与此响应关联的请求的 ID。 |
vesselServices[] |
船舶服务网络。对于每个类别,所使用的船只总数不得超过此类别的可用船只数量。 |
commodityDemandPaths[] |
商品需求正通过的所有商品需求路径的列表。请注意,如果未发货,某些商品需求 ID 可能不会包含在内。或者,也可以部分满足商品需求。对于每项商品需求,履单总量不能超过总需求。最后,commodityDemandPaths 依赖于 vesselServices(请参阅 CommodityDemandPath 定义)。 |
SolverParameters
用于控制 LSNDSP 的单次求解的参数。
JSON 表示法 |
---|
{ "timeLimit": string } |
字段 | |
---|---|
timeLimit |
求解器在问题上花费的时间上限。这个值不是硬性限制,也没有考虑通信开销。解决该问题的预期延迟时间可能会略微超过此值。 此时长以秒为单位,最多包含九个小数位,以“ |
端口
端口,例如一个终端或某个端口的所有终端。
JSON 表示法 |
---|
{ "id": string, "minimumPortStayDuration": { object ( |
字段 | |
---|---|
id |
为此充电桩分配的唯一 ID。 |
minimumPortStayDuration |
携号转网通话的最短停留时间。大多数研究都假定端口是固定不变的,因为端口通常会为移动次数较多的较大船舶分配更多起重机,因为这些船占据了更多空间。 |
minimumTransshipmentDuration |
在指定港口转运的最短持续时间,包括将集装箱卸载到其他船只上所需的持续时间。 |
transshipmentCost |
集装箱转运的费用。这通常低于装卸量的总和,因为转运不需要在港口报关。 |
vesselClassCosts |
调用按船只类别 ID 映射的此港口时产生的费用。船舶类只有在此映射中具有条目时才能调用此港口。 包含一系列 |
时长
时长(停留/转运、需求转运)是按小时定义的。
JSON 表示法 |
---|
{ "hours": string } |
字段 | |
---|---|
hours |
定义持续时间的小时数。 |
VesselCost
呼叫和在此停靠点的船只费用定义为住宿时长(fixedCost
+ hourlyCost
* 小时)的线性函数。
JSON 表示法 |
---|
{ "fixedCost": number, "hourlyCost": number } |
字段 | |
---|---|
fixedCost |
调用此端口的固定费用。 |
hourlyCost |
在此港口停留的每小时费用。 |
LegCandidate
船只服务航段候选。在相同的两个端口之间可以有多个候选路程,例如,代表不同的海洋航线和/或船速。
JSON 表示法 |
---|
{
"id": string,
"departurePortId": string,
"arrivalPortId": string,
"duration": {
object ( |
字段 | |
---|---|
id |
分配给此路段候选 ID 的唯一 ID。 |
departurePortId |
出发港的 ID。 |
arrivalPortId |
到达端口的 ID。 |
duration |
路程的时长。 |
vesselClassCosts |
将此候选路段分配给特定船舶类别的费用。这可能包括船舶运营费用、掩体费用、包船费用。仅当此航段候选中在此地图中有条目时,船只类别才能通过该航段航行。 包含一系列 |
VesselClass
船只类别,即具有相同属性的一组船舶。没有办法区分同一类别的两艘船。
JSON 表示法 |
---|
{ "id": string, "containerCapacity": string, "vesselCount": string } |
字段 | |
---|---|
id |
分配给此船舶类别的唯一 ID。 |
containerCapacity |
船类承载能力(以集装箱为单位)。 |
vesselCount |
此船类中的船只数量。 |
CommodityDemand
商品需求,即由发货人满足的潜在需求。
JSON 表示法 |
---|
{
"id": string,
"originPortId": string,
"destinationPortId": string,
"containerCount": string,
"freightRate": number,
"maximumTransitDuration": {
object ( |
字段 | |
---|---|
id |
为此商品需求分配的唯一 ID。 |
originPortId |
源端口的 ID。 |
destinationPortId |
目标端口的 ID。 |
containerCount |
要履单的容器数量上限。 |
freightRate |
每个集装箱的货运费率(可能包括对未履行的需求的处罚)。这样应该可以省去在出发地和目的地的每个集装箱的装卸费用。 |
maximumTransitDuration |
运送时间上限(如果设置,则应该极为正值)。运送时间是指从满足该需求的第一艘船离开发货港到最后一艘船抵达目的地港口的时间, |
VesselService
可满足商品需求的船舶服务。重要提示:当前假设服务按周频率运行,且端口停留时间不得超过一周。请考虑以下船只服务航段的顺序:vesselServiceLegs { legCandidateId: "0->1" originLeaveTime {} destinationArrivalTime { day: 3 hourOfDay: 12 } } vesselServiceLegs { legCandidateId: "Day1->0{/7} March of the 地理位置定位目标} “Day1->0"destinations of the 地理位置定位目标}
JSON 表示法 |
---|
{
"vesselClassId": string,
"vesselServiceLegs": [
{
object ( |
字段 | |
---|---|
vesselClassId |
提供服务的船类 ID。 |
vesselServiceLegs[] |
对于有效的船舶服务,以下属性适用:1. 此字段不能为空。2. 连续路程的 destinationPortId 和 originPortId 必须匹配(包括最后路程和第一个路程)。 |
VesselServiceLeg
船只服务的一段。
JSON 表示法 |
---|
{ "legCandidateId": string, "originDepartureTime": { object ( |
字段 | |
---|---|
legCandidateId |
已分配的路程候选 ID。 |
originDepartureTime |
每周时间表在始发港口的出发时间。 |
destinationArrivalTime |
每周时间表的抵达目的地港口时间。 |
ScheduleTime
排班时间(船只/需求出发/到达)是按每周特定时间的频率定义的。
JSON 表示法 |
---|
{ "day": string, "hourOfDay": integer } |
字段 | |
---|---|
day |
日程表。第 0 天是可能的第一天。 |
hourOfDay |
时间表时间中的时段应为 0 到 23(含 0 和 23)之间的整数。 |
CommodityDemandPath
一小部分给定商品需求采用的不同服务和端口。下面使用的索引基于响应中船只服务的顺序以及各个船只服务的顺序。
JSON 表示法 |
---|
{
"commodityDemandId": string,
"containerCount": string,
"vesselServiceLegIds": [
{
object ( |
字段 | |
---|---|
commodityDemandId |
已提供商品需求 ID。 |
containerCount |
通过此路径的容器数量。对于每项商品需求,履单总量不能超过总需求。 |
vesselServiceLegIds[] |
通过此路径获取的船舶服务航段 ID 的列表。对于有效的商品需求路径,您需要具备以下属性:1. 首段路程的 ExitPortId 必须与商品需求的 originPortId 一致。2. 最后一段的 destinationPortId 必须与商品需求的 destinationPortId 一致。3. 连续航段的 arrivalPortId 和 exitPortId 必须匹配。4. 如果为这种商品需求提供了运送时间,则最长运送时间应大于或等于路径的总时长。 |
VesselServiceLegId
商品需求路径中使用的单船服务航段。例如,假设有两项船舶服务。第一段由三段(索引为 0、1 和 2)组成,第二段由两段(索引为 0 和 1)组成。此外,第一趟服务的第一段抵达第二段航程的出发港口。商品路径由以下三条船只服务航段 ID 组成:{vesselServiceIndex: 0, vesselServiceLegIndex: 2} {vesselServiceIndex: 0, vesselServiceLegIndex: 0} {vesselServiceIndex: 1, vesselServiceLegIndex take 2} ,表示 vesselServiceIndex: 0, vesselServiceLegIndex: 2} {vesselServiceIndex: 1, vesselServiceLegIndex take 2} 表示
JSON 表示法 |
---|
{ "vesselServiceIndex": integer, "vesselServiceLegIndex": integer } |
字段 | |
---|---|
vesselServiceIndex |
船舶服务的索引。 |
vesselServiceLegIndex |
船运服务路程的索引(按 |