2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки


Правила форума


Посмотреть правила форума



Начать новую тему Ответить на тему
 
 Задача о покрытии множества
Сообщение06.01.2019, 16:29 
Аватара пользователя


15/11/06
2689
Москва Первомайская
Подскажите, как решать задачу, "обратную" задаче о покрытии множества. Рассматривается система подмножеств некоторого конечного множества, покрывающая его целиком. Требуется найти минимальное подмножество этого множества, имеющее непустое пересечение с каждым элементом рассматриваемой системы.

Ничего кроме жадного алгоритма мне в голову не приходит. Но он позволяет отбросить по факту не больше 10% точек, т.е. экономия копеечная, а хочется больше.

Можно еще выбрать по одной случайной точке из каждого элемента системы в надежде, что полученное множество будет меньше исходного, что практически невероятно.

 Профиль  
                  
 
 Re: Задача о покрытии множества
Сообщение06.01.2019, 16:54 
Заслуженный участник
Аватара пользователя


09/09/14
6328
Ниже обычный для такой задачи жадный алгоритм, как я себе представляю. А какой у Вас?

Алгоритм.
1) Взять наименьшее множество из семейства и для каждой точки этого множества посчитать, скольким множествам в семействе она принадлежит.
2) Выбрать лидера первой точкой искомого множества.
3) Удалить из данного семейства все множества, содержащие выбранную точку. С полученным семейством вернуться в п.1).

В результате получим искомое множество. Если потом вернуться в начало, то можно выбрать другую точку в первом множестве и повторить. Таким образом можно организовать полный перебор, который можно оптимизировать всякими бэктрекингами и др. подобными алгоритмами. Но вообще, жадный алгоритм, по идее, должен дать за первый проход неплохой результат.

 Профиль  
                  
 
 Re: Задача о покрытии множества
Сообщение06.01.2019, 17:04 
Аватара пользователя


15/11/06
2689
Москва Первомайская
Хорошо, спасибо, попробую.

Жадный алгоритм у меня такой: на каждом шаге выбираем ту точку из числа еще не выбранных, которая покрывается наибольшим числом еще не выбранных (и удаленных затем вместе с точкой) элементов; если же эта точка не одна, то выбираем случайную из них.

 Профиль  
                  
 
 Re: Задача о покрытии множества
Сообщение06.01.2019, 17:14 
Заслуженный участник
Аватара пользователя


09/09/14
6328
geomath в сообщении #1366373 писал(а):
Жадный алгоритм у меня такой
Ну так у Вас почти то же самое. Тогда или какая-то слишком специфическая система множеств (и тогда нужно смотреть на её природу) или где-то ошибка в алгоритме. Потому как 10% экономии по Вашим словам означает, что множества практически не пересекаются между собой.

 Профиль  
                  
 
 Re: Задача о покрытии множества
Сообщение06.01.2019, 17:46 
Аватара пользователя


15/11/06
2689
Москва Первомайская
Возможно, но не думаю, что они так уж не пересекаются. Точек у меня сотни, подмножеств - сотни тысяч, где каждое состоит их десятков точек.

 Профиль  
                  
 
 Re: Задача о покрытии множества
Сообщение06.01.2019, 18:58 
Заслуженный участник
Аватара пользователя


09/09/14
6328
geomath в сообщении #1366385 писал(а):
Точек у меня сотни, подмножеств - сотни тысяч, где каждое состоит их десятков точек.
Мне странно, что Вы рассчитывали в таких условиях сэкономить намного больше 10%. И жадный алгоритм вряд ли будет хорош здесь. Должны быть специальные алгоритмы, задача наверняка рассматривалась. Но я не знаю.

 Профиль  
                  
 
 Re: Задача о покрытии множества
Сообщение06.01.2019, 19:38 
Заслуженный участник
Аватара пользователя


08/11/11
5940
Ищите по названию “Hitting set problem”.

 Профиль  
                  
 
 Re: Задача о покрытии множества
Сообщение06.01.2019, 20:20 
Аватара пользователя


15/11/06
2689
Москва Первомайская
geomath в сообщении #1366373 писал(а):
Хорошо, спасибо, попробую.
Попробовал, получил ту же экономию менее чем в 10%. Правда, получилась она в 5 раз быстрее, что уже неплохо, поскольку испытывались не все точки, а только точки наименьшего (на каждом шаге) элемента, который тоже, кстати, неединственный и поэтому выбирался случайно.

g______d в сообщении #1366402 писал(а):
Ищите по названию “Hitting set problem”.
Да, спасибо, скачал подходящую на первый взгляд статейку. Почитаю. К сожалению, задача эта для меня неосновная, вспомогательная, поэтому хотелось бы прямо здесь, не заморачиваясь, получить идею, хоть намек, как решать ее без жадности, а дальше я уж сам додумаю.

 Профиль  
                  
 
 Re: Задача о покрытии множества
Сообщение08.01.2019, 20:50 
Аватара пользователя


15/11/06
2689
Москва Первомайская
Удивительно, но ничуть не худший результат, чем с помощью жадного алгоритма, получается просто случайным перебором точек: удаляем произвольную точку из исходного множества и смотрим, пересекается ли оставшееся множество со всеми элементами покрывающей системы; если нет, то возвращаем точку обратно и продолжаем случайный перебор и, возможно, возврат еще не выбиравшихся точек, пока они не кончатся. (Это похоже на то, как если бы искали нефть, размещая скважины не по науке, а наугад, что в свое время и предлагалось одним вполне серьезным геологом.) И компьютерного времени требуется не больше, чем в первоначальном варианте жадного алгоритма.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Модераторы: Модераторы Математики, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group