بازگشت به یادداشت‌ها

اطفای حریق جنگل: تخصیص بهینه بالگرد و تیم به جبهه آتش

چطور با بهینه‌سازی ریاضی و CP-SAT، بالگرد، هواپیمای آب‌پاش و تیم زمینی را میان جبهه‌های آتش‌سوزی جنگل تخصیص دهیم؛ مدل ریاضی، کد پایتون و یک مثال واقعی.

اطفای حریق جنگل: تخصیص بهینه بالگرد و تیم به جبهه آتش

هر فصل خشک، ده‌ها آتش‌سوزی جنگلی هم‌زمان در نقاط مختلف شعله‌ور می‌شوند. مرکز فرماندهی آتش‌نشانی باید در عرض چند دقیقه تصمیم بگیرد. کدام بالگرد، کدام هواپیمای آب‌پاش و کدام تیم زمینی به کدام جبهه آتش اعزام شود؟ یک تصمیم اشتباه، فاصله میان مهار یک حریق کوچک و یک فاجعه منطقه‌ای است. این دقیقاً همان مسئله‌ای است که بهینه‌سازی ریاضی برای حل آن ساخته شده.

در این یادداشت، مسئله «تخصیص منابع اطفای حریق» را به زبان بهینه‌سازی ترجمه می‌کنیم. مدل ریاضی آن را می‌نویسیم و نسخه‌ای ساده از آن را با پایتون پیاده‌سازی می‌کنیم.

در عمل، این تصمیم هنوز در بسیاری از مراکز فرماندهی به‌صورت دستی گرفته می‌شود. یک هماهنگ‌کننده باتجربه، روی نقشه نگاه می‌کند و بر اساس حس و تجربه، منابع را به جبهه‌ها می‌فرستد. این روش در مقیاس کوچک جواب می‌دهد. اما وقتی ده جبهه آتش و بیست منبع هم‌زمان روی میز باشند، تعداد ترکیب‌های ممکن از توان ذهن انسان خارج می‌شود. دقیقاً همین‌جاست که یک مدل ریاضی، در چند ثانیه، بهترین ترکیب را پیدا می‌کند.

اهمیت این موضوع

آتش‌سوزی‌های جنگلی هر سال بزرگ‌تر و پرهزینه‌تر می‌شوند. تغییر اقلیم، خشکسالی و گسترش شهرها تا حاشیه جنگل‌ها این روند را تشدید کرده‌اند. در چنین شرایطی، تعداد منابع اطفای حریق همیشه محدود است. شرکتی مثل Bridger Aerospace، که ناوگانی از هواپیماهای بزرگ آب‌پاش را برای مقابله با حریق اجاره می‌دهد، دقیقاً با این چالش روبه‌روست. کدام هواپیما، به کدام آتش، در کدام ساعت اعزام شود؟ تصمیم درست می‌تواند رشد یک آتش را در همان ساعات نخست متوقف کند. در ادبیات علمی، این مرحله را «حمله اولیه» یا initial attack می‌نامند.

هر ساعت تأخیر در اعزام منابع، می‌تواند سطح آتش را چند برابر کند. از طرف دیگر، اعزام زودهنگام یک منبع گران‌قیمت به یک آتش کوچک، آن را برای یک حریق بزرگ‌تر در دسترس نمی‌گذارد. این همان مصالحه‌ای است که بهینه‌سازی باید حل کند؛ نه هر منبع برای هر آتش، بلکه بهترین ترکیب ممکن برای کل منطقه.

تعریف دقیق مسئله

فرض کنید در یک بازه زمانی، چند جبهه آتش هم‌زمان فعال هستند. هر جبهه شدتی دارد و برای مهارشدن به مقدار مشخصی «ظرفیت سرکوب» نیاز دارد. از سوی دیگر، چند نوع منبع در دسترس است: بالگرد سبک، هواپیمای آب‌پاش سنگین و تیم زمینی. هر منبع از یک پایگاه مشخص حرکت می‌کند و زمان رسیدنش به هر جبهه متفاوت است. هدف، تخصیص منابع به جبهه‌هاست؛ طوری که خسارت کل و زمان رسیدن، هر دو کمینه شوند.

برای ملموس‌تر شدن مسئله، یک مثال کوچک را در نظر بگیرید. سه جبهه آتش فعال است: یکی کوچک نزدیک جاده، یکی متوسط در دامنه تپه و یکی بزرگ نزدیک یک روستا. سه منبع هم در دسترس است: یک بالگرد سبک، یک هواپیمای آب‌پاش سنگین و یک تیم زمینی. بالگرد سبک برای جبهه کوچک کافی است، اما برای جبهه بزرگ نزدیک روستا، باید هواپیمای سنگین را اعزام کرد. تیم زمینی هم می‌تواند به جبهه دامنه تپه برسد و از گسترش آن جلوگیری کند. انتخاب این ترکیب، همان خروجی مدل بهینه‌سازی است.

این مسئله در عمل پویا هم هست. با گذشت هر بازه زمانی، برخی جبهه‌ها مهار می‌شوند و جبهه‌های تازه‌ای شکل می‌گیرند. مدل زیر نسخه یک‌دوره‌ای و پایه مسئله را نشان می‌دهد؛ همان مدلی که در هر بازه، دوباره حل و به‌روزرسانی می‌شود.

مدل‌سازی ریاضی

مجموعه FF جبهه‌های آتش فعال و مجموعه RR منابع در دسترس را در نظر بگیرید. متغیر تصمیم xrfx_{rf} برابر یک است اگر منبع rr به جبهه ff تخصیص یابد و در غیر این صورت صفر است.

xrf∈{0,1}∀r∈R, f∈Fx_{rf} \in \{0,1\} \quad \forall r \in R,\ f \in F

ظرفیت سرکوب هر منبع را با crc_r و نیاز هر جبهه را با dfd_f نشان می‌دهیم. sfs_f وزن شدت یا اولویت جبهه ff است و trft_{rf} زمان رسیدن منبع rr به جبهه ff را نشان می‌دهد. متغیر کمکی ufu_f کمبود پوشش جبهه ff را اندازه می‌گیرد.

min⁡∑f∈Fsf⋅uf  +  ∑r∈R∑f∈Ftrf⋅xrf\min \sum_{f \in F} s_f \cdot u_f \;+\; \sum_{r \in R}\sum_{f \in F} t_{rf} \cdot x_{rf}

قید پوشش تضمین می‌کند مجموع ظرفیت منابع تخصیص‌یافته به هر جبهه، به‌علاوه کمبود آن، از نیاز واقعی‌اش کمتر نباشد.

∑r∈Rcr⋅xrf+uf  ≥  df∀f∈F\sum_{r \in R} c_r \cdot x_{rf} + u_f \;\geq\; d_f \quad \forall f \in F

هر منبع فقط می‌تواند در یک بازه زمانی، به یک جبهه اعزام شود.

∑f∈Fxrf  ≤  1∀r∈R\sum_{f \in F} x_{rf} \;\leq\; 1 \quad \forall r \in R

در عمل، باید یک قید زمانی هم اضافه کرد. منبعی که زمان رسیدنش از سقف قابل‌قبول بیشتر باشد، نباید برای آن جبهه در نظر گرفته شود. این محدودیت را می‌توان ساده‌تر از همه، با حذف متغیر مربوطه از مدل اعمال کرد.

ظرفیت کار آکادمیک و پژوهشی

این مسئله بستری غنی برای پژوهش فراهم می‌کند. نسخه پویا و چنددوره‌ای آن، که در آن آتش با گذشت زمان رشد می‌کند، هنوز حوزه فعال پژوهش است. عدم‌قطعیت در سرعت باد و جهت گسترش آتش، مدل‌سازی تصادفی یا استوار را توجیه می‌کند. هماهنگی میان چند سازمان امدادی، که هرکدام منابع خودشان را دارند، خودش یک مسئله بهینه‌سازی توزیع‌شده و چندهدفه است. ترکیب این مدل با یادگیری ماشین برای پیش‌بینی رشد آتش نیز مسیر پژوهشی تازه‌ای است که در سال‌های اخیر رشد کرده.

پیاده‌سازی با پایتون

نکته مهم این است که چنین مدلی را می‌توان کاملاً با ابزارهای متن‌باز و رایگان پایتون حل کرد. نیازی به سالور تجاری گران‌قیمت نیست. OR-Tools گوگل، به‌ویژه ماژول CP-SAT آن، برای این نوع مسائل تخصیص گسسته بسیار مناسب است. ورودی مدل معمولاً یک جدول اکسل یا CSV ساده از جبهه‌های آتش و منابع در دسترس است.

اسکلت اولیه مدل در CP-SAT به این شکل است:

from ortools.sat.python import cp_model

model = cp_model.CpModel()

fires = ["F1", "F2", "F3"]
resources = ["Helicopter-A", "Tanker-B", "GroundCrew-C"]

# x[r, f] = 1 اگر منبع r به جبهه آتش f اعزام شود
x = {}
for r in resources:
    for f in fires:
        x[r, f] = model.NewBoolVar(f"x_{r}_{f}")

# هر منبع حداکثر به یک جبهه در این بازه زمانی اعزام شود
for r in resources:
    model.Add(sum(x[r, f] for f in fires) <= 1)

# ادامه قیود پوشش، کمبود و تابع هدف به همین شیوه تعریف می‌شوند

این مسئله شباهت زیادی به مسیریابی تیم‌های جست‌وجو و نجات پس از زلزله دارد. تفاوت اصلی این است که جبهه آتش، برخلاف منطقه زلزله‌زده، با گذشت زمان بزرگ‌تر هم می‌شود. همین تفاوت است که مدل تخصیص حریق را به یک مسئله پویا و تکرارشونده تبدیل می‌کند.

مدل کامل معمولاً سه بخش دیگر هم دارد که در اسکلت بالا نیامده‌اند. نخست، محاسبه زمان رسیدن هر منبع بر اساس فاصله و سرعت پرواز یا حرکت زمینی. دوم، محدودیت سوخت و خستگی خدمه که مدت ماندگاری یک منبع در میدان را محدود می‌کند. سوم، به‌روزرسانی دوره‌ای مدل با داده‌های تازه از رشد آتش، معمولاً هر پانزده تا سی دقیقه. هرکدام از این بخش‌ها را می‌توان جداگانه به مدل پایه اضافه کرد.

سوالات متداول

آیا این مدل برای آتش‌نشانی شهری هم کاربرد دارد؟

ساختار پایه مدل برای هر نوع تخصیص منبع اضطراری با ظرفیت محدود کاربرد دارد، از جمله آتش‌نشانی شهری. تفاوت اصلی در نحوه محاسبه زمان رسیدن و شدت حادثه است.

چرا باید این مسئله را با پایتون حل کرد، نه با اکسل؟

وقتی تعداد جبهه‌های آتش و منابع از چند مورد بیشتر شود، تعداد حالت‌های ممکن بسیار زیاد می‌شود. دوره مسیریابی وسایل نقلیه با پایتون نشان می‌دهد چطور چنین مسائلی را با OR-Tools در چند ثانیه حل کنیم.

اگر محدودیت‌های سازمان من با این مدل ساده فرق داشته باشد چه کنم؟

هر سازمان امدادی محدودیت‌های خاص خودش را دارد؛ از نوبت‌کاری خدمه تا محدودیت سوخت بالگرد. برای پیاده‌سازی اختصاصی این مدل روی داده‌های واقعی سازمان شما، می‌توانید درخواست مشاوره ثبت کنید.


مشاوره و ارتباط با ما

برای مشاوره و ثبت‌نام در دوره‌ها و دریافت پروژه‌ها با آیدی @pypyid در تلگرام در تماس باشید.

ارتباط در تلگرام

دوره‌های آموزشی مرتبط

مقالات و یادداشت‌های مرتبط

پروژه‌های مرتبط