Решает проблему проектирования и планирования сети линейных перевозок (LSNDSP) на основе заданного DesignShippingNetworkRequest
.
LSNDSP представляет собой сложную задачу оптимизации, целью которой является поиск оптимальной конструкции и планирования сети линейного судоходства. Цель состоит в том, чтобы минимизировать общие затраты на эксплуатацию сети, одновременно удовлетворяя как можно большую часть спроса на грузы между портами.
LSNDSP можно разбить на две основные подзадачи: проектирование сети и планирование. Подзадача проектирования сети определяет набор портов, которые будут обслуживаться сетью, количество судов, которые будут развернуты на каждом маршруте, а также маршруты, по которым будут следовать суда. Подзадача планирования определяет графики движения судов с учетом времени плавания между портами, времени погрузки и разгрузки груза, а также потребности в перевозке грузов между портами.
Проще говоря, LSNDSP — это проблема принятия решения о том, какие порты обслуживать, сколько судов использовать и как планировать движение судов так, чтобы затраты на эксплуатацию сети были сведены к минимуму и при этом максимизировались доходы от удовлетворения спроса на грузы. Сложным подкомпонентом LSNDSP является маршрутизация грузов, которая определяет, какие требования необходимо удовлетворить и какие маршруты назначить для грузов, чтобы максимизировать доход.
HTTP-запрос
POST https://optimization.googleapis.com/v1/shipping:designShippingNetwork
URL-адрес использует синтаксис транскодирования gRPC .
Тело запроса
Тело запроса содержит данные следующей структуры:
JSON-представление |
---|
{ "requestId": string, "solverParameters": { object ( |
Поля | |
---|---|
requestId | Идентификатор проблемы или запроса. |
solverParameters | Параметры решателя. |
ports[] | Список возможных портов для захода судов. Запрос должен содержать только идентификаторы портов, которые есть в этом списке. |
legCandidates[] | Список потенциальных кандидатов на ветки, которые будут добавлены к судовым услугам. Запрос должен содержать только идентификаторы кандидатов на ветку, которые есть в этом списке. |
vesselClasses[] | Перечень классов судов для оказания судовых услуг. Обратите внимание, что все суда одного класса полностью взаимозаменяемы. Запрос должен содержать только идентификаторы классов судов, которые есть в этом списке. |
commodityDemands[] | Перечень потенциальных потребностей в товарах (т.е. контейнерах), которые должны быть удовлетворены судовыми услугами. |
vesselServices[] | Сеть действительных судовых услуг (обычно текущее состояние сети) может быть предоставлена для использования в качестве отправной точки для оптимизации. |
Тело ответа
В ответе содержится решение для экземпляра LSNDSP, переданного в запросе. Он содержит действующую сеть судовых перевозок и пути спроса на сырьевые товары. Общий спрос на товары, проходящий через каждый участок, не может превышать вместимость класса судна, обслуживающего этот участок. Обратите внимание, что отсутствие судовых перевозок без удовлетворения спроса всегда является возможным решением проблемы проектирования и планирования сети линейного судоходства.
В случае успеха тело ответа содержит данные следующей структуры:
JSON-представление |
---|
{ "requestId": string, "vesselServices": [ { object ( |
Поля | |
---|---|
requestId | Идентификатор запроса, с которым связан этот ответ. |
vesselServices[] | Сеть судовых сервисов. Для каждого класса судов общее количество используемых судов не может превышать доступное количество судов для этого класса. |
commodityDemandPaths[] | Список всех путей спроса на сырьевые товары, по которым реализуется положительный спрос на сырьевые товары. Обратите внимание, что некоторые идентификаторы спроса на сырьевые товары могут быть не включены, если спрос не будет отгружен. Альтернативно, спрос на сырьевые товары может быть частично удовлетворен. По каждому товарному спросу общий удовлетворенный объем не может превышать общий спрос. Наконец, commodityDemandPath зависит от сосудаServices (см. определение CommodityDemandPath). |
Параметры Солвера
Параметры, управляющие одним решением LSNDSP.
JSON-представление |
---|
{ "timeLimit": string } |
Поля | |
---|---|
timeLimit | Максимальное время, которое решатель должен потратить на решение задачи. Это значение не является жестким пределом и не учитывает накладные расходы на связь. Ожидаемая задержка решения проблемы может немного превышать это значение. Продолжительность в секундах, содержащая до девяти дробных цифр и оканчивающаяся на « |
Порт
Порт, например терминал или все терминалы порта.
JSON-представление |
---|
{ "id": string, "minimumPortStayDuration": { object ( |
Поля | |
---|---|
id | Уникальный идентификатор, присвоенный этому порту. |
minimumPortStayDuration | Минимальная продолжительность пребывания для захода в порт. В большинстве исследований предполагается, что краны постоянны, поскольку порты обычно назначают больше кранов более крупным судам с большим количеством перемещений, поскольку они занимают больше места. |
minimumTransshipmentDuration | Минимальная продолжительность перевалки в данном порту, включая продолжительность разгрузки контейнера и его перегрузки на другое судно. |
transshipmentCost | Стоимость перевалки контейнера. Обычно она будет ниже суммы погрузки и разгрузки, поскольку перевалка не требует оформления таможенных документов в порту. |
vesselClassCosts | Затраты, понесенные при заходе в этот порт, сопоставлены с идентификатором класса судна. Класс судна может зайти в этот порт только в том случае, если он отмечен на этой карте. Объект, содержащий список пар |
Продолжительность
Продолжительность (стоянка/перевалка в порту, потребность в транзите) определяется с почасовой детализацией.
JSON-представление |
---|
{ "hours": string } |
Поля | |
---|---|
hours | Количество часов, определяющее продолжительность. |
Стоимость судна
Стоимость захода и пребывания судна в этом порту определяется как линейная функция продолжительности стоянки ( fixedCost
+ hourlyCost
*часы).
JSON-представление |
---|
{ "fixedCost": number, "hourlyCost": number } |
Поля | |
---|---|
fixedCost | Фиксированная стоимость звонка на этот порт. |
hourlyCost | Почасовая стоимость пребывания в этом порту. |
НогаКандидат
Кандидат на службу на судне. Между одними и теми же двумя портами может быть несколько кандидатов на участки, например, представляющие разные океанские маршруты и/или скорости судов. Однако между двумя портами с заданной продолжительностью может быть только один кандидат на ветку.
JSON-представление |
---|
{
"id": string,
"departurePortId": string,
"arrivalPortId": string,
"duration": {
object ( |
Поля | |
---|---|
id | Уникальный идентификатор, присвоенный этому кандидату на ветвь. |
departurePortId | Идентификатор порта отправления. |
arrivalPortId | Идентификатор порта прибытия. |
duration | Продолжительность ноги. |
vesselClassCosts | Стоимость назначения этого кандидата на ветку определенному классу судна. Сюда могут входить расходы на эксплуатацию судна, стоимость бункера, стоимость чартера. Класс судна может проходить через этот кандидат только в том случае, если он имеет запись на этой карте. Объект, содержащий список пар |
Класс судна
Класс судна, т. е. группа судов, имеющих одинаковые характеристики. Невозможно отличить два судна одного класса.
JSON-представление |
---|
{ "id": string, "containerCapacity": string, "vesselCount": string } |
Поля | |
---|---|
id | Уникальный идентификатор, присвоенный этому классу судна. |
containerCapacity | Класс судна Вместимость (в контейнерах). |
vesselCount | Количество судов данного класса судов. |
Товарный спрос
Спрос на товар, т. е. потенциальный спрос, который должен быть удовлетворен грузоотправителем.
JSON-представление |
---|
{
"id": string,
"originPortId": string,
"destinationPortId": string,
"containerCount": string,
"freightRate": number,
"maximumTransitDuration": {
object ( |
Поля | |
---|---|
id | Уникальный идентификатор, присвоенный этому спросу на товар. |
originPortId | Идентификатор исходного порта. |
destinationPortId | Идентификатор порта назначения. |
containerCount | Максимальное количество контейнеров, подлежащих заполнению. |
freightRate | Ставка фрахта за контейнер (которая может включать штраф за неудовлетворенный спрос). Это должно устранить стоимость погрузки и разгрузки каждого контейнера в пункте отправления и назначения. |
maximumTransitDuration | Максимальная продолжительность транзита (если установлена, должна быть строго положительной). Время транзита определяется с момента, когда первое судно, обслуживающее этот спрос, покидает порт отправления, до момента прибытия последнего судна, обслуживающего этот спрос, в порт назначения. |
Сервис судна
Судовые услуги, которые можно использовать для удовлетворения потребностей в товарах. ВАЖНО: в настоящее время предполагается, что услуги предоставляются еженедельно, а время пребывания в порту не может превышать одной недели. Рассмотрим следующую последовательность этапов обслуживания судна: сосудСервисЛегс { legCandidateId: "0->1" originDepartureTime {} DestinationArrivalTime { день: 3hourOfDay: 12 } } сосудаServiceLegs { legCandidateId: "1->0" originDepartureTime { день: 4 } DestinationArrivalTime { day: 7hourOfDay: 12 } } Эти ветки определяют недельные линии обслуживания, проходящие через два порта, время пребывания в обоих портах составляет 12 часов.
JSON-представление |
---|
{
"vesselClassId": string,
"vesselServiceLegs": [
{
object ( |
Поля | |
---|---|
vesselClassId | Идентификатор класса судна, выполняющего услугу. |
vesselServiceLegs[] | Для действительного судового сервиса выполняются следующие свойства: 1. Он не может быть пустым. 2. Идентификаторы targetPortId и originPortId последовательных ветвей должны совпадать (в том числе для последней и первой ветвей). |
СудноСервисНога
Один этап судового сообщения.
JSON-представление |
---|
{ "legCandidateId": string, "originDepartureTime": { object ( |
Поля | |
---|---|
legCandidateId | Присвоенный идентификатор кандидата на ногу. |
originDepartureTime | Время отправления в порт отправления по еженедельному графику. |
destinationArrivalTime | Время прибытия в порт назначения по недельному графику. |
РасписаниеВремя
Время расписания (отправление/прибытие судна/требования) определяется с еженедельной частотой в заданный час.
JSON-представление |
---|
{ "day": string, "hourOfDay": integer } |
Поля | |
---|---|
day | День по расписанию. День 0 — первый возможный день. |
hourOfDay | Час дня расписания должен быть целым числом от 0 до 23 включительно. |
Путь спроса на товар
Различные услуги и порты, на которые приходится часть спроса на определенные товары. Используемые ниже индексы основаны на порядке обслуживания судов в ответе и порядке участков обслуживания в отдельных службах судов.
JSON-представление |
---|
{
"commodityDemandId": string,
"containerCount": string,
"vesselServiceLegIds": [
{
object ( |
Поля | |
---|---|
commodityDemandId | Идентификатор спроса на товар выполнен. |
containerCount | Количество контейнеров, проходящих по этому пути. По каждому товарному спросу общий удовлетворенный объем не может превышать общий спрос. |
vesselServiceLegIds[] | Список идентификаторов участков обслуживания судов, пройденных по этому пути. Для действительного пути спроса на сырьевые товары выполняются следующие свойства: 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 | Указатель судового сервиса. |
vesselServiceLegIndex | Индекс участка службы судна, индексируемый |