Loading AI tools
Из Википедии, свободной энциклопедии
Задача о марьяже или задача о стабильных браках[1] — математическая задача из области кооперативных игр. Требуется найти стабильные соответствия между элементами двух множеств, имеющих свои предпочтения. В более простой формулировке: составить брачные пары из женихов и невест таким образом, чтобы мужа из одной семьи и жену из другой не тянуло друг к другу сильнее, чем к своим законным супругам[2]. Решение задачи отмечено Нобелевской премией по экономике 2012 года.
Решение задачи было описано в 1962 году математиками Дэвидом Гэйлом и Ллойдом Шепли[3]. Набор правил, следование которым всегда приводит к образованию стабильных пар, получил название алгоритма Гэйла — Шепли или «алгоритма отложенного согласия».
Множество практических механизмов на основе алгоритма Гэйла — Шепли разработал нобелевский лауреат Элвин Рот. Эти механизмы были внедрены в деятельность больниц по набору врачей[4] и интернов[5], в правила многих американских профессиональных спортивных ассоциаций по набору спортсменов в команды[6]. В соответствии с предложенными институциональными механизмами фирмы набирают на стажировку сотрудников[7], суды нанимают секретарей[8], родители находят подходящие школы для детей[9]. Модель марьяжа в целом описывает последовательность действий индивидов при формировании пар на «рынках попутчиков» для совместных поездок, в некоторых видах спорта (парное фигурное катание, спортивные танцы), поведение участников в интерактивных реалити-шоу и пр.[10]
Задачу можно сформулировать следующим образом:
Пусть даны два множества M и Ж, причём для каждого элемента из М элементы из Ж отсортированы в некотором порядке. То есть мы можем говорить, какие элементы Ж для данного элемента m из М являются более предпочтительными, а какие менее. Сортировки, конечно же, для каждого элемента могут быть свои. Аналогичные предпочтения введены и для элементов из Ж. Суть задачи сводится к разбиению M и Ж на пары. В каждую пару берется по одному элементу из M и из Ж. При этом в результате мы должны получить не просто разбиение, а так называемое стабильное разбиение. Стабильность — общее понятие для теории игры, которое в данном конкретном случае означает, что отсутствуют пары (m, ж) и (m', ж'), обладающие таким свойством: для m элемент ж' является предпочтительнее ж, а для ж' элемент m является предпочтительнее m'.
— Андрей Коняев. Давай поженимся. // Lenta.ru 15.10.2012
Существует конструктивный метод нахождения одного из решений задачи.
Максимальное количество шагов для реализации алгоритма: шагов, где — число мужчин и женщин[11].
В результате невозможно завести новый брак — если у мужчины А в списке есть женщина Б и наоборот, хотя бы один женится. Соответственно, если списки полные, женятся все мужчины или выходят замуж все женщины.
Аналогично женщины могут ходить по мужчинам. Совпадают ли получившиеся браки? Не обязательно, и контрпример прост. Пусть есть два мужчины и две женщины. Андрей предпочитает Веру, Борис — Галю. Женщины наоборот — Вера Бориса, Галя Андрея (но и на другом жениться или выйти замуж за другого все четверо не прочь). Если мужчины ходят по женщинам — Андрей женится на Вере, Борис на Гале. Если женщины по мужчинам — Андрей на Гале, Борис на Вере.
При этом, если мужчины делают предложения женщинам, мужчины получат самый лучший для себя результат из всех устойчивых паросочетаний: не существует устойчивого паросочетания, чтобы все мужчины оказались в том же или лучшем положении. Мало того, алгоритм слабо стоек к мужским коалициям: несколько мужчин не могут скоординированно изменить списки предпочтения, чтобы путём эксплуатации этого алгоритма строго улучшить результат всем членам коалиции[12]. Улучшить хотя бы одному и не ухудшить остальным коалиция иногда способна[13].
Для женщин результат, наоборот, будет наихудшим: не существует устойчивого паросочетания, чтобы все женщины оказались в том же или худшем положении. Алгоритм не стоек к женским коалициям: если в предыдущем примере Вера откажется от Андрея, а Галя от Бориса, женщины найдут себе оптимальную пару.
Пример на языке Си:
#include"conio.h"
#include"stdio.h"
int make_offer(int);
const int n = 5 + 1; // dlya matritsy 5x5
int mass_index[n]; //massiv tekuschego indeksa muzhchin
int mass_offer[n]; // massiv tekuschih predlozheniy zhenschin
int massA[n][n],massB[n][n];
int global_i;
void main(){
int i,j,offer,count,count_0=0;
for (i=1;i<n;i++){mass_index[i] = 1; mass_offer[i] = -1;};
FILE *f;
f = fopen("input.txt","r");
for (i=1; i<n; i++)
for (j=1; j<n; j++)
fscanf(f,"%d", &massA[i][j]);
for (i=1; i<n; i++)
for (j=1; j<n; j++)
fscanf(f,"%d", &massB[i][j]);
fclose(f);
global_i = 1;
int x;
while (count_0 != n-1){
x = make_offer(global_i);
if (x == 0){
count_0++;
global_i = count_0 + 1;
}
else global_i = x;
}
for (i=1; i<n; i++)
printf("%d - %d \n", i, mass_offer[i] );
getch();
}
int make_offer(int count){
int offer, i;
offer = massA[count][mass_index[count]];
if (mass_offer[offer] == -1){
mass_offer[offer] = count;
return 0;
}
else{
for (i=1; i<n; i++){
if ((massB[offer][i] == mass_offer[offer]) | (massB[offer][i] == count))
if (massB[offer][i] == mass_offer[offer]){
mass_index[count]++;
return count;
}
else{
int x = mass_offer[offer];
mass_index[mass_offer[offer]]++;
mass_offer[offer] = count;
return x;
}
}
}
}
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.