Déjame ver si acerté, los bloques marcados en rojo, eran azules y el algoritmo encontró una forma de T y los marcó en rojo, ¿es correcto? Su objetivo es encontrar tantas formas de T como sea posible con bloques del mismo color, correcto hasta ahora, espero. Actualmente los marca una vez que los encuentra y eso disminuye la utilidad del algoritmo (ya que podría faltar la solución óptima). Está planeando buscar todas las formas y luego elegir cuáles usar y cuáles no. ¿Estoy en lo correcto hasta ahora? Porque desea maximizar la cantidad de bloques que están contenidos dentro de las formas T cuando el algoritmo está listo.
Si estoy en lo correcto, la siguiente es la solución óptima para su situación en mi opinión.
Utilizaremos la programación lineal entera.
Creo que usé este en el pasado:
http://sourceforge.net/projects/lpsolve/
http://lpsolve.sourceforge.net/5.5/Java/README.html
(Puede hacer que funcione con muchos lenguajes, lo usé con PHP, Java y C)
Lo que haremos es registrar cada forma de T posible en el tablero y luego usar ILP para maximizar la cantidad de bloques que están cubiertos. ILP es exponencialmente complejo. Teniendo en cuenta el tamaño de su placa, eso no será un problema. He realizado preguntas mínimas / máximas mucho más complicadas en gráficos con ILP y solo tardó una fracción de segundo en completarse y hasta 30-90 segundos con cientos de vértices (en su caso, cae en la fracción de un segundo).
Lo que recomendaría hacer:
- Encuentra todas las formas de línea posibles
- Encuentra todas las intersecciones entre formas de línea del mismo color
- Encuentra todas las formas de T posibles, buscando en todas las intersecciones.
- Defina una variable booleana en el problema lineal para cada forma de T (
0 <= Bi <= 1
) Dado que los valores son enteros, eso deja 0 o 1.
- Establezca las condiciones para cada par de formas T que se cruzan (
Bi + Bj <= 1
)
- La función objetivo será (suma de bloques en forma de "T" (i) * Bi)
- Ejecute el solucionador y oscurezca las formas T donde los booleanos correspondientes del solucionador fueron 1 en la solución óptima.
Este es un conocimiento valioso, usé solucionadores lineales a menudo para proyectos de trabajo.
ILP es básicamente una forma de resolver problemas de selección en los que desea alcanzar un máximo o un mínimo para alguna función lineal.
Puede leer más aquí, el uso de la programación lineal de enteros y la programación lineal es lo mismo para el programador, solo que Integer es mucho más complejo para la computadora, lo que puede resultar en largos tiempos de ejecución. No en su caso, es muy simple y solo debería tomar menos de milisegundos en el peor de los casos.
Supongo que puedes leer más aquí:
http://en.wikipedia.org/wiki/Integer_linear_programming#Integer_unknowns
Esto lo explica bien:
http://fisher.osu.edu/~croxton_4/tutorial/
Básicamente es un solucionador de problemas de decisión, cómo tomar decisiones que maximicen el resultado que desea. Esto asume que la función que juzga el resultado es lineal, que en su caso actual específico es. La función que juzga el resultado en este caso, resume los bloques de todas las formas T que decidió oscurecer.
Matemáticamente, cómo establecer las variables: en nuestro caso actual Booleanos (oscurecí la forma de T con índice i o no) a los valores óptimos para maximizar el resultado que queremos: oscurecer tantos bloques como sea posible sin oscurecer las formas de T que se cruzan. Siempre que el resultado que desee se pueda calcular con una función lineal cuando tenga todas las variables establecidas, lo resolverá. En nuestro caso, verificamos qué formas de T hemos oscurecido y sumamos los bloques que cubren.
Sé que esto no es trivial, así que si eliges dar el salto, siéntete libre de comentar y daré más detalles.