先月取り組んできた問題についてサポートが必要です。
私はドキュメントのグループを持っており、各ドキュメントには一連の一意の単語があります(Wordがドキュメントに複数回出現する場合は、1回だけカウントします)。特定の量のドキュメントについて、異なる単語の数が最も少ない最適なグループを見つけたいと思います。
たとえば、5つのドキュメントのセットがあり、それぞれに単語のセットが含まれているとします。
d1 = [ a , b, c, d, e ]
d2 = [ b , c, f ]
d3 = [ c , e, g ]
d4 = [ a , c, d ]
d5 = [ c , d, e ]
単語数が最も少ない3つのドキュメントのセットは(d1、d4、d5)になります。この3つのドキュメントのグループには、a、b、c、d、およびeのみが含まれます。
これまで私が試したのは、「最近傍」アプローチです。新しい単語の量が最も少ないドキュメントを取得します。私はそれを再帰的に制限されたブルートフォースで拡張しました。新しい単語の量が最も少ない次のn個のドキュメントを取得します。
良いセットを見つけるためのより良いアルゴリズムはありますか?最適なセットはブルートフォースによってのみ解決できることを私は知っていますが、それは明らかにここでは実行できません。
編集:「最近傍」は不十分な解決策であるという印象を持っている理由:ドキュメントのセットを拡張することにより、ドキュメントが少ない場合よりもはるかに悪い解決策が得られることがあります。理論的には、追加する新しいドキュメントの数に関係なく、同じドキュメントのセットを常に選択できます。
"でなければなりません"?ほとんどありません。これは、最適なソリューションがすべての要素の正確な特性に依存する、多くの問題の1つのように聞こえます。基本的に、ある種の局所的に最適な部分解が実際に全体的に最適な解の一部であることを証明することはおそらくできないでしょう。その場合、問題はほぼ確実にNP完全であり、したがって解決できません効率的かつ正確に。
問題のサイズによっては、混合整数計画(MIP)問題としてモデル化することをお勧めします。これらの問題を解決するために、さまざまなオープンソース(glpk、cbcを参照)または独自仕様(cplex、gurobi、xpress-mp)が存在します。
あなたの場合、それが最適なセットの一部であるかどうかを示すバイナリ変数を各ドキュメントに関連付けます。ドキュメントに関連付けられた変数の合計が、最適なグループの一部として必要なドキュメントの数と等しくなければならないことを示す制約を追加します。各単語には、線形変数を関連付けます。ドキュメントとドキュメントの一部であるWordのすべての組み合わせについて、Wordに関連付けられた変数がドキュメントに関連付けられた変数以上である必要があることを示す制約を追加します。最後に、目的関数が単語に関連付けられたすべての変数の合計であることを定義します。