Соответствующие значения вершины с суммой тяжестей края на бипартном графике
-
29-09-2020 - |
Вопрос
Ранее на этой неделе я спросил Этот вопрос (пожалуйста, просмотрите): < / P >.
Представьте себе, что Stackoverflow начал предлагать подписку, где компании может купить x количество впечатлений в месяц для набора тегов.
Например, вас могут быть заинтересованы в запуске AD с 50000 Впечатления на следующих тегах: Javascip, Teadncript, Rect, Nextjs, Nodejs, WebPack.
Stackoverflow «Обещания» вы получите 50000 показов, но они Бесплатно распространять их через вышеупомянутые теги, однако они желают (может даже быть на 100% до одной теги).
Один из предусмотренных решений предложил использовать алгоритм Hopcroft-Karp, который я мог успешно успешно реализовать.
Однако у меня проблемы с расширением этого решения для работы в случае моего использования. Шея бутылки на самом деле в настройке графика более-так, чем производительность алгоритма.
Проблема - это массивное количество ребер, которое необходимо инициализировать. Возьмите пример ниже:
==Inventory==
Tag Units
javascipt 2
typescript 4
react 3
nextjs 3
== Subscriptions ==
Account Units Tags
Acme 7 javacript, typescript, react, nextjs
Stark 4 javacript, typescript
.
Если мы создадим вершину для представления каждого устройства, то мы получим график, который имеет 101 ребра (7 * 11 + 4 * 6)!
Проблема, над которой я работаю, - это порядки больше, поэтому это быстро становится нереальной.
Как предложить, я могу уменьшить количество вершин, путем масштабирования блоков, но я теряю разрешение, и это на самом деле несколько важно в этом случае (я могу, возможно, масштабировать на 100x max).
Я думал, что должен быть более эффективный способ сделать это, так как я по сути, дублируя вершину для каждого устройства. Я придумал следующий двусторонний график с взвешенными краями и значениями вершины:
Цель будет настроить вес краев, чтобы:
- .
- слева, сумма ребер равна значению вершины
- справа, сумма ребер меньше или равна значению вершины
Ниже приведен пример одного из решений:
Решение
У меня плохие новости. Нет надежды на алгоритм, чье худшее время работы - многочлена в размере взвешенного графа (если p= np, который кажется маловероятным).
Ваша проблема столь же сложна, как проблема knaxackack, которая не имеет алгоритма многонового времени (если P= NP), если вход представлен в двоичном режиме. Проблема KNASSACK имеет псевдополинный алгоритм времени, что означает, что есть алгоритм, которое время работы которого является многочлена в числах (но не полиномиальное время в размере ввода). В вашей настройке, который превращается в алгоритм, чье время работы представляет собой многочлен в размере невзвешенного графа (с огромным количеством краев), но не полиномиальным в размере взвешенного графа (с небольшим количеством краев).
Вы можете попробовать выразить это в качестве экземпляра Integer Linear Programming (ILP), а затем решить с помощью Solver ILP. Возможно, что может дать более эффективное решение. Основная идея состоит в том, чтобы ввести целочисленную переменную $ x_ {i, j} $ , который подсчитывает количество впечатлений, предоставляемых компании $ i $ в теге $ j $ ; Затем вы можете ввести несколько линейных неравенств для захвата требований проблемы.