مشکل طراحی و برنامه ریزی شبکه حمل و نقل لاینر (LSNDSP) را از DesignShippingNetworkRequest
داده شده حل می کند.
LSNDSP یک مسئله بهینه سازی پیچیده است که به دنبال یافتن طراحی و زمان بندی بهینه یک شبکه حمل و نقل خطی است. هدف این است که هزینه کل عملیات شبکه را به حداقل برسانیم، در حالی که تا حد امکان نیاز محموله بین بنادر را برآورده کنیم.
LSNDSP را می توان به دو زیر مشکل اصلی تقسیم کرد: طراحی شبکه و زمان بندی. زیرمشکل طراحی شبکه مجموعه پورت هایی را که باید توسط شبکه سرویس دهی شود، تعداد کشتی هایی که در هر مسیر مستقر می شوند و مسیرهایی که کشتی ها طی خواهند کرد را تعیین می کند. مشکل فرعی زمانبندی، برنامههای دریانوردی کشتیها را با در نظر گرفتن زمان حرکت بین بنادر، زمان بارگیری و تخلیه محموله و تقاضا برای حمل بار بین بنادر تعیین میکند.
به عبارت ساده، LSNDSP مشکل تصمیم گیری در مورد اینکه کدام بنادر باید سرویس دهی شود، از چند کشتی استفاده شود، و نحوه برنامه ریزی کشتی ها به گونه ای است که هزینه عملیات شبکه به حداقل برسد و در عین حال درآمد برای برآورده کردن تقاضای محموله به حداکثر برسد. یکی از اجزای فرعی چالش برانگیز LSNDSP مسیریابی محموله است که تعیین می کند کدام خواسته ها را برآورده کند و کدام مسیرها را به محموله اختصاص دهد تا درآمد را به حداکثر برساند.
درخواست HTTP
POST https://optimization.googleapis.com/v1/shipping:designShippingNetwork
URL از دستور GRPC Transcoding استفاده می کند.
درخواست بدن
بدنه درخواست حاوی داده هایی با ساختار زیر است:
نمایندگی JSON |
---|
{ "requestId": string, "solverParameters": { object ( |
فیلدها | |
---|---|
requestId | مشکل یا شناسه درخواست. |
solverParameters | پارامترهای حل کننده |
ports[] | فهرست بنادر احتمالی برای فراخوانی در خدمات کشتی. درخواست فقط باید دارای شناسه های پورت باشد که در این لیست هستند. |
legCandidates[] | فهرست نامزدهای بالقوه پا برای اضافه شدن به خدمات کشتی. درخواست فقط باید شامل شناسههای نامزدی پا باشد که در این لیست هستند. |
vesselClasses[] | لیست کلاس های کشتی برای انجام خدمات کشتی. توجه داشته باشید که همه کشتی های یک کلاس کاملاً قابل تعویض هستند. درخواست فقط باید شامل شناسه های کلاس کشتی باشد که در این لیست هستند. |
commodityDemands[] | فهرست کالاهای بالقوه (به عنوان مثال کانتینر) که باید توسط خدمات کشتی برآورده شود. |
vesselServices[] | شبکه ای از خدمات کشتی معتبر (معمولاً وضعیت فعلی شبکه) می تواند به عنوان نقطه شروع برای بهینه سازی استفاده شود. |
بدن پاسخگو
پاسخ، راهحل نمونه LSNDSP را در درخواست نگه میدارد. این شامل یک شبکه معتبر از خدمات کشتی و مسیرهای تقاضای کالا است. مجموع تقاضای کالایی که در هر قسمت میگذرد، نمیتواند از ظرفیت کلاس کشتی که در این قسمت خدمت میکند تجاوز کند. توجه داشته باشید که نداشتن خدمات کشتی بدون تقاضای برآورده شده همیشه یک راه حل عملی برای مشکل طراحی و برنامه ریزی شبکه حمل و نقل خطی است.
در صورت موفقیت آمیز بودن، بدنه پاسخ حاوی داده هایی با ساختار زیر است:
نمایندگی JSON |
---|
{ "requestId": string, "vesselServices": [ { object ( |
فیلدها | |
---|---|
requestId | شناسه درخواستی که این پاسخ با آن مرتبط است. |
vesselServices[] | شبکه خدمات کشتی برای هر کلاس شناور، تعداد کل شناورهای مورد استفاده نمی تواند از تعداد شناورهای موجود برای این کلاس تجاوز کند. |
commodityDemandPaths[] | فهرست تمام مسیرهای تقاضای کالا که تقاضای کالاهای مثبت از طریق آنها ارسال می شود. توجه داشته باشید که در صورت عدم ارسال تقاضا، برخی از شناسههای تقاضای کالا ممکن است گنجانده نشوند. از طرف دیگر، تقاضای کالا می تواند تا حدی برآورده شود. برای هر تقاضای کالا، کل مقدار برآورده شده نمی تواند از کل تقاضا بیشتر شود. در نهایت، commodityDemandPaths به سرویس های کشتی بستگی دارد (به تعریف CommodityDemandPath مراجعه کنید). |
SolverParameters
پارامترهایی که یک حل واحد 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 | هزینه ساعتی اقامت در این بندر. |
LegCandidate
کاندیدای پای سرویس کشتی میتواند بین دو بندر یکسان، چندین پا وجود داشته باشد، به عنوان مثال نشان دهنده مسیرهای اقیانوسی و/یا سرعت کشتیهای مختلف. با این حال، بین دو پورت با مدت زمان معین فقط یک پا می تواند وجود داشته باشد.
نمایندگی JSON |
---|
{
"id": string,
"departurePortId": string,
"arrivalPortId": string,
"duration": {
object ( |
فیلدها | |
---|---|
id | شناسه منحصربفرد به این نامزد پا اختصاص داده شده است. |
departurePortId | شناسه بندر خروج |
arrivalPortId | شناسه بندر ورود |
duration | مدت زمان پا. |
vesselClassCosts | هزینه اختصاص این پا به یک کلاس شناور خاص. این می تواند شامل هزینه عملیات کشتی، هزینه پناهگاه، هزینه اجاره. یک کلاس شناور فقط در صورتی می تواند با این نامزد حرکت کند که در این نقشه ورودی داشته باشد. یک شی حاوی لیستی از |
VesselClass
کلاس کشتی، به عنوان مثال، گروهی از کشتی(ها) که ویژگی های یکسانی دارند. هیچ راهی برای تمایز بین دو کشتی از یک کلاس وجود ندارد.
نمایندگی 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 | حداکثر مدت حمل و نقل (در صورت تنظیم، باید کاملاً مثبت باشد). زمان ترانزیت از زمانی تعریف می شود که اولین کشتی که این تقاضا را برآورده می کند از بندر مبدا خارج می شود تا زمانی که آخرین کشتی که این تقاضا را برآورده می کند به بندر مقصد می رسد. |
سرویس کشتی
سرویس کشتی که می تواند برای تامین نیازهای کالا استفاده شود. مهم: یک فرض فعلی این است که سرویسها در فرکانس هفتگی هستند و زمان اقامت بندر نمیتواند بیش از یک هفته باشد. دنباله زیر از پاهای سرویس کشتی را در نظر بگیرید: anijeServiceLegs { legCandidateId: "0->1" originDepartureTime {} destinationArrivalTime { روز: 3 hourOfDay: 12 } } containServiceLegs {legCandidateId: "1->0" {destinationDarrivalTime: "1->0" {dayArrivalTime day: 7 hourOfDay: 12 } } این قسمتها یک خط خدمات یک هفتهای را تعریف میکنند که از دو پورت عبور میکنند و زمان اقامت هر دو پورت 12 ساعت است.
نمایندگی JSON |
---|
{
"vesselClassId": string,
"vesselServiceLegs": [
{
object ( |
فیلدها | |
---|---|
vesselClassId | شناسه کلاس کشتی که سرویس را انجام می دهد. |
vesselServiceLegs[] | برای یک سرویس کشتی معتبر، ویژگی های زیر برقرار است: 1. نمی تواند خالی باشد. 2. مقصد PortId و OriginalPortId پاهای متوالی باید مطابقت داشته باشند (از جمله برای آخرین و اولین پا). |
VesselServiceLeg
یک پا سرویس کشتی.
نمایندگی JSON |
---|
{ "legCandidateId": string, "originDepartureTime": { object ( |
فیلدها | |
---|---|
legCandidateId | شناسه نامزد پا اختصاص داده شده است. |
originDepartureTime | زمان حرکت در بندر مبدا در برنامه هفتگی. |
destinationArrivalTime | زمان رسیدن به بندر مقصد در برنامه هفتگی. |
ScheduleTime
یک زمان برنامه (حرکت کشتی/تقاضا/ورود) در یک فرکانس هفتگی در یک ساعت معین تعریف می شود.
نمایندگی JSON |
---|
{ "day": string, "hourOfDay": integer } |
فیلدها | |
---|---|
day | روز بر اساس برنامه روز 0 اولین روز ممکن است. |
hourOfDay | ساعت روز از زمان برنامه باید یک عدد صحیح بین 0 تا 23 باشد. |
CommodityDemandPath
خدمات و بنادر متفاوتی که کسری از تقاضای یک کالای معین دریافت می کند. شاخص های استفاده شده در زیر بر اساس ترتیب خدمات کشتی در پاسخ و ترتیب خدمات در خدمات کشتی جداگانه است.
نمایندگی JSON |
---|
{
"commodityDemandId": string,
"containerCount": string,
"vesselServiceLegIds": [
{
object ( |
فیلدها | |
---|---|
commodityDemandId | شناسه تقاضای کالا برآورده شد. |
containerCount | تعداد کانتینرهایی که از این مسیر عبور می کنند. برای هر تقاضای کالا، کل مقدار برآورده شده نمی تواند از کل تقاضا بیشتر شود. |
vesselServiceLegIds[] | لیست شناسه های پای سرویس کشتی که از این مسیر طی شده است. برای یک مسیر تقاضای کالای معتبر، ویژگیهای زیر برقرار است: 1. DeparturePortId مرحله اول باید با originPortId تقاضای کالا مطابقت داشته باشد. 2. مقصد آخرین مرحله، PortId باید با destinationPortId تقاضای کالا مطابقت داشته باشد. 3. ورودPortId و DeparturePortId پاهای متوالی باید مطابقت داشته باشند. 4. اگر برای این تقاضای کالا پیش بینی شده باشد، حداکثر زمان ترانزیت باید بیشتر یا مساوی از کل طول مسیر باشد. |
VesselServiceLegId
تک پایه خدمات کشتی مورد استفاده در مسیر تقاضای کالا. به عنوان مثال، در نظر بگیرید که دو سرویس کشتی وجود دارد. اولی از سه پایه (با نمایه 0، 1 و 2) و دومی دو (با نمایه 0 و 1) ساخته شده است. علاوه بر این، اولین پا از سرویس اول به بندر خروجی قسمت دوم سرویس دوم می رسد. یک مسیر کالا متشکل از سه شناسه پای سرویس کشتی زیر: {vesselServiceIndex: 0، containServiceLegIndex: 2} {vesselServiceIndex: 0، containServiceLegIndex: 0} {vesselServiceIndex: 1، containsServiceLegIndex: سرویس کشتی (توجه داشته باشید که 2 و 0 متوالی هستند زیرا هر سرویس یک چرخه است)، سپس به سرویس کشتی 1 برای یک پا منتقل می شود.
نمایندگی JSON |
---|
{ "vesselServiceIndex": integer, "vesselServiceLegIndex": integer } |
فیلدها | |
---|---|
vesselServiceIndex | فهرست خدمات کشتی |
vesselServiceLegIndex | نمایه ساق پا از سرویس کشتی نمایه شده توسط |