問題:サイズ m*n の 2D グリッドをセット S の文字で埋めて、結果のグリッド内の個別のサブマトリックスの数が特定の数 k に近くなるようにする必要があります。この質問はhttp://www.codechef.com/JULY14/problems/GERALD09
から派生したものです
制限:
1<=n,m<16
1<=k <=m*n*m*n
|S|=4
制限時間=0.1 秒
仮定: 2 つのサブマトリックスは、次元が同じでない場合、または対応する位置の少なくとも 1 組の文字が一致しない場合、区別されます。
私のアプローチ:許容可能な解決策が見つかっている間、ランダムなグリッドとループから開始し、各反復で、現在の状態に応じてランダム性を増減できます (ただし、局所最適状態にとどまる可能性があります)。
しかし、問題は、サブグリッド内の異なるサブマトリックスの数を計算する効率的な方法がわからないことです。かなり高速なカウントのためにハッシュを試みました ( O(n 2 m 2 ) *生成/検索のコストサブグリッドのハッシュ値)。しかし、このアプローチはハッシュ値の衝突のために正確な答えを与えません.@Vaughn Catoのコメントを使用して修正した後でも、最適な状態を見つけるために15〜25回の反復を実行できますが、それでは十分ではありません.
最近、シミュレーテッド アニーリングを使用して、この種の問題を解決できることを知りました。
http://www.theprojectspot.com/tutorial-post/simulated-annealing-algorithm-for-beginners/6
この最適化問題を解決するための効率的なアプローチを探しています。
前もって感謝します。