赤くマークされたブロックが正しいかどうかを見てみましょう。赤のブロックは青で、アルゴリズムはT形を見つけて赤のマークを付けましたが、正しいですか?あなたの目標は、同じ色のブロックでできるだけ多くのT形を見つけることです。現在、それらを見つけたら、それらをマークアウトし、アルゴリズムの有用性を低下させます(最適なソリューションが見つからない可能性があるため)。すべての形状を検索し、使用するものと使用しないものを選択することを計画しています。これまでのところ正しいですか?アルゴリズムが完了したときに、Tシェイプ内に含まれるブロックの量を最大化したい場合。
私が正しければ、以下はあなたの状況に最適な解決策だと思います。
整数線形計画法を使用します。
私は過去にこれを使用したと思います:
http://sourceforge.net/projects/lpsolve/
http://lpsolve.sourceforge.net/5.5/Java/README.html
(あなたはそれを多くの言語で動作させることができます、私はそれをPHP、Java、Cで使用しました)
ボード上で可能なすべてのTシェイプを登録し、ILPを使用してカバーされるブロックの量を最大化します。ILPは指数関数的に複雑です。ボードのサイズを考慮すると、それは問題にはなりません。私はILPを使用したグラフではるかに複雑な最小/最大の質問を実行しましたが、完了するまでに数分の1秒しかかかりませんでした。数百の頂点を使用した場合、最大30〜90秒でした(あなたの場合、それは数分の1秒に該当します)。
私がお勧めすること:
- 可能なすべてのライン形状を見つける
- 同じ色のライン形状間のすべての交点を見つける
- すべての交差点を検索して、可能なすべてのT形状を見つけます。
- 各T形状の線形問題でブール変数を定義します(
0 <= Bi <= 1
)値は整数であるため、0または1のままになります。
- 交差するT形状の各カップルの条件を作成します(
Bi + Bj <= 1
)
- 目的関数は( "T"形状のブロックの合計(i)* Bi)
- ソルバーを実行し、ソルバーの対応するブール値が1であるT形状を、最適解で1に暗くします。
これは貴重な知識です。私は作業プロジェクトに線形ソルバーをよく使用しました。
ILPは基本的に、ある線形関数の最大値または最小値を達成したい場合の選択問題を解決する方法です。
あなたはここでもっと読むことができます、整数線形プログラミングの使用と線形プログラミングはプログラマにとって同じですが、コンピュータにとって整数ははるかに複雑であり、実行時間が長くなる可能性があります。あなたのケースではありません、それは非常にシンプルで、最悪の場合でもミリ秒未満しかかかりません。
ここでもっと読むことができると思います:
http://en.wikipedia.org/wiki/Integer_linear_programming#Integer_unknowns
これはそれをうまく説明しています:
http://fisher.osu.edu/~croxton_4/tutorial/
それは基本的に意思決定問題ソルバーであり、あなたが望む結果を最大化する決定をする方法です。これは、結果を判断する関数が特定の現在のケースでは線形であると想定しています。この場合の結果を判断する関数は、暗くすることを決定したすべてのT形状のブロックを合計します。
数学的には、変数を設定する方法:現在のケースでは、ブール値(インデックスiでTシェイプを暗くしたかどうか)を最適な値に設定して、必要な結果を最大化します:交差するTシェイプを暗くせずに、できるだけ多くのブロックを暗くします。必要な結果が線形関数で計算できる限り、すべての変数が設定されていれば解決できます。この例では、暗くしたT形をチェックし、それらがカバーするブロックを合計します。
これは些細なことではないことを知っているので、もしあなたが飛躍することを選んだら、気軽にコメントしてください、そして私は詳しく説明します。