バイパリットグラフ上のエッジ重みの合計で頂点値を一致させる
-
29-09-2020 - |
質問
今週私は尋ねたこの質問(レビュー):< / P>
Stackoverflowが企業の購読を開始しました 一連のタグのために月額の印象数を購入することができます。
たとえば、50000で広告を実行することに興味があるかもしれません 次のタグの印象:Javaspipt、TypeScript、React、 NextJS、NodeJS、WebPack。
スタックオーバーフロー「約束」あなたは50000印象を得るでしょう、しかし彼らは 上記のタグを越えて無料で配布することができますが、彼らは欲しい (1つのタグから100%でもすることさえできます)。
提供されたHopcroft-KARPアルゴリズムを使用して、これが成功することができた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)!
href="https://i.stack.imgur.com/tovaz.png" rel="nofollownoreferrer">
私が取り組んでいる問題は桁違いに大きいので、これはすぐに非現実的になります。
私は単位を拡大縮小することによって頂点の数を減らすことができますが、私は解像度を失い、実際には実際にはやや重要です(私は最大100倍のスケール)。
私はこれを行うためのより効率的な方法があると考えていましたが、私は基本的にすべてのユニットの頂点を複製しているので。私は重み付けされた縁と頂点値を持つ次の二人分類グラフを思いついた:
href="https://i.stack.imgur.com/fiymr.png" rel="nofollownoreferrer">
目標は、エッジの重みを調整することであるように:
- 左側では、エッジの合計はvertex の値と同じです。
- 右側には、エッジの合計は頂点 の値以下である。
私は(願っています)これはすでによく知られている問題であり、それでもよく文書化された解決策(理想的にはNP-HARDではなく)もあります。
これを働くためにHopcroft-Karpアルゴリズムを変更することさえ可能ですか。
解決
私は悪い知らせを持っています。最悪の走行時間が重み付けされたグラフのサイズの多項式であるアルゴリズムの希望はありません(P= NPがない限り、これは起こりません)。
あなたの問題は、入力がバイナリで表されたときに多項式-Timeアルゴリズムを持たないナップザック問題と同じくらい困難です(p= npの場合)。ナップザック問題は疑似相互異義時間アルゴリズムを有し、これは走行時間が数字の多項式であるアルゴリズムがあることを意味します(ただし、入力のサイズでは多項式 - 時間がない)。あなたの設定では、走行時間が(大量のエッジを持つ)が多項式であるが、重み付けされたグラフのサイズ(少数のエッジを有する)のサイズでは多項式ではないアルゴリズムに変わります。
これを整数線形計画(ILP)インスタンスとして表現してからILPソルバーで解決することができます。より効率的な解決策をもたらす可能性があります。コアのアイデアは、整数変数 $ x_ {i、j} $ を ">に含まれています。タグ $ j $ の$ i $ 。その後、問題の要件を捉えるためにいくつかの線形不等式を紹介することができます。