Соответствующие значения вершины с суммой тяжестей края на бипартном графике

cs.stackexchange https://cs.stackexchange.com/questions/123434

Вопрос

Ранее на этой неделе я спросил Этот вопрос (пожалуйста, просмотрите): < / 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 $ ; Затем вы можете ввести несколько линейных неравенств для захвата требований проблемы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с cs.stackexchange
scroll top