الگوریتم گیل–شپلی (ازدواج پایدار)
مردان به ترتیب علاقه خواستگاری میکنند و زنان همیشه بهترین پیشنهاد تا آن لحظه را نگه میدارند؛ نتیجه یک جورسازی پایدار است: هیچ دو نفری نیستند که همدیگر را به همسرشان ترجیح دهند. حداکثر n² خواستگاری.
n مرد و n زن داریم و هر کدام همهی افراد طرف مقابل را به ترتیب علاقه رتبه دادهاند. یک جورسازی ناپایدار است اگر مرد m و زن w باشند که همدیگر را به همسر فعلیشان ترجیح دهند (یک «جفت سرکش»). میخواهیم جورسازی پایدار پیدا کنیم. همین مسئله در تخصیص دستیاران پزشکی به بیمارستانها به کار میرود.
- زمان:
O(n²) - حافظه:
O(n²) - CLRS، بخش ۲۵.۲
سه مرد و سه زن. زن ۰ مرد ۰ را به خاطر مرد ۱ رها میکند و زن ۱ مرد ۲ را به خاطر مرد ۰؛ نتیجه: (۰، ۱)، (۱، ۰)، (۲، ۲). هر سطر M فهرست زنها به ترتیب علاقهی یک مرد است و هر سطر W فهرست مردها برای یک زن.
def gale_shapley(M, W):# M[m]: man m's list of women, best first; W[w]: woman w's list of men, best first. People are numbered from 0.n = len(M)for prefs in M + W:if sorted(prefs) != list(range(n)):return Nonerank = [[0] * n for _ in range(n)]for w in range(n):for i in range(n):rank[w][W[w][i]] = iwife = ["·"] * nhusband = ["·"] * nnxt = [0] * n # the next woman on each man's listfree = list(range(n))rejections = 0while free:m = free[0]w = M[m][nxt[m]]nxt[m] = nxt[m] + 1if husband[w] == "·":husband[w] = mwife[m] = wfree.pop(0)elif rank[w][m] < rank[w][husband[w]]:old = husband[w]husband[w] = mwife[m] = wwife[old] = "·"free.pop(0)free.append(old)else:rejections = rejections + 1return wife
شروع اجرا
متغیرهای محلی
نارنجی = در همین گام عوض شد
M list
W list
Call stack
- gale_shapley()خط 1
توضیح
مسئله
n مرد و n زن داریم و هر کدام همهی افراد طرف مقابل را به ترتیب علاقه رتبه دادهاند. یک جورسازی ناپایدار است اگر مرد m و زن w باشند که همدیگر را به همسر فعلیشان ترجیح دهند (یک «جفت سرکش»). میخواهیم جورسازی پایدار پیدا کنیم. همین مسئله در تخصیص دستیاران پزشکی به بیمارستانها به کار میرود.
الگوریتم (Gale و Shapley، ۱۹۶۲)
تا وقتی مرد آزادی هست، او به بهترین زنی که هنوز به او پیشنهاد نداده پیشنهاد میدهد. زن اگر آزاد است میپذیرد؛ اگر نامزد دارد، بهتر را نگه میدارد و دیگری آزاد میشود.
چرا درست است
- پایان: هر مرد به هر زن حداکثر یک بار پیشنهاد میدهد: حداکثر
n²گام. - همه جفت میشوند: زنی که پیشنهاد گرفت دیگر آزاد نمیشود؛ اگر مردی همه را امتحان کرده و آزاد مانده بود، همهی زنها نامزد بودند، که با برابر بودن تعداد ممکن نیست.
- پایداری: اگر
mزنwرا به همسرش ترجیح دهد، قبلاً بهwپیشنهاد داده وwاو را به خاطر کسی بهتر رد کرده است.
نتیجه برای پیشنهاددهندگان بهترین جورسازی پایدار ممکن است.
ورودی
سطر m از M فهرست زنها به ترتیب علاقهی مرد m است و سطر w از W فهرست مردها برای زن w؛ افراد از ۰ شمارهگذاری شدهاند.