مسیریابی ترافیک هوایی با ممگراف

بر کسی پوشیده نیست که کنترل ترافیک هوایی (ATC) یکی از پر استرس ترین مشاغل در جهان است. کنترل کننده ها باید سریع، هوشیار و مهارت های تصمیم گیری خوبی داشته باشند. هنگام نظارت بر پروازها موارد زیادی مانند جلوگیری از برخورد و طوفان باید در نظر گرفته شود. گاهی اوقات خلبانان نیاز به فرود اضطراری دارند. پروازها با تاخیر یا لغو می شوند. بسیاری از چیزها ممکن است اشتباه پیش برود و نگه داشتن همه آنها کار دشواری است که به تیم های متخصص نیاز دارد. حتی اگر هوانوردی در طول دو قرن اخیر پیشرفت زیادی داشته است، هنوز هم در بسیاری از زمینهها جا برای پیشرفت وجود دارد. در اینجا ما به نحوه کمک به محاسبه و تجسم برخی از وظایف متداول ATC خواهیم پرداخت.
هواپیماها و نمودارها
هنگام سفر از یک فرودگاه به فرودگاه دیگر، هواپیماها از مکان های خاصی برای حرکت در آسمان استفاده می کنند. به این مکان ها نقاط بین راه گفته می شود و با مختصات آنها تعریف می شوند. هواپیماهای مدرن با استفاده از سیستم های ناوبری رادیویی مانند GPS یا VOR، این نقاط بین راه را ردیابی می کنند. هر دو فرودگاه و ایستگاههای بین راهی، مانند بسیاری از عناصر هوانوردی دیگر، دارای نامهای رمز منحصربهفرد ایکائو هستند و به همین دلیل میتوان آنها را با گرههای یک نمودار نشان داد. اگر با نمودارها و مفاهیم گراف آشنایی ندارید، می توانید در اینجا بیشتر در مورد آنها بیاموزید. به طور خلاصه، نمودارها ساختارهایی هستند که از گره هایی ساخته می شوند که نهادها و روابطی را نشان می دهند که نشان دهنده ارتباطات بین آنها هستند. با در نظر گرفتن این موضوع، بدیهی است که فرودگاه ها و ایستگاه های بین راه می توانند گره های مختلفی باشند و راه های هوایی بین آنها می تواند روابط باشد. اختصارات استاندارد فرودگاه ها و ایستگاه های بین راه به ترتیب ARP و WPT هستند و در مثال های زیر از آنها برای تعریف انواع گره های خود استفاده خواهیم کرد.
چرا آزمایشگاه ممگراف؟
پاسخ ساده است: یک نقشه یکپارچه از جهان دارد! هنگامی که گره هایی که دارای ویژگی هایی به نام “lat” و “lng” هستند در پایگاه داده بارگذاری می شوند، به موقعیت های واقعی خود در نقشه همانطور که ظاهر می شود پین می شوند. این به ما دید واضحی از مشکل می دهد، زیرا می توانیم گره ها را به عنوان نقاط ثابت روی زمین به جای اشیاء انتزاعی متحرک ببینیم. بیایید آن را امتحان کنیم!
می توانید Memgraph Lab را در صفحه دانلود ما بیابید و با دنبال کردن این راهنما شروع کنید.
پس از آماده شدن، به تب Query رفته و موارد زیر را اجرا می کنیم:
CREATE (n:ARP { id: "EGLL", lat:51.477501, lng:-0.461389});
اکنون که یک گره فرودگاه ایجاد کردهایم، میتوانیم شکل آن را روی نقشه ببینیم:
MATCH (n:ARP) RETURN n;
نقشه ما ایجاد می شود و یک گره ARP با شناسه “EGLL” را نشان می دهد که فرودگاه هیترو لندن است.
در حال بارگیری داده ها
ما به بیش از یک گره نیاز داریم تا نحوه عملکرد یک سفر با هواپیما را نشان دهیم. به جای اجرای صدها بار یک پرس و جو، می توانیم مجموعه ای از نودها و روابط از پیش ساخته شده را به پایگاه داده خود وارد کنیم. من فایلهای CSV ایجاد کردهام که حاوی اطلاعاتی درباره فرودگاههای خاص، ایستگاههای بین راه و روابط بین آنهاست.
با استفاده از این آموزش می توانیم فایل های بالا را بارگذاری کنیم و پایگاه داده گراف خود را ایجاد کنیم. همانطور که قبلا ذکر شد، فرودگاه ها گره هایی با برچسب ARP و ایستگاه های بین راه گره هایی با برچسب WPT هستند. رابطه بین دو نقطه راه راه هوایی نامیده می شود و به این صورت برچسب گذاری می شود. رابطه بین یک فرودگاه و یک ایستگاه بین راه شامل رویه های مسیر خاصی به نام SID و STAR است، بنابراین نوع رابطه SID/STAR است. روابط همچنین فاصله بین دو نقطه ناوبری را نشان می دهد. فاصله با مایل دریایی اندازه گیری می شود، زیرا این واحد اندازه گیری مطلوب در هوانوردی است. اگر داده ها به درستی وارد شده اند، اجرای پرس و جو زیر باید نتیجه مشابهی را ایجاد کند.
MATCH (n)-[r]-(m) RETURN n,r,m;
در این مورد، گره های نارنجی فرودگاه ها (ARP) و گره های بنفش نقاط بین راهی (WPT) هستند.
سفر سریعتر
فرض کنید باید از لندن به پاریس سفر کنیم. به طور خاص، از فرودگاه هیترو لندن تا فرودگاه شارل دوگل در پاریس. نموداری که قبلا بارگذاری کردهایم برای این مثال طراحی شده است، زیرا هیچ نقطه ناوبری خارج از جهت مسیریابی عمومی وجود ندارد، زیرا خلبانان و کنترلکنندگان ترافیک هوایی میدانند که هواپیما در کدام جهت باید فرودگاه را ترک کند. این به ما یک شبکه محدود اما همچنان پیچیده از نقاط ناوبری (همانطور که در پاراگراف قبل دیده شد) می دهد که قرار است هواپیما را به مقصد برساند. به طور معمول، یک خلبان مجبور نیست تمام ایستگاه های بین مسیر را دنبال کند و می تواند هواپیما را هر طور که می خواهد تا پیدا کردن ایستگاه بعدی پرواز کند، اما دنبال کردن آنها تشویق می شود، زیرا در دراز مدت بسیار ایمن تر است. ما می خواهیم سفر را تا حد امکان کوتاه کنیم تا زمان و سوخت را تلف نکنیم. ما می توانیم کوتاه ترین مسیر بین هیترو و شارل دوگل را با استفاده از پرس و جو زیر پیدا کنیم:
MATCH p = (:ARP { id: "EGLL"})-[* wShortest (e, n | e.dist_nm)]-(:ARP { id: "CDG"})
RETURN p;
ما اطلاعات بیشتری در مورد سفر می خواهیم. خلبان برای انجام سریع ترین سفر ایمن باید از کدام نقاط بین راهی پیروی کند؟
MATCH p = (:ARP { id: "EGLL"})-[* wShortest (e, n | e.dist_nm)]-(:ARP{id:"CDG"})
UNWIND (nodes(p)) AS rows
RETURN rows.id;
اگر روی Data کلیک کنیم، نتیجه را خواهیم دید. اکنون فهرستی از 17 گره (2 فرودگاه و 15 ایستگاه بین راه) داریم.
برای اینکه بفهمیم کل سفر چقدر طول می کشد، فقط باید تغییرات جزئی ایجاد کنیم:
MATCH p = (:ARP { id: "EGLL"})-[* wShortest (e, n | e.dist_nm) total_dist]-(:ARP{id:"CDG"})
RETURN total_dist;
نتیجه کل مسافت بر حسب مایل دریایی است.
فرود اضطراری
یک خلبان می تواند تصمیم بگیرد که در صورت بروز شرایطی که به آن نیاز دارد، فرود اضطراری انجام دهد. در حالی که انواع مختلفی از فرود اضطراری وجود دارد، ما فقط فرود احتیاطی را در اینجا نشان خواهیم داد زیرا سایر انواع فرود شامل فرود در فرودگاه نمی شود. فرود احتیاطی می تواند ناشی از کمبود سوخت، آب و هوای بد یا نقص جزئی باشد و در این مواقع، هدف خروج از مسیر برنامه ریزی شده و یافتن نزدیکترین فرودگاه موجود است.
فرض کنید هواپیما به تازگی از ایستگاه بین المللی BELDI عبور کرده است و باید یک فرود احتیاطی انجام دهد. از این نقطه، ما باید کوتاه ترین مسیر را برای رسیدن به یک فرودگاه در دسترس پیدا کنیم. پرس و جوی مورد نیاز ما مشابه مورد قبلی است، با این تفاوت که این بار به دنبال فرودگاه مقصد خاصی نیستیم.
MATCH p = (:WPT { id: "BELDI"})-[* wShortest (e, n | e.dist_nm) total_dist]-(:ARP)
RETURN p;
نتیجه یک نمودار با نقطه بین BELDI در وسط و مسیرهایی است که از آن به فرودگاه های مختلف منشعب می شوند.
در حالی که این یک دید کلی از تمام فرودهای احتمالی که می توانیم انجام دهیم به ما می دهد، ما باید مسیر نزدیکترین فرودگاه را پیدا کنیم. ما می توانیم این کار را با اضافه کردن یک محدودیت به پرس و جو قبلی خود انجام دهیم:
MATCH p = (:WPT { id: "BELDI"})-[* wShortest (e, n | e.dist_nm) total_dist]-(:ARP)
RETURN p, total_dist
ORDER BY total_dist ASC LIMIT 1;
ما به سرعت نزدیکترین فرودگاه موجود را پیدا کردیم و فرود اضطراری با موفقیت انجام شد.
در برخی موارد شدید، فرودگاه های نظامی ممکن است هرگونه فرود اضطراری را رد کنند، بنابراین هواپیما باید به دنبال فرودگاه هایی باشد که برای عموم باز هستند. ما می توانیم پرس و جو قبلی را با این محدودیت تغییر دهیم:
MATCH p = (:WPT { id: "BELDI"})-[* wShortest (e, n | e.dist_nm) total_dist]-(:ARP {use: "Open to the Public"})
RETURN p, total_dist
ORDER BY total_dist ASC LIMIT 1;
اکنون ما یک سفر کمی طولانی تر داریم.
یک بار دیگر، اگر میخواهیم فهرستی از نقاط راه داشته باشیم، میتوانیم پرس و جو قبلی را تغییر داده و زیر Data را بررسی کنیم:
MATCH p =(:WPT { id: "BELDI"})-[* wShortest (e, n | e.dist_nm) total_dist]-(:ARP {use: "Open to the Public"})
RETURN nodes(p)
ORDER BY total_dist ASC LIMIT 1;
طوفان گریز
اگرچه بیشتر هواپیماهای مدرن برای مقاومت در برابر شرایط طوفانی طراحی شده اند، اما بهتر است از برخی آب و هوای دشوار اجتناب شود. در طول پرواز، خلبانان می توانند از ATC درخواست به روز رسانی آب و هوا کنند یا می توانند طوفان های آینده را از طریق فناوری رادار آب و هوا دریافت کنند. در بیشتر موارد، می توان از یک منطقه خطرناک بدون دور شدن بیش از حد از مسیر تعیین شده فرار کرد، اما گاهی اوقات لازم است که منطقه به طور کامل دور شود. در آن صورت، یک خلبان ممکن است از ATC بخواهد که از مسیر منحرف شود. به جای اینکه کنترلرها مجبور شوند مسیر دیگری را بررسی کنند، می توانیم به آزمایشگاه ممگراف اجازه دهیم این کار را برای ما انجام دهد.
اگر خلبان هنگام پرواز بر فراز ایستگاه بین راهی TOMMO، اطلاعاتی از ATC دریافت کند که طوفان های خطرناک در نزدیکی ایستگاه های بین راهی ACORN، BEXIL و TMA18 قرار دارند، چه؟ او باید از این مکان ها اجتناب کند و در عین حال سفر را تا حد امکان کوتاه می کند. بیایید ویژگی آب و هوای این ایستگاه های بین راه را تغییر دهیم.
MATCH (n:WPT { id: "ACORN"})
SET n.weather = "dangerous”
برای دو نقطه دیگر نیز همین کار را انجام می دهیم. اکنون باید کوئری کوتاهترین مسیر را دوباره اجرا کنیم، اما این بار باید a را اضافه کنیم فیلتر لامبدا فقط مسیرهایی را بدون آب و هوای خطرناک در نظر بگیرید.
MATCH p = (:WPT { id: "TOMMO"})-[* wShortest (e, n | e.dist_nm) total_dist(e, n | n.weather="normal")]-(:ARP {id: "CDG"})
RETURN p, total_dist;
ما مسیر جدیدی را که خلبان باید طی کند پیدا کرده ایم.
تجسم با ویرایشگر سبک
با استفاده از اسکریپت سبک، میتوانیم تصاویر نمودارهای خود را سفارشی کنیم و دادهها را در نگاه اول قابل درکتر کنیم. هنگامی که روی ویرایشگر سبک کلیک می کنیم، متوجه می شویم که قبلاً چند سبک اعمال شده است:
چگونه می توانیم از Style Editor برای روشن کردن نمودار خود به شیوه ای هوشمندانه استفاده کنیم؟ بیایید به مثال قبلی خود در مورد طوفان نگاه کنیم. ما میتوانیم تمام ایستگاههای بین راه را با آب و هوای خطرناک قرمز رنگ کنیم و آنها را بزرگ کنیم تا احتیاط کنیم.
@NodeStyle Equals(Property(node, "weather"), "dangerous") {
color: red
color-hover: Darker(red)
size: 30
}
پس از کلیک بر روی Apply، نمودار ما باید به شکل زیر باشد:
در مورد لبه ها چطور؟ ما میتوانیم تمام لبههایی که از روشهای SID و STAR استفاده میکنند را به رنگ نارنجی رنگ کنیم تا برجستهتر شوند.
@EdgeStyle Equals(Type(edge), "SID/STAR") {
color: orange
width: 200
}
اگر بخواهیم ببینیم کدام راه های هوایی طولانی تر از 50 مایل دریایی است چه؟ بیایید آنها را سرخابی رنگ کنیم.
@EdgeStyle And(Equals(Type(edge),"AIRWAY"),Greater(Property(edge,"dist_nm"),50)) {
color: magenta
width: 200
}
امکانات بی پایان هستند. میتوانید هر چقدر که دوست دارید با ویرایشگر سبک بازی کنید و نمودار خود را منحصربهفرد جلوه دهید.
نتیجه
چیزهای زیادی وجود دارد که می توان در هوانوردی مانند هر صنعت مدرن دیگری بهینه سازی کرد. یک شبکه بزرگ از نقاط ناوبری یک ساختار گراف کلاسیک است و به همین دلیل از استفاده از پایگاه داده گراف سود زیادی می برد. ما برخی از عملکردهای اساسی Memgraph Lab را بررسی کردهایم تا نشان دهیم چگونه میتوان از ویژگیهای آن برای دستکاری دادهها با تأکید بر سرعت، نمایش بصری و سهولت درک استفاده کرد. اگر احساس خلاقیت میکنید، میتوانید سناریوهای پرواز خود را بیاورید و آنها را امتحان کنید. آسمان حد است!