مکانیابی اردوگاه آوارگان: ظرفیتدهی در بحران طولانی
مدلسازی ریاضی مکانیابی و ظرفیتدهی چندمرحلهای اردوگاه آوارگان در بحرانهای طولانیمدت، با فرمولبندی MILP و پیادهسازی در پایتون.
وقتی یک بحران انسانی چند هفته طول میکشد، یک چادر موقت دیگر کافی نیست. آوارگان باید ماهها یا حتی سالها در یک مکان بمانند. این یعنی اردوگاه باید آب، بهداشت، آموزش و درمان پایدار داشته باشد. سوال اصلی این است: کدام نقطه را برای اردوگاه انتخاب کنیم؟ و با چه ظرفیتی آن را بسازیم و چطور طی زمان توسعه دهیم؟ اینها دقیقاً همان سوالهایی هستند که بهینهسازی ریاضی برای آنها ساخته شده است.
چرا این مسئله با پناهگاه اضطراری فرق دارد
پناهگاه اضطراری معمولاً برای چند روز یا چند هفته باز میشود. جمعیت آن از ابتدا تقریباً مشخص است و رو به کاهش میرود. اردوگاه آوارگان داستان دیگری دارد. جمعیت آن در ابتدا کم است و طی ماهها و حتی سالها رشد میکند. گاهی اردوگاه باید در چند مرحله و با سرمایهگذاری تدریجی توسعه یابد. به همین دلیل، یک تصمیم ثابت در روز اول کافی نیست؛ باید برای چند دوره زمانی پشتسرهم برنامهریزی کرد.
این تفاوت، مسئله را از یک مکانیابی تسهیلات ساده به یک مسئله چندمرحلهای با قید رشد تبدیل میکند. مکانیابی پناهگاه اضطراری، که در یادداشت دیگری دربارهٔ تخلیه پیش از بلایا بررسی شده، به یک تصمیم تکدورهای بسنده میکند. اینجا باید علاوه بر مکان، مسیر رشد ظرفیت را هم در طول زمان تعیین کنیم.
اجزای مدل
برای مدلسازی این مسئله به چند مجموعه و پارامتر نیاز داریم. مجموعه مکانهای کاندید برای اردوگاه را I مینامیم. مجموعه مناطق مبدأ جمعیت آواره را J و دورههای زمانی برنامهریزی را T مینامیم. هر مکان کاندید یک سقف ظرفیت فیزیکی دارد، چون زمین و منابع آب نامحدود نیستند.
پارامترهای اصلی مدل چهار دستهاند. هزینه انتقال هر نفر از مبدأ به اردوگاه، هزینه ثابت احداث، هزینه توسعه ظرفیت، و تقاضای جمعیتی هر مبدأ. متغیرهای تصمیم هم سه دستهاند. یکی باز یا بسته بودن اردوگاه است. دیگری تخصیص جمعیت از هر مبدأ به هر اردوگاه در هر دوره. سومی میزان توسعه ظرفیت در هر دوره است.
فرمولبندی ریاضی
تابع هدف، مجموع هزینه انتقال، هزینه احداث و هزینه توسعه ظرفیت را کمینه میکند:
قید اول تضمین میکند تقاضای هر منطقه مبدأ در هر دوره کامل پوشش داده شود:
قید دوم سقف ظرفیت فعلی هر اردوگاه را رعایت میکند:
ظرفیت هر دوره از ظرفیت دوره قبل بهعلاوه توسعه همان دوره به دست میآید:
و چون بستن یک اردوگاه فعال در میانه بحران عملاً شدنی نیست، قید زیر باز بودن را در طول زمان حفظ میکند:
اهمیت این موضوع
بحرانهای آوارگی میتوانند سالها طول بکشند، نه هفتهها. برای نمونه، بحران آوارگان سوریه بیش از یک دهه ادامه داشته است. سازمانی مانند کمیساریای عالی پناهندگان سازمان ملل متحد (UNHCR) ناچار است برای چنین بحرانهایی برنامهریزی بلندمدت انجام دهد. اردوگاههایی مثل زعتری در اردن یا کوتوپالونگ در بنگلادش، طی چند سال از چند هزار نفر به صدها هزار نفر رسیدهاند.
تصمیم اشتباه در انتخاب مکان اولیه، هزینههای جابهجایی بعدی را بسیار بالا میبرد. جابهجایی صدها هزار نفر، برخلاف جابهجایی یک انبار کالا، عملاً شدنی نیست. به همین دلیل، کیفیت تصمیم اولیه در این مسئله اهمیتی چندبرابر پیدا میکند.
ظرفیت کار آکادمیک و پژوهشی
این مسئله ظرفیت پژوهشی زیادی دارد. میتوان نرخ ورود آوارگان را بهجای قطعی، تصادفی یا استوار مدل کرد. در عمل هیچکس دقیقاً نمیداند بحران فردا چقدر جمعیت جابهجا میکند. میتوان یک هدف دوم هم اضافه کرد: عدالت در فاصله اردوگاه تا نزدیکترین مرکز درمانی یا مدرسه.
جهت پژوهشی دیگر، مدلسازی رابطه دولت میزبان و سازمان امدادی است. این رابطه را میتوان یک بازی دوسطحی دانست. ایدهای مشابه آنچه در یادداشت بهینهسازی دوسطحی آمده، اما با بازیگر دولت بهجای رهبر صنعتی.
پیادهسازی با پایتون
مزیت بزرگ این مدل، حلشدن با ابزارهای کاملاً رایگان و متنباز پایتون است. نیازی به سالور تجاری گرانقیمت نیست. PuLP این مدل را بهصورت یک برنامهریزی عدد صحیح مختلط میسازد و با سالورهای متنباز مثل CBC یا HiGHS حل میکند. برای مسائل بزرگتر، سالور HiGHS معمولاً سریعتر از CBC جواب میدهد.
برای یادگیری گامبهگام چنین مدلهایی، دوره مسیریابی و زنجیره تأمین با پایتون چند مثال مشابه دارد. این مثالها مکانیابی و تخصیص منابع را پوشش میدهند.
اسکلت اولیه مدل در پایتون با PuLP این شکلی است:
import pulp
model = pulp.LpProblem("Camp_Location_Planning", pulp.LpMinimize)
camps = ["A", "B", "C"]
origins = ["J1", "J2"]
periods = [1, 2, 3]
# متغیر باز بودن اردوگاه در هر دوره
y = pulp.LpVariable.dicts("open", (camps, periods), cat="Binary")
# متغیر تخصیص جمعیت از هر مبدأ به هر اردوگاه در هر دوره
x = pulp.LpVariable.dicts("alloc", (camps, origins, periods), lowBound=0)
# تابع هدف: کمینهکردن هزینه انتقال جمعیت
model += pulp.lpSum(x[i][j][t] * 10 for i in camps for j in origins for t in periods)
# قید پوشش کامل تقاضای هر منطقه مبدأ در هر دوره
for j in origins:
for t in periods:
model += pulp.lpSum(x[i][j][t] for i in camps) == 1000
ادامه قیود ظرفیت، توسعه چندمرحلهای و هزینه احداث به همین شیوه تعریف میشوند.
سوالات متداول
چرا نمیتوان از یک مدل مکانیابی پناهگاه اضطراری معمولی استفاده کرد؟
چون آن مدل معمولاً تکدورهای است و رشد جمعیت در طول زمان را نادیده میگیرد. مدل اردوگاه آوارگان باید چند دوره زمانی و توسعه تدریجی ظرفیت را همزمان ببیند.
آیا این مدل را میتوان با داده واقعی یک بحران اجرا کرد؟
بله. با دادههای باز سازمانهای بشردوستانه میتوان پارامترهای هزینه و تقاضا را تخمین زد و مدل را در مقیاس واقعی اجرا کرد.
از کجا شروع کنم تا چنین مدلهایی را خودم بسازم؟
بهترین نقطه شروع دوره مسیریابی و زنجیره تأمین با پایتون است. این دوره مسائل مشابه مکانیابی و تخصیص منابع را از پایه آموزش میدهد.
برای پیادهسازی اختصاصی این مدل برای سازمان خودم چه کنم؟
برای تطبیق این مدل با دادهها و محدودیتهای واقعی سازمان خودتان، میتوانید مشاوره بگیرید.
مشاوره و ارتباط با ما
برای مشاوره و ثبتنام در دورهها و دریافت پروژهها با آیدی @pypyid در تلگرام در تماس باشید.