Data Scientist
  • Помогите понять код на Питоне

    Cуть проблемы: есть n множеств (некоторые возможно пересекаются), из этих n множеств надо выбрать только k, таким образом, что бы количество разных элементов в их объединении было максимальным. Тривиальный пример, A = {0, 1}, B = {1, 3}, C = {1, 2, 3}; k = 2; Решение — A, C, так как AUС = {0, 1, 2, 3}, любое другое объединения двух множеств из A,B,C вложено в AUС. Или еще пример A = {1, 2, 3}, B = {2, 4}, C = {5, 6}; k = 2; Решение A, C, так как количество разных элементов в AUC больше чем в AUB и BUC. Далее в статье приводится формальное определение задачи в терминах целочисленного линейного программирования. Далее приводится жадный алгоритм (собственно реализация похожей штуки — в шапке темы), суть — итеративно на каждом шаге выбирается такое множество, которое содержит максимальное количество элементов, которых нету в ранее выбранных множествах. Далее приводятся постановки более общих формулировок проблемы.

  • Помогите понять код на Питоне

    В общем, оно на вход принимает coverage-матрицу — probabilities, где probabilities[i][j] — это «вероятность» того, что i-й элемент «покрывает» j-й. Далее будем считать, что i-й элемент покрывает j-й, если такая вероятность >= cover_threshold. Далее итеративно на каждом шаге в качестве ev выбирается элемент, который покрывает наибольшее количество ранее непокрытых элементов и записывается в self._extreme_vectors, а в self._covered_vectors идет лист всех элементов, которые покрывает ev (включая элементы возможно покрытые ранее).

    Вот более оптимальная и понятная реализация на питоне:
    github.com/...​aster/coverage_problem.py
    Интересно было бы взглянуть на реализацию этой штуки на плюсах «в пять строк»)

    Підтримали: Serhii, anonymous