Method: shipping.designShippingNetwork

주어진 DesignShippingNetworkRequest에서 정기선 운송 네트워크 설계 및 일정 관리 문제 (LSNDSP)를 해결합니다.

LSNDSP는 항공사 운송 네트워크의 최적 설계 및 일정을 찾는 복잡한 최적화 문제입니다. 목표는 총 네트워크 운영 비용을 최소화하면서도 포트 간 화물 수요를 최대한 충족하는 것입니다.

LSNDSP는 네트워크 설계와 예약이라는 두 가지 주요 하위 문제로 나눌 수 있습니다. 네트워크 설계 하위 문제는 네트워크에서 처리할 포트 집합, 각 경로에 배치될 선박의 수, 선박이 이동하는 경로를 결정합니다. 일정 관리 하위 문제는 항구 사이를 항해하는 데 걸리는 시간, 화물 적재 및 하역에 걸리는 시간, 항구 간의 화물 수송 수요를 고려하여 선박의 항해 일정을 결정합니다.

간단히 말해 LSNDSP는 화물 수요를 충족하기 위한 수익을 극대화하면서 네트워크 운영 비용을 최소화하기 위해 서비스를 제공할 항구, 사용할 선박의 수, 선박 예약 방법을 결정하는 문제입니다. LSNDSP의 까다로운 하위 구성 요소는 화물 라우팅으로, 수익을 극대화하기 위해 화물에 어떤 수요를 충족해야 하고 어떤 경로를 화물에 할당할지를 결정합니다.

HTTP 요청

POST https://optimization.googleapis.com/v1/shipping:designShippingNetwork

URL은 gRPC 트랜스코딩 구문을 사용합니다.

요청 본문

요청 본문에는 다음과 같은 구조의 데이터가 포함됩니다.

JSON 표현
{
  "requestId": string,
  "solverParameters": {
    object (SolverParameters)
  },
  "ports": [
    {
      object (Port)
    }
  ],
  "legCandidates": [
    {
      object (LegCandidate)
    }
  ],
  "vesselClasses": [
    {
      object (VesselClass)
    }
  ],
  "commodityDemands": [
    {
      object (CommodityDemand)
    }
  ],
  "vesselServices": [
    {
      object (VesselService)
    }
  ]
}
입력란
requestId

string

문제 또는 요청 ID입니다.

solverParameters

object (SolverParameters)

문제 해결사의 매개변수입니다.

ports[]

object (Port)

선박 서비스에서 호출할 수 있는 포트 목록입니다. 요청에는 이 목록에 있는 포트 ID만 포함되어야 합니다.

legCandidates[]

object (LegCandidate)

선박 서비스에 추가될 잠재적 구간 후보 목록입니다. 요청에는 이 목록에 있는 구간 후보 ID만 포함되어야 합니다.

vesselClasses[]

object (VesselClass)

선박 서비스를 수행하는 선박 등급 목록입니다. 동일한 클래스의 모든 선박은 완전히 상호 교환 가능합니다. 요청에는 이 목록에 있는 선박 클래스 ID만 포함해야 합니다.

commodityDemands[]

object (CommodityDemand)

선박 서비스를 통해 이행되어야 하는 잠재적 상품 (예: 컨테이너) 수요의 목록입니다.

vesselServices[]

object (VesselService)

유효한 선박 서비스 네트워크 (일반적으로 네트워크의 현재 상태)를 제공하여 최적화를 위한 출발점으로 사용할 수 있습니다.

응답 본문

응답은 요청에서 전달된 LSNDSP 인스턴스에 대한 솔루션을 보유합니다. 유효한 선박 서비스 및 상품 수요 경로 네트워크가 포함됩니다. 각 구간을 거치는 총 상품 수요는 이 구간을 제공하는 선박 등급 용량을 초과할 수 없습니다. 수요가 충족되지 않는 선박 서비스가 없는 것이 항상 여객선 배송 네트워크 설계 및 일정 문제를 해결할 수 있습니다.

성공할 경우 응답 본문에 다음 구조의 데이터가 포함됩니다.

JSON 표현
{
  "requestId": string,
  "vesselServices": [
    {
      object (VesselService)
    }
  ],
  "commodityDemandPaths": [
    {
      object (CommodityDemandPath)
    }
  ]
}
입력란
requestId

string

이 응답과 연결된 요청의 ID입니다.

vesselServices[]

object (VesselService)

선박 서비스의 네트워크입니다. 각 선박 등급에서 사용되는 총 선박 수는 이 등급에서 사용 가능한 선박 수를 초과할 수 없습니다.

commodityDemandPaths[]

object (CommodityDemandPath)

양의 상품 수요가 배송되는 모든 상품 수요 경로의 목록입니다. 수요가 배송되지 않으면 일부 상품 수요 ID가 포함되지 않을 수 있습니다. 아니면 상품 수요가 부분적으로 충족될 수도 있습니다. 각 상품 수요의 총 처리 수량은 총 수요를 초과할 수 없습니다. 마지막으로 commodityDemandPaths는 vesselServices에 종속됩니다 (CommodityDemandPath 정의 참고).

SolverParameters

LSNDSP의 단일 답을 제어하는 매개변수입니다.

JSON 표현
{
  "timeLimit": string
}
입력란
timeLimit

string (Duration format)

문제 해결사가 문제에 할애해야 하는 최대 시간입니다. 이 값은 엄격한 제한이 아니며 통신 오버헤드를 고려하지 않습니다. 문제 해결을 위한 예상 지연 시간은 이 값을 약간 초과할 수 있습니다.

소수점 아래가 최대 9자리까지이고 's'로 끝나는 초 단위 기간입니다. 예를 들면 "3.5s"입니다.

포트

포트(예: 터미널 또는 포트의 모든 단자)

JSON 표현
{
  "id": string,
  "minimumPortStayDuration": {
    object (Duration)
  },
  "minimumTransshipmentDuration": {
    object (Duration)
  },
  "transshipmentCost": number,
  "vesselClassCosts": {
    string: {
      object (VesselCost)
    },
    ...
  }
}
입력란
id

string

이 포트에 할당된 고유 ID입니다.

minimumPortStayDuration

object (Duration)

포트 호출의 최소 체류 기간입니다. 포트는 일반적으로 이동 횟수가 많은 대형 선박에 더 많은 크레인이 할당되므로 더 많은 공간을 차지하기 때문에 대부분의 연구는 일정하게 유지한다고 가정합니다.

minimumTransshipmentDuration

object (Duration)

특정 항구에서 이루어지는 최소 운송 기간으로, 컨테이너를 언로드하여 다른 선박에 다시 로드하는 시간을 포함합니다.

transshipmentCost

number

컨테이너를 운송하는 비용입니다. 운송은 항구에서 세관 서류 작업을 할 필요가 없기 때문에 일반적으로 적재 및 배출의 합계보다 적습니다.

vesselClassCosts

map (key: string, value: object (VesselCost))

선박 클래스 ID로 매핑된 이 포트를 호출할 때 발생하는 비용입니다. 선박 클래스는 이 지도에 항목이 있는 경우에만 이 포트를 호출할 수 있습니다.

"key": value 쌍 목록을 포함하는 객체입니다. 예: { "name": "wrench", "mass": "1.3kg", "count": "3" }

시간

기간 (항항 체류/운송, 수요 운송)은 시간 단위로 정의됩니다.

JSON 표현
{
  "hours": string
}
입력란
hours

string (int64 format)

기간을 정의하는 시간입니다.

VesselCost

이 항구에 도착하고 체류하는 데 드는 선박 비용은 체류 시간 (fixedCost + hourlyCost * 시간)의 선형 함수로 정의됩니다.

JSON 표현
{
  "fixedCost": number,
  "hourlyCost": number
}
입력란
fixedCost

number

이 포트를 호출하는 고정 비용입니다.

hourlyCost

number

이 항구에서 머무르는 시간당 비용입니다.

LegCandidate

선박 서비스 구간 후보입니다. 동일한 두 포트 사이에 구간 후보가 여러 개 있을 수 있습니다(예: 서로 다른 해로 또는 선박 속도를 나타냄).

JSON 표현
{
  "id": string,
  "departurePortId": string,
  "arrivalPortId": string,
  "duration": {
    object (Duration)
  },
  "vesselClassCosts": {
    string: number,
    ...
  }
}
입력란
id

string

이 구간 후보에 할당된 고유 ID입니다.

departurePortId

string

출발 포트의 ID입니다.

arrivalPortId

string

도착 포트의 ID입니다.

duration

object (Duration)

다리의 지속 시간입니다.

vesselClassCosts

map (key: string, value: number)

이 구간 후보를 특정 선박에 할당하는 비용입니다. 여기에는 선박 운영 비용, 벙커 비용, 전세 비용이 포함될 수 있습니다. 선박 클래스는 이 지도에 항목이 있는 경우에만 이 구간 후보를 통해 항해할 수 있습니다.

"key": value 쌍 목록을 포함하는 객체입니다. 예: { "name": "wrench", "mass": "1.3kg", "count": "3" }

VesselClass

선박 등급(동일한 속성을 공유하는 선박 그룹)입니다. 같은 등급의 선박 두 개를 구분할 방법은 없습니다.

JSON 표현
{
  "id": string,
  "containerCapacity": string,
  "vesselCount": string
}
입력란
id

string

이 선박 등급에 할당된 고유 ID입니다.

containerCapacity

string (int64 format)

선박 등급 수용 인원 (컨테이너 내)입니다.

vesselCount

string (int64 format)

이 선박 등급의 선박 수입니다.

CommodityDemand

상품 수요(운송업체가 이행해야 하는 잠재적 수요)입니다.

JSON 표현
{
  "id": string,
  "originPortId": string,
  "destinationPortId": string,
  "containerCount": string,
  "freightRate": number,
  "maximumTransitDuration": {
    object (Duration)
  }
}
입력란
id

string

이 상품 수요에 할당된 고유 ID입니다.

originPortId

string

출발지 포트의 ID입니다.

destinationPortId

string

대상 포트의 ID입니다.

containerCount

string (int64 format)

처리할 최대 컨테이너 수입니다.

freightRate

number

컨테이너당 화물 요율 (충족하지 않은 수요에 대한 페널티가 포함될 수 있음) 출발지와 목적지에서 컨테이너당 적재 및 배출 비용을 줄여야 합니다.

maximumTransitDuration

object (Duration)

최대 운송 시간 (설정된 경우 확실히 양수여야 함) 운송 시간은 이 수요를 제공하는 첫 번째 선박이 출발지 항구를 출발하여 이 수요를 운반하는 마지막 선박이 목적지 포트에 도착하는 시간까지 정의됩니다.

VesselService

상품 수요를 충당하는 데 사용할 수 있는 선박 서비스입니다. 중요: 현재 서비스가 매주 반복되며 포트 체류 시간은 1주일을 초과할 수 없다고 가정합니다. 선박 서비스 구간의 다음과 같은 시퀀스는 다음과 같습니다. vesselServiceLegs { legCandidateId: "0->1" originDepartureTime {} destinationArrivalTime { day: 3 hourOfDay: 12 } vesselServiceLegs { legCandidateId: "1->0"originDepartureTime { day:1->0" originDepartureTime }일:

JSON 표현
{
  "vesselClassId": string,
  "vesselServiceLegs": [
    {
      object (VesselServiceLeg)
    }
  ]
}
입력란
vesselClassId

string

서비스를 수행하는 용기 클래스 ID입니다.

vesselServiceLegs[]

object (VesselServiceLeg)

유효한 선박 서비스의 경우 1. 이 입력란은 비워둘 수 없습니다. 2. 연속 구간의 destinationPortId와 originPortId가 일치해야 합니다 (마지막 구간과 첫 번째 구간 포함).

VesselServiceLeg

선박 서비스의 단일 구간입니다.

JSON 표현
{
  "legCandidateId": string,
  "originDepartureTime": {
    object (ScheduleTime)
  },
  "destinationArrivalTime": {
    object (ScheduleTime)
  }
}
입력란
legCandidateId

string

할당된 구간 후보 ID입니다.

originDepartureTime

object (ScheduleTime)

주간 일정에 따라 출발지 포트의 출발 시간입니다.

destinationArrivalTime

object (ScheduleTime)

주간 일정에 따라 목적지 포트에 도착하는 시간입니다.

ScheduleTime

일정 시간 (선박/수요 출발/도착)은 특정 시간에 주별로 정의됩니다.

JSON 표현
{
  "day": string,
  "hourOfDay": integer
}
입력란
day

string (int64 format)

일정의 요일입니다. 0일째는 가능한 첫 번째 날입니다.

hourOfDay

integer

예약 시간의 시간은 0에서 23 사이의 정수여야 합니다.

CommodityDemandPath

특정 상품 수요의 일부가 차지하는 다양한 서비스 및 포트를 말합니다. 아래에 사용되는 지수는 응답의 선박 서비스 순서와 개별 선박 서비스의 서비스 구간 순서를 기준으로 합니다.

JSON 표현
{
  "commodityDemandId": string,
  "containerCount": string,
  "vesselServiceLegIds": [
    {
      object (VesselServiceLegId)
    }
  ]
}
입력란
commodityDemandId

string

상품 수요 ID가 처리되었습니다.

containerCount

string (int64 format)

이 경로를 거치는 컨테이너의 수입니다. 각 상품 수요의 총 처리 수량은 총 수요를 초과할 수 없습니다.

vesselServiceLegIds[]

object (VesselServiceLegId)

이 경로를 거친 선박 서비스 구간 ID의 목록입니다. 유효한 상품 수요 경로의 경우 다음 속성이 유지됩니다. 1. 첫 번째 구간의 originPortId는 상품 수요의 originPortId와 일치해야 합니다. 2. 마지막 구간의 destinationPortId는 상품 수요의 destinationPortId와 일치해야 합니다. 3. 연속된 구간의 arrivalPortId와 departurePortId는 일치해야 합니다. 4. 이 상품 수요에 제공되는 경우 최대 운송 시간은 경로의 총 소요 시간보다 크거나 같아야 합니다.

VesselServiceLegId

상품 수요 경로에 사용되는 단일 선박 서비스 구간입니다. 예를 들어 선박 서비스가 2개 있다고 가정해 보겠습니다. 첫 번째는 세 개의 구간 (색인이 0, 1, 2)이고 두 번째 두 다리 (색인이 0 및 1)로 구성됩니다. 또한 첫 번째 서비스의 첫 번째 구간이 두 번째 서비스의 두 번째 구간 출발 포트에 도착합니다. 선박 서비스 구간 ID {vesselServiceIndex: 0, vesselServiceLegIndex: 2} {vesselServiceIndex: 0, vesselServiceLegIndex: 0} {vesselServiceIndex: 1, vesselServiceIndex: 1, vesselServiceLegIndex: 1, vesselServiceLegIndex: 1, vesselServiceLegIndex: 1은 컨테이너가 첫 번째 서비스 구간 2에서 서비스 구간 2로 이어지는 단일 구간 서비스 구간 ID({vesselServiceIndex: 0, vesselServiceLegIndex: 2})로 구성되며, 2가 첫 번째 서비스 구간을 횡단합니다.

JSON 표현
{
  "vesselServiceIndex": integer,
  "vesselServiceLegIndex": integer
}
입력란
vesselServiceIndex

integer

선박 서비스의 색인입니다.

vesselServiceLegIndex

integer

vesselServiceIndex로 색인이 생성된 선박 서비스의 구간 색인입니다.