そこで、思いついた(理論上の)解決策を書き留めることにしました。部分的にはそれが私を助けるかもしれないからです(これについては以下を参照してください)そして部分的には興味のある人にとってまともな解決策を持っているからです. これは、シンプレックス アルゴリズムを使用して解くことができる線形方程式のシステムです。
私が思いついた制約は次のとおりです。
1) すべてのオブジェクトが正確に 1 つのクラスター内にある
2) すべてのクラスターには、最大で M (定数) 個のオブジェクトがあります
3) クラスタ内の少なくとも 1 つのオブジェクトでそのディメンションが true に設定されている場合、そのクラスタのディメンションは true です。
制約がどのように適用されるかを説明します。
n 個のオブジェクトと k 個のクラスターがあるとします。合計を検討します(以下では、これは1行です)
x 1 1 + x 2 1 + x 3 1 + ... + x n 1 + d 1 1 + d 2 1 + d 3 1 + ... + d n 1 +
x 1 2 + x 2 2 + x 3 2 + ... + x n 2 + d 1 2 + d 2 2 + d 3 2 + ... + d n 2 +
...
x 1 k + x 2 k + x 3 k + ... + x n k + d 1 k + d 2 k + d 3 k + ... + d n k
どこ
オブジェクト a が int クラスタ c の場合、 x a cは true
クラスター c の次元 b が true の場合、 d b cは true
オブジェクトをクラスター化することは常に良い (または少なくとも有害ではない) ため、クラスターの数はceil(オブジェクトを M で割った値)であることがわかっています。簡単にするために、ここでは変数を省略し、係数のみを記述します。
1)すべてのオブジェクトが正確に 1 つのクラスター内にある
10...0 0...0 10...0 0...0 10...0 0...0 ... 10...0 0...0 = 1
010...0 0...0 010...0 0...0 010...0 0...0 ... 010...0 0...0 = 1
...
0..01 0...0 0...01 0...0 0...01 0...0 ... 0...01 0...0 = 1
これにより、すべてのオブジェクトが厳密に 1 つのクラスターに配置されます。これにより、理論的には、オブジェクトが複数のクラスター内のパーツ (<1) を持つことが可能になります。しかし、最適なソリューションを探しているため、これは起こりません。
2)すべてのクラスターには、最大で M (定数) 個のオブジェクトがあります
11...1 0...0 0...0 0...0 0...0 0...0 ... 0...0 0...0 <= M
0...0 0...0 11...1 0...0 0...0 0...0 ... 0...0 0...0 <= M
...
0...0 0...0 0...0 0...0 0...0 0...0 ... 11...1 0...0 <= M
オブジェクトの合計は M より大きくありません。この制約は明確です。
ここでトリッキーな部分が来ます:
3)クラスタ内の少なくとも 1 つのオブジェクトでそのディメンションが true に設定されている場合、そのクラスタのディメンションは true です。
すべての次元とすべてのクラスターについて、この次元が true に設定されている要素を考慮します (false も考慮することができますが、それらは重要ではありません)。それらのそれぞれ (および各クラスター) に対して行を記述します。
0..010...0 -10...0 0...0 0...0 ... 0...0 0...0 <= 0
ここで、1 はこのオブジェクト (このクラスター内) のこのディメンションが true に設定されていることを示し、-1 はディメンション (この場合は最初のディメンション) を識別します。オブジェクトがこのクラスターに設定されている場合、このクラスターの次元は 1 (1*1 -1*d <= 0) である必要があり、設定されていない場合、次元はゼロ (0*1 - 1*d < = 0)。
最初のクラスターの 2 番目の次元の場合、これは次のようになります。
0..010...0 0-10...0 0...0 0...0 ... 0...0 0...0 <= 0
最後のクラスターと最後の次元はこのように
0...0 0...0 0...0 0...0 ... 0..010..0 0...0-1 <= 0
これで、x a cの合計を最小化するだけで完了です。
これはおそらくより良い方法で書き留めることができますが、理解できることを願っています。
問題は次のとおりです。70 個のクラスター、3000 個のオブジェクト、2300 個のディメンションを使用しています。上記のアプローチを使用すると、371000 個の変数 (クラスター * オブジェクト + クラスター * ディメンション) と 1292095 行 (行をオブジェクト + クラスター + ディメンション * ログ (オブジェクト) * クラスターとして推定) になります。
私は、最適な解決策は実現可能ではないと信じがちです。ここで説明するアプローチを最適化できたとしても、同様のアプローチがはるかに優れたパフォーマンスを発揮する可能性は低いです。だから今、私は良い概算を探しています.この問題に取り組む方法についてのアイデアは大歓迎です.
ありがとうございました :)