Voyons si j'ai bien compris, les blocs marqués en rouge étaient bleus et l'algorithme a trouvé une forme en T et les a marqués en rouge, est-ce correct? Votre objectif est de trouver autant de formes en T que possible avec les mêmes blocs de couleur, corrigez jusqu'à présent j'espère. Actuellement, vous les marquez une fois que vous les avez trouvées et cela diminue l'utilité de l'algorithme (car vous pourriez manquer la solution optimale). Vous prévoyez de rechercher toutes les formes, puis de choisir celles à utiliser et celle à ne pas utiliser. Suis-je correct jusqu'à présent? Parce que vous souhaitez maximiser la quantité de blocs contenus dans les formes T lorsque l'algorithme est terminé.
Si je me trompe, ce qui suit est à mon avis la solution optimale pour votre situation.
Nous utiliserons la programmation linéaire entière.
Je crois que j'ai utilisé celui-ci dans le passé:
http://sourceforge.net/projects/lpsolve/
http://lpsolve.sourceforge.net/5.5/Java/README.html
(Vous pouvez le faire fonctionner avec de nombreux langages, je l'ai utilisé avec PHP, Java et C)
Ce que nous ferons, c'est d'enregistrer toutes les formes de T possibles sur la carte, puis d'utiliser l'ILP pour maximiser la quantité de blocs qui sont couverts. ILP est exponentiellement complexe. Compte tenu de la taille de votre planche, ce ne sera pas un problème. J'ai posé des questions min / max beaucoup plus compliquées sur les graphiques avec ILP et cela n'a pris qu'une fraction de seconde pour terminer et jusqu'à 30-90 secondes avec des centaines de sommets (dans votre cas, cela tombe en une fraction de seconde).
Ce que je recommanderais de faire:
- Trouver toutes les formes de ligne possibles
- Trouver toutes les intersections entre les formes de lignes de la même couleur
- Trouvez toutes les formes de T possibles, en recherchant toutes les intersections.
- Définissez une variable booléenne dans le problème linéaire pour chaque forme en T (
0 <= Bi <= 1
) Puisque les valeurs sont des entiers, cela laisse 0 ou 1.
- Créez les conditions pour chaque couple de formes en T qui se croisent (
Bi + Bj <= 1
)
- La fonction objectif sera (somme des blocs en forme de "T" (i) * Bi)
- Exécutez le solveur et assombrissez les formes en T où les booléens correspondants du solveur où 1 dans la solution optimale.
Ce sont des connaissances précieuses, j'ai souvent utilisé des solveurs linéaires pour des projets de travail.
ILP est fondamentalement un moyen de résoudre des problèmes de sélection où vous voulez atteindre un maximum ou un minimum pour une fonction linéaire.
Vous pouvez en savoir plus ici, en utilisant la programmation linéaire Integer et la programmation linéaire est la même pour le programmeur seulement que Integer est beaucoup plus complexe pour l'ordinateur, ce qui peut entraîner de longs temps de fonctionnement. Pas dans votre cas, c'est très simple et ne devrait prendre que moins de millisecondes dans le pire des cas.
Je suppose que vous pouvez en lire plus ici:
http://en.wikipedia.org/wiki/Integer_linear_programming#Integer_unknowns
Cela l'explique bien:
http://fisher.osu.edu/~croxton_4/tutorial/
C'est essentiellement un résolveur de problèmes de décision, comment prendre des décisions qui maximisent le résultat souhaité. Cela suppose que la fonction qui juge le résultat est linéaire, ce qui est le cas dans votre cas actuel. La fonction qui juge le résultat dans ce cas, résume les blocs pour toutes les formes en T que vous avez décidé d'assombrir.
Mathématiquement, comment définir les variables: dans notre cas actuel, les booléens (ai-je assombri la forme en T avec l'indice i ou non) aux valeurs optimales pour maximiser le résultat que nous voulons: assombrir autant de blocs que possible sans assombrir les formes en T entrecroisées. Tant que le résultat souhaité peut être calculé avec une fonction linéaire lorsque toutes les variables sont définies, il le résoudra. Dans notre cas, nous vérifions quelles formes en T nous avons assombries et additionnons les blocs qu'elles couvrent.
Je sais que ce n'est pas anodin, donc si vous choisissez de faire le saut, n'hésitez pas à commenter et je développerai.