Method: shipping.designShippingNetwork

Решает проблему проектирования и планирования сети линейных перевозок (LSNDSP) на основе заданного DesignShippingNetworkRequest .

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

Идентификатор проблемы или запроса.

solverParameters

object ( SolverParameters )

Параметры решателя.

ports[]

object ( Port )

Список возможных портов для захода судов. Запрос должен содержать только идентификаторы портов, которые есть в этом списке.

legCandidates[]

object ( LegCandidate )

Список потенциальных кандидатов на ветки, которые будут добавлены к судовым услугам. Запрос должен содержать только идентификаторы кандидатов на ветку, которые есть в этом списке.

vesselClasses[]

object ( VesselClass )

Перечень классов судов для оказания судовых услуг. Обратите внимание, что все суда одного класса полностью взаимозаменяемы. Запрос должен содержать только идентификаторы классов судов, которые есть в этом списке.

commodityDemands[]

object ( CommodityDemand )

Перечень потенциальных потребностей в товарах (т.е. контейнерах), которые должны быть удовлетворены судовыми услугами.

vesselServices[]

object ( VesselService )

Сеть действительных судовых услуг (обычно текущее состояние сети) может быть предоставлена ​​для использования в качестве отправной точки для оптимизации.

Тело ответа

В ответе содержится решение для экземпляра LSNDSP, переданного в запросе. Он содержит действующую сеть судовых перевозок и пути спроса на сырьевые товары. Общий спрос на товары, проходящий через каждый участок, не может превышать вместимость класса судна, обслуживающего этот участок. Обратите внимание, что отсутствие судовых перевозок без удовлетворения спроса всегда является возможным решением проблемы проектирования и планирования сети линейного судоходства.

В случае успеха тело ответа содержит данные следующей структуры:

JSON-представление
{
  "requestId": string,
  "vesselServices": [
    {
      object (VesselService)
    }
  ],
  "commodityDemandPaths": [
    {
      object (CommodityDemandPath)
    }
  ]
}
Поля
requestId

string

Идентификатор запроса, с которым связан этот ответ.

vesselServices[]

object ( VesselService )

Сеть судовых сервисов. Для каждого класса судов общее количество используемых судов не может превышать доступное количество судов для этого класса.

commodityDemandPaths[]

object ( CommodityDemandPath )

Список всех путей спроса на сырьевые товары, по которым реализуется положительный спрос на сырьевые товары. Обратите внимание, что некоторые идентификаторы спроса на сырьевые товары могут быть не включены, если спрос не будет отгружен. Альтернативно, спрос на сырьевые товары может быть частично удовлетворен. По каждому товарному спросу общий удовлетворенный объем не может превышать общий спрос. Наконец, commodityDemandPath зависит от сосудаServices (см. определение CommodityDemandPath).

Параметры Солвера

Параметры, управляющие одним решением LSNDSP.

JSON-представление
{
  "timeLimit": string
}
Поля
timeLimit

string ( Duration format)

Максимальное время, которое решатель должен потратить на решение задачи. Это значение не является жестким пределом и не учитывает накладные расходы на связь. Ожидаемая задержка решения проблемы может немного превышать это значение.

Продолжительность в секундах, содержащая до девяти дробных цифр и оканчивающаяся на « s ». Пример: "3.5s" .

Порт

Порт, например терминал или все терминалы порта.

JSON-представление
{
  "id": string,
  "minimumPortStayDuration": {
    object (Duration)
  },
  "minimumTransshipmentDuration": {
    object (Duration)
  },
  "transshipmentCost": number,
  "vesselClassCosts": {
    string: {
      object (VesselCost)
    },
    ...
  }
}
Поля
id

string

Уникальный идентификатор, присвоенный этому порту.

minimumPortStayDuration

object ( Duration )

Минимальная продолжительность пребывания для захода в порт. В большинстве исследований предполагается, что краны постоянны, поскольку порты обычно назначают больше кранов более крупным судам с большим количеством перемещений, поскольку они занимают больше места.

minimumTransshipmentDuration

object ( Duration )

Минимальная продолжительность перевалки в данном порту, включая продолжительность разгрузки контейнера и его перегрузки на другое судно.

transshipmentCost

number

Стоимость перевалки контейнера. Обычно она будет ниже суммы погрузки и разгрузки, поскольку перевалка не требует оформления таможенных документов в порту.

vesselClassCosts

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

Затраты, понесенные при заходе в этот порт, сопоставлены с идентификатором класса судна. Класс судна может зайти в этот порт только в том случае, если он отмечен на этой карте.

Объект, содержащий список пар "key": value . Пример: { "name": "wrench", "mass": "1.3kg", "count": "3" } .

Продолжительность

Продолжительность (стоянка/перевалка в порту, потребность в транзите) определяется с почасовой детализацией.

JSON-представление
{
  "hours": string
}
Поля
hours

string ( int64 format)

Количество часов, определяющее продолжительность.

Стоимость судна

Стоимость захода и пребывания судна в этом порту определяется как линейная функция продолжительности стоянки ( fixedCost + hourlyCost *часы).

JSON-представление
{
  "fixedCost": number,
  "hourlyCost": number
}
Поля
fixedCost

number

Фиксированная стоимость звонка на этот порт.

hourlyCost

number

Почасовая стоимость пребывания в этом порту.

НогаКандидат

Кандидат на службу на судне. Между одними и теми же двумя портами может быть несколько кандидатов на участки, например, представляющие разные океанские маршруты и/или скорости судов. Однако между двумя портами с заданной продолжительностью может быть только один кандидат на ветку.

JSON-представление
{
  "id": string,
  "departurePortId": string,
  "arrivalPortId": string,
  "duration": {
    object (Duration)
  },
  "vesselClassCosts": {
    string: number,
    ...
  }
}
Поля
id

string

Уникальный идентификатор, присвоенный этому кандидату на ветвь.

departurePortId

string

Идентификатор порта отправления.

arrivalPortId

string

Идентификатор порта прибытия.

duration

object ( Duration )

Продолжительность ноги.

vesselClassCosts

map (key: string, value: number)

Стоимость назначения этого кандидата на ветку определенному классу судна. Сюда могут входить расходы на эксплуатацию судна, стоимость бункера, стоимость чартера. Класс судна может проходить через этот кандидат только в том случае, если он имеет запись на этой карте.

Объект, содержащий список пар "key": value . Пример: { "name": "wrench", "mass": "1.3kg", "count": "3" } .

Класс судна

Класс судна, т. е. группа судов, имеющих одинаковые характеристики. Невозможно отличить два судна одного класса.

JSON-представление
{
  "id": string,
  "containerCapacity": string,
  "vesselCount": string
}
Поля
id

string

Уникальный идентификатор, присвоенный этому классу судна.

containerCapacity

string ( int64 format)

Класс судна Вместимость (в контейнерах).

vesselCount

string ( int64 format)

Количество судов данного класса судов.

Товарный спрос

Спрос на товар, т. е. потенциальный спрос, который должен быть удовлетворен грузоотправителем.

JSON-представление
{
  "id": string,
  "originPortId": string,
  "destinationPortId": string,
  "containerCount": string,
  "freightRate": number,
  "maximumTransitDuration": {
    object (Duration)
  }
}
Поля
id

string

Уникальный идентификатор, присвоенный этому спросу на товар.

originPortId

string

Идентификатор исходного порта.

destinationPortId

string

Идентификатор порта назначения.

containerCount

string ( int64 format)

Максимальное количество контейнеров, подлежащих заполнению.

freightRate

number

Ставка фрахта за контейнер (которая может включать штраф за неудовлетворенный спрос). Это должно устранить стоимость погрузки и разгрузки каждого контейнера в пункте отправления и назначения.

maximumTransitDuration

object ( Duration )

Максимальная продолжительность транзита (если установлена, должна быть строго положительной). Время транзита определяется с момента, когда первое судно, обслуживающее этот спрос, покидает порт отправления, до момента прибытия последнего судна, обслуживающего этот спрос, в порт назначения.

Сервис судна

Судовые услуги, которые можно использовать для удовлетворения потребностей в товарах. ВАЖНО: в настоящее время предполагается, что услуги предоставляются еженедельно, а время пребывания в порту не может превышать одной недели. Рассмотрим следующую последовательность этапов обслуживания судна: сосудСервисЛегс { legCandidateId: "0->1" originDepartureTime {} DestinationArrivalTime { день: 3hourOfDay: 12 } } сосудаServiceLegs { legCandidateId: "1->0" originDepartureTime { день: 4 } DestinationArrivalTime { day: 7hourOfDay: 12 } } Эти ветки определяют недельные линии обслуживания, проходящие через два порта, время пребывания в обоих портах составляет 12 часов.

JSON-представление
{
  "vesselClassId": string,
  "vesselServiceLegs": [
    {
      object (VesselServiceLeg)
    }
  ]
}
Поля
vesselClassId

string

Идентификатор класса судна, выполняющего услугу.

vesselServiceLegs[]

object ( VesselServiceLeg )

Для действительного судового сервиса выполняются следующие свойства: 1. Он не может быть пустым. 2. Идентификаторы targetPortId и originPortId последовательных ветвей должны совпадать (в том числе для последней и первой ветвей).

СудноСервисНога

Один этап судового сообщения.

JSON-представление
{
  "legCandidateId": string,
  "originDepartureTime": {
    object (ScheduleTime)
  },
  "destinationArrivalTime": {
    object (ScheduleTime)
  }
}
Поля
legCandidateId

string

Присвоенный идентификатор кандидата на ногу.

originDepartureTime

object ( ScheduleTime )

Время отправления в порт отправления по еженедельному графику.

destinationArrivalTime

object ( ScheduleTime )

Время прибытия в порт назначения по недельному графику.

РасписаниеВремя

Время расписания (отправление/прибытие судна/требования) определяется с еженедельной частотой в заданный час.

JSON-представление
{
  "day": string,
  "hourOfDay": integer
}
Поля
day

string ( int64 format)

День по расписанию. День 0 — первый возможный день.

hourOfDay

integer

Час дня расписания должен быть целым числом от 0 до 23 включительно.

Путь спроса на товар

Различные услуги и порты, на которые приходится часть спроса на определенные товары. Используемые ниже индексы основаны на порядке обслуживания судов в ответе и порядке участков обслуживания в отдельных службах судов.

JSON-представление
{
  "commodityDemandId": string,
  "containerCount": string,
  "vesselServiceLegIds": [
    {
      object (VesselServiceLegId)
    }
  ]
}
Поля
commodityDemandId

string

Идентификатор спроса на товар выполнен.

containerCount

string ( int64 format)

Количество контейнеров, проходящих по этому пути. По каждому товарному спросу общий удовлетворенный объем не может превышать общий спрос.

vesselServiceLegIds[]

object ( VesselServiceLegId )

Список идентификаторов участков обслуживания судов, пройденных по этому пути. Для действительного пути спроса на сырьевые товары выполняются следующие свойства: 1. PortId_отправления первого этапа должен совпадать с originPortId спроса на сырьевые товары. 2. Идентификатор порта назначения последнего этапа должен совпадать с идентификатором порта назначения спроса на товары. 3. Идентификаторы порта прибытия и порта отправления последовательных этапов должны совпадать. 4. Если предусмотрен данный товарный спрос, максимальное время транзита должно быть больше или равно общей продолжительности пути.

СудноServiceLegId

Ветка обслуживания одного судна, используемая на пути спроса на сырьевые товары. Например, предположим, что есть два судовых сервиса. Первый состоит из трех ветвей (с индексами 0, 1 и 2), а второй — из двух (с индексами 0 и 1). Кроме того, первый этап первого рейса прибывает в порт отправления второго этапа второго рейса. Путь товара, состоящий из трех следующих идентификаторов этапов обслуживания судна: {vesselServiceIndex: 0, сосудСервисЛегИндекс: 2} {vesselServiceIndex: 0, сосудСервисЛегИндекс: 0} {vesselServiceIndex: 1, сосудСервисЛегИндекс: 1} означает, что контейнеры берут два последовательных этапа от первого. судно (обратите внимание, что 2 и 0 идут последовательно, поскольку каждая услуга представляет собой цикл), затем перегружается на судно 1 на одном участке.

JSON-представление
{
  "vesselServiceIndex": integer,
  "vesselServiceLegIndex": integer
}
Поля
vesselServiceIndex

integer

Указатель судового сервиса.

vesselServiceLegIndex

integer

Индекс участка службы судна, индексируемый vesselServiceIndex .