文献があるかどうかわからないコスト最適化のリクエストがあります。説明するのが少し難しいので、質問が長くなってしまうことをあらかじめお詫びします。
このように機能する私がアクセスしているサーバーがあります:
- リクエストはレコード (r1, ...rn) とフィールド (f1, ...fp) に対して行われます
- デカルト積 (r1, ..., rp) x (f1,...fp) のみを要求できます
- このようなリクエストに関連するコスト (時間とお金) は、リクエストのサイズに比例します。
T((r1, ..., rn)x(f1, ..., fp) = a + b * n * p
b=1
一般性を失うことなく (正規化するだけで)、コストは次のようになると仮定できます。
T((r1, ...,rn)x(f1,...fp)) = a + n * p
- ユーザーからのリクエストである、ペアのサブセットをリクエストするだけで済み
(r1, f(r1)), ... (rk, f(rk))
ます。私のプログラムは、ユーザーとサーバー (外部) の間の仲介者として機能します。このようなリクエストがたくさんあります (1 日に数万件)。
グラフィカルに、これを nxp スパース行列と考えることができます。そのために、非ゼロの値を四角形の部分行列でカバーしたいと考えています。
r1 r2 r3 ... rp ------ ___ f1 |xx| |×| f2 |x | --- ------ f3 .. ______ fn |xx| ------
持つ:
- コストが一定であるため妥当に保たれている部分行列の数
- すべての「x」は部分行列内にある必要があります
- 線形コストのため、カバーされる総面積が大きすぎてはなりません
私の問題のスパース係数を g と名付けます (可能なペアの総数に対する必要なペアの数g = k / (n * p)
. 私は係数を知っていa
ます .
明らかな観察結果がいくつかあります。
- a が小さい場合、最善の解決策は各 (レコード、フィールド) ペアを個別に要求することであり、総コストは次のようになります。
k * (a + 1) = g * n * p * (a + 1)
- a が大きい場合、最良の解決策はデカルト積全体を要求することであり、総コストは次のとおりです。
a + n * p
- 2番目のソリューションはすぐに優れています
g > g_min = 1/ (a+1) * (1 + 1 / (n * p))
- もちろん、デカルト積の順序は重要ではないため、行列の行と列を転置して、より簡単にカバーできるようにすることができます。次に例を示します。
f1 f2 f3 r1xx r2× r3xx
次のように並べ替えることができます
f1 f3 f2 r1xx r3xx r2×
そして、求める最適解がある(f1,f3) x (r1,r3) + (f2) x (r2)
- 組み合わせ論が爆発するため、すべてのソリューションを試して低コストを探すことは選択肢ではありません。
行の順列ごとに: (n!) 列の順列ごとに: (p!) nxp 行列の可能なカバーごとに: (時間は不明ですが、大きい...) カバーのコストを計算する
だから私はおおよその解決策を探しています。私はすでに、マトリックスを指定してカバーを見つけるある種の貪欲なアルゴリズムを持っています(ユニタリセルで始まり、マージ内の空のセルの割合がしきい値を下回っている場合はそれらをマージします)。
いくつかの数字を覚えておくと、私の n は 1 から 1000 の間のどこかで、私の p は 1 から 200 の間のどこかです。レコードは、要求されたフィールドが類似しているクラスにあるため、実際には「ブロック状」です。残念ながら、レコードのクラスにアクセスできません...
質問 1 : アイデア、巧妙な単純化、または有用な論文の参考文献を誰かが持っていますか? 多くのリクエストがあるので、平均してうまく機能するアルゴリズムを探しています (ただし、n と p が大きい場合に行列全体をリクエストするなど、極端なケースではうまく動作しない余裕はありません)。 、そしてリクエストは実際には非常にまばらです)。
質問 2 : 実際、問題はさらに複雑です: コストは実際には次のような形式です: a + n * (p^b) + c * n' * p'
、ここで、b は定数 < 1 です (レコードがフィールドを要求されると、他のフィールドを要求するのはそれほどコストがかかりません。フィールド) でn' * p' = n * p * (1 - g)
あり、要求したくないセルの数です (それらは無効であり、無効なものを要求するには追加コストがかかるため)。この問題を迅速に解決できるとは夢にも思いませんが、それでも...誰かアイデアはありますか?