Giải quyết vấn đề về việc thiết kế mạng lưới vận chuyển và lên lịch (LSNDSP) cho tàu chở hàng từ DesignShippingNetworkRequest
cho trước.
LSNDSP là một bài toán tối ưu hoá phức tạp nhằm tìm ra thiết kế và lịch biểu tối ưu cho mạng lưới vận chuyển hàng hoá. Mục tiêu là giảm thiểu tổng chi phí vận hành mạng lưới, trong khi vẫn đáp ứng nhu cầu vận chuyển hàng hoá giữa các cảng nhiều nhất có thể.
LSNDSP có thể được chia thành hai vấn đề phụ chính: thiết kế mạng và lập lịch biểu. Bài toán phụ trong thiết kế mạng sẽ xác định nhóm cổng mà mạng lưới sẽ phục vụ, số lượng tàu được triển khai trên mỗi tuyến và các tuyến đường mà các tàu sẽ đi qua. Bài toán phụ về lập lịch biểu xác định lịch trình ra khơi cho các con tàu, có xét đến thời gian cần thiết để đi thuyền giữa các cảng, thời gian để xếp và dỡ hàng và nhu cầu vận chuyển hàng hóa giữa các cảng.
Nói một cách đơn giản, LSNDSP là vấn đề trong việc quyết định cảng nào cần phục vụ, số lượng tàu cần sử dụng và cách lên lịch tàu để giảm thiểu chi phí vận hành mạng lưới, đồng thời tối đa hoá doanh thu để đáp ứng nhu cầu hàng hoá. Một thành phần phụ đầy thách thức của LSNDSP là hoạt động định tuyến hàng hoá, xác định nhu cầu nào cần đáp ứng và tuyến nào cần chỉ định cho hàng hoá để tối đa hoá doanh thu.
Yêu cầu HTTP
POST https://optimization.googleapis.com/v1/shipping:designShippingNetwork
URL sử dụng cú pháp Chuyển mã gRPC.
Nội dung yêu cầu
Nội dung yêu cầu chứa dữ liệu có cấu trúc sau:
Biểu diễn dưới dạng JSON |
---|
{ "requestId": string, "solverParameters": { object ( |
Trường | |
---|---|
requestId |
Mã yêu cầu hoặc sự cố. |
solverParameters |
Các tham số cho trình giải. |
ports[] |
Danh sách các cổng có thể được gọi trong các dịch vụ tàu. Yêu cầu chỉ được chứa mã cổng có trong danh sách này. |
legCandidates[] |
Danh sách những người có thể triển khai chặng bay để được thêm vào dịch vụ vận chuyển. Yêu cầu chỉ được chứa mã ứng cử viên chân có trong danh sách này. |
vesselClasses[] |
Danh sách các lớp tàu để thực hiện dịch vụ trên tàu. Lưu ý rằng tất cả các tàu thuộc cùng một lớp đều hoàn toàn thay thế được cho nhau. Yêu cầu chỉ được chứa mã lớp tàu có trong danh sách này. |
commodityDemands[] |
Danh sách các nhu cầu về hàng hoá tiềm năng (tức là công-te-nơ) mà các dịch vụ tàu thuyền sẽ thực hiện. |
vesselServices[] |
Một mạng lưới dịch vụ tàu hợp lệ (thường là trạng thái hiện tại của mạng) có thể được cung cấp để bắt đầu quá trình tối ưu hoá. |
Nội dung phản hồi
Phản hồi này giữ giải pháp cho thực thể LSNDSP được chuyển vào yêu cầu. Mạng lưới này có một mạng lưới dịch vụ tàu thuyền và lộ trình nhu cầu hàng hoá hợp lệ. Tổng nhu cầu hàng hoá đi qua mỗi chặng không được vượt quá sức chứa của hạng tàu phục vụ chặng này. Lưu ý rằng việc không có dịch vụ vận chuyển nào không có nhu cầu được đáp ứng luôn là một giải pháp khả thi cho vấn đề lập lịch và thiết kế mạng lưới vận chuyển tàu.
Nếu thành công, phần nội dung phản hồi sẽ chứa dữ liệu có cấu trúc sau:
Biểu diễn dưới dạng JSON |
---|
{ "requestId": string, "vesselServices": [ { object ( |
Trường | |
---|---|
requestId |
Mã của yêu cầu mà phản hồi này được liên kết. |
vesselServices[] |
Mạng lưới dịch vụ tàu thuyền. Đối với mỗi hạng tàu, tổng số tàu được sử dụng không được vượt quá số lượng tàu hiện có cho hạng này. |
commodityDemandPaths[] |
Danh sách tất cả lộ trình của nhu cầu hàng hoá mà nhu cầu hàng hoá được vận chuyển qua đó. Xin lưu ý rằng một số mã nhu cầu hàng hoá có thể không được đưa vào nếu không có nhu cầu nào được vận chuyển. Ngoài ra, nhu cầu về hàng hoá cũng có thể được đáp ứng một phần. Đối với mỗi nhu cầu hàng hóa, tổng số lượng đã thực hiện không được vượt quá tổng nhu cầu. Cuối cùng, commoditydemandPaths phụ thuộc vào vesselServices (xem định nghĩa CommoditydemandPath). |
SolverParameters
Các tham số kiểm soát một lần giải LSNDSP.
Biểu diễn dưới dạng JSON |
---|
{ "timeLimit": string } |
Trường | |
---|---|
timeLimit |
Thời gian tối đa mà người giải toán nên dành cho bài toán đó. Giá trị này không phải là giới hạn cố định và không tính đến chi phí liên lạc. Độ trễ dự kiến để giải quyết vấn đề có thể hơi vượt quá giá trị này. Thời lượng tính bằng giây với tối đa 9 chữ số phân số, kết thúc bằng " |
Cổng
Cổng, ví dụ: một thiết bị đầu cuối hoặc tất cả các đầu nối của một cổng.
Biểu diễn dưới dạng JSON |
---|
{ "id": string, "minimumPortStayDuration": { object ( |
Trường | |
---|---|
id |
Mã nhận dạng duy nhất được gán cho cổng này. |
minimumPortStayDuration |
Thời gian lưu trú tối thiểu cho một lệnh gọi chuyển. Hầu hết các nghiên cứu đều giả định không đổi vì cảng thường bố trí nhiều cần cẩu hơn cho các tàu lớn hơn có số lượt di chuyển cao vì các tàu này chiếm nhiều không gian hơn. |
minimumTransshipmentDuration |
Thời gian tối thiểu để trung chuyển tại một cảng nhất định, bao gồm cả thời gian chất tải một công-te-nơ và chất lên tàu khác. |
transshipmentCost |
Chi phí trung chuyển một vùng chứa. Giá trị này thường thấp hơn tổng phí bốc hàng vì việc vận chuyển không yêu cầu giấy tờ hải quan tại cảng. |
vesselClassCosts |
Chi phí phát sinh khi gọi cảng này được liên kết theo mã hạng tàu. Một lớp tàu chỉ có thể gọi cổng này nếu cổng này có mục nhập trong bản đồ này. Một đối tượng chứa danh sách các cặp |
Thời lượng
Thời gian (thời gian lưu trú tại cảng/vận chuyển, vận chuyển nhu cầu) được xác định chi tiết theo giờ.
Biểu diễn dưới dạng JSON |
---|
{ "hours": string } |
Trường | |
---|---|
hours |
Số giờ xác định thời lượng. |
VesselCost
Chi phí cho việc gọi và lưu trú tại cảng này được định nghĩa là một hàm tuyến tính trong thời gian lưu trú (fixedCost
+ hourlyCost
* giờ).
Biểu diễn dưới dạng JSON |
---|
{ "fixedCost": number, "hourlyCost": number } |
Trường | |
---|---|
fixedCost |
Chi phí cố định để gọi cổng này. |
hourlyCost |
Chi phí hằng giờ để lưu trú tại cảng này. |
LegCandidate
Đề xuất đơn vị cung cấp dịch vụ tàu thuyền. Có thể có nhiều ứng cử viên chân giữa hai cổng giống nhau, ví dụ: đại diện cho các tuyến đường khác nhau trên biển và/hoặc vận tốc của tàu.
Biểu diễn dưới dạng JSON |
---|
{
"id": string,
"departurePortId": string,
"arrivalPortId": string,
"duration": {
object ( |
Trường | |
---|---|
id |
Mã nhận dạng duy nhất được chỉ định cho ứng cử viên chặng này. |
departurePortId |
Mã cổng khởi hành. |
arrivalPortId |
Mã nhận dạng của cổng đến. |
duration |
Thời lượng của chặng đi. |
vesselClassCosts |
Chi phí để chỉ định đề xuất đường đi này cho một hạng tàu nhất định. Chi phí này có thể bao gồm chi phí vận hành tàu, chi phí hầm trú ẩn, chi phí thuê tàu. Một lớp tàu chỉ có thể đi qua ứng cử viên chặng này nếu lớp tàu đó có mục nhập trong bản đồ này. Một đối tượng chứa danh sách các cặp |
VesselClass
Lớp tàu, tức là một nhóm tàu có cùng thuộc tính. Không có cách nào để phân biệt hai tàu thuộc cùng một lớp.
Biểu diễn dưới dạng JSON |
---|
{ "id": string, "containerCapacity": string, "vesselCount": string } |
Trường | |
---|---|
id |
Mã nhận dạng duy nhất được gán cho lớp tàu này. |
containerCapacity |
Sức chứa của tàu (tính theo công-ten-nơ). |
vesselCount |
Số lượng tàu trong hạng tàu này. |
CommodityDemand
Nhu cầu hàng hoá, tức là một nhu cầu tiềm năng để người vận chuyển đáp ứng.
Biểu diễn dưới dạng JSON |
---|
{
"id": string,
"originPortId": string,
"destinationPortId": string,
"containerCount": string,
"freightRate": number,
"maximumTransitDuration": {
object ( |
Trường | |
---|---|
id |
Mã nhận dạng duy nhất được chỉ định cho nhu cầu mặt hàng này. |
originPortId |
Mã nhận dạng của cổng gốc. |
destinationPortId |
Mã của cổng đích. |
containerCount |
Số vùng chứa tối đa cần thực hiện. |
freightRate |
Mức phí vận chuyển mỗi công-te-nơ (có thể bao gồm cả tiền phạt do nhu cầu không được đáp ứng). Việc này sẽ loại bỏ chi phí bốc hàng cho mỗi vùng chứa tại điểm xuất phát và điểm đến. |
maximumTransitDuration |
Thời lượng vận chuyển tối đa (nếu được đặt, phải là giá trị dương). Thời gian vận chuyển được xác định từ thời điểm tàu đầu tiên phục vụ nhu cầu này rời cảng gốc cho đến thời điểm tàu cuối cùng phục vụ nhu cầu này cập cảng đích. |
VesselService
Dịch vụ đưa đón bằng tàu thuyền để phục vụ nhu cầu về hàng hoá. LƯU Ý QUAN TRỌNG: giả định hiện tại là các dịch vụ được cung cấp tần suất hằng tuần và thời gian lưu chuyển không được vượt quá một tuần. Hãy xem xét trình tự các chân dịch vụ của tàu như sau: vesselServiceLegs { legCandidateId: "0->1" originDepartureTime {} destinationArrivalTime { day: 3 hourOfDay: 12 } } vesselServiceLegs { legCandidateId: "1->0" khởi hành Thời gian khởi hành { ngày: 4 } destinationDestinationTime { ngày: 7 giờOfDay: 12 } } Các chân này xác định các tuyến dịch vụ một tuần đi qua hai cảng với cả hai thời gian lưu trú tại cảng là 12 giờ.
Biểu diễn dưới dạng JSON |
---|
{
"vesselClassId": string,
"vesselServiceLegs": [
{
object ( |
Trường | |
---|---|
vesselClassId |
Mã hạng tàu thực hiện dịch vụ. |
vesselServiceLegs[] |
Đối với dịch vụ tàu hợp lệ, các thuộc tính sau đây có: 1. Không được để trống trường này. 2. Chân liên tiếp destinationPortId và originPortId phải khớp nhau (bao gồm cả ở cuối và đầu tiên). |
VesselServiceLeg
Một chặng đường duy nhất của dịch vụ tàu thuyền.
Biểu diễn dưới dạng JSON |
---|
{ "legCandidateId": string, "originDepartureTime": { object ( |
Trường | |
---|---|
legCandidateId |
Đã chỉ định mã ứng cử viên của nhánh. |
originDepartureTime |
Thời gian khởi hành tại cảng gốc theo lịch biểu hằng tuần. |
destinationArrivalTime |
Thời gian đến cảng đích theo lịch biểu hằng tuần. |
ScheduleTime
Thời gian trong lịch biểu (tàu/yêu cầu khởi hành/đến) được xác định theo tần suất hằng tuần vào một giờ nhất định.
Biểu diễn dưới dạng JSON |
---|
{ "day": string, "hourOfDay": integer } |
Trường | |
---|---|
day |
Ngày theo lịch. Ngày 0 là ngày đầu tiên có thể. |
hourOfDay |
Giờ trong ngày của thời gian theo lịch phải là một số nguyên từ 0 đến 23. |
CommodityDemandPath
Các dịch vụ và cảng khác nhau mà một phần nhu cầu của một loại hàng hoá nhất định sẽ tiếp nhận. Các chỉ số được sử dụng dưới đây dựa trên thứ tự dịch vụ tàu trong phản hồi và thứ tự chân dịch vụ trong dịch vụ tàu cá nhân.
Biểu diễn dưới dạng JSON |
---|
{
"commodityDemandId": string,
"containerCount": string,
"vesselServiceLegIds": [
{
object ( |
Trường | |
---|---|
commodityDemandId |
Mã nhu cầu của mặt hàng đã được đáp ứng. |
containerCount |
Số vùng chứa đi qua đường dẫn này. Đối với mỗi nhu cầu hàng hóa, tổng số lượng đã thực hiện không được vượt quá tổng nhu cầu. |
vesselServiceLegIds[] |
Danh sách mã chân dịch vụ tàu được lấy thông qua lộ trình này. Đối với lộ trình nhu cầu hàng hoá hợp lệ, các thuộc tính sau giữ nguyên: 1. availabilityPortId của chặng đầu phải khớp với originPortId của nhu cầu hàng hoá. 2. destinationPortId của chặng cuối phải khớp với destinationPortId của nhu cầu hàng hóa. 3. Chân liên tiếp exportPortId và launchPortId phải khớp nhau. 4. Nếu cung cấp cho nhu cầu về mặt hàng này, thời gian vận chuyển tối đa phải lớn hơn hoặc bằng tổng thời gian của lộ trình. |
VesselServiceLegId
Cột dịch vụ tàu một dùng trong lộ trình nhu cầu hàng hóa. Ví dụ: giả sử có hai dịch vụ tàu thuyền. Chân đầu tiên được làm bằng ba chân (chỉ mục 0, 1 và 2) và hai chân thứ hai (chỉ mục 0 và 1). Ngoài ra, chặng đầu tiên của dịch vụ đầu tiên sẽ đến cảng khởi hành của chặng thứ hai của dịch vụ thứ hai. Một lộ trình hàng hoá bao gồm ba chân dịch vụ tàu sau: {vesselServiceIndex: 0, vesselServiceLegIndex: 2} {vesselServiceIndex: 0, vesselServiceLegIndex: 0} {vesselServiceIndex: 1, vesselServiceLegIndex: 1} có nghĩa là mỗi tàu dịch vụ 2 chân liên tiếp từ tàu dịch vụ 2 chân liên tiếp từ đó
Biểu diễn dưới dạng JSON |
---|
{ "vesselServiceIndex": integer, "vesselServiceLegIndex": integer } |
Trường | |
---|---|
vesselServiceIndex |
Chỉ mục của dịch vụ tàu. |
vesselServiceLegIndex |
Chỉ mục quãng đường đã đi trên dịch vụ tàu do |