Fammi vedere se ho capito bene, i blocchi contrassegnati in rosso, erano blu e l'algoritmo ha trovato una forma a T e li ha contrassegnati in rosso, è corretto? Il tuo obiettivo è quello di trovare il maggior numero possibile di forme a T con blocchi dello stesso colore, spero finora corretto. Attualmente li contrassegni una volta che li trovi e ciò diminuisce l'utilità dell'algoritmo (poiché potresti perdere la soluzione ottimale). Stai pensando di cercare tutte le forme e poi scegliere quali usare e quali non usare. Ho ragione finora? Causa si desidera massimizzare la quantità di blocchi contenuti all'interno delle forme a T al termine dell'algoritmo.
Se ho ragione, secondo me è la soluzione ottimale per la tua situazione.
Useremo la programmazione lineare intera.
Credo di averlo usato in passato:
http://sourceforge.net/projects/lpsolve/
http://lpsolve.sourceforge.net/5.5/Java/README.html
(Puoi farlo funzionare con molte lingue, l'ho usato con PHP, Java e C)
Ciò che faremo è registrare ogni possibile forma a T sulla scheda e quindi utilizzare ILP per massimizzare la quantità di blocchi coperti. ILP è esponenzialmente complesso. Considerando le dimensioni della tua tavola, questo non sarà un problema. Ho eseguito domande min / max molto più complicate sui grafici con ILP e ci sono voluti solo una frazione di secondo per completare e fino a 30-90 secondi con centinaia di vertici (nel tuo caso rientra nella frazione di secondo).
Cosa consiglierei di fare:
- Trova tutte le forme di linea possibili
- Trova tutte le intersezioni tra le forme delle linee dello stesso colore
- Trova tutte le possibili forme a T, cercando tutte le intersezioni.
- Definire una variabile booleana nel Problema lineare per ogni forma a T (
0 <= Bi <= 1
) Poiché i valori sono numeri interi, lascia 0 o 1.
- Crea le condizioni per ogni coppia di forme a T che si intersecano (
Bi + Bj <= 1
)
- La funzione obiettivo sarà (somma dei blocchi in "T" Shape (i) * Bi)
- Esegui il solutore e scurisci le forme a T in cui i corrispondenti booleani del solutore sono 1 nella soluzione ottimale.
Questa è una conoscenza preziosa, ho usato solutori lineari spesso per progetti di lavoro.
L'ILP è fondamentalmente un modo per risolvere i problemi di selezione in cui si desidera ottenere un massimo o un minimo per alcune funzioni lineari.
Puoi leggere di più qui, utilizzando la Programmazione lineare integer e la programmazione lineare è la stessa per il programmatore solo che Integer è molto più complesso per il computer e ciò può comportare lunghi tempi di esecuzione. Non nel tuo caso, è molto semplice e nel peggiore dei casi dovrebbe impiegare meno di millisecondi.
Immagino che tu possa leggere di più qui:
http://en.wikipedia.org/wiki/Integer_linear_programming#Integer_unknowns
Questo lo spiega bene:
http://fisher.osu.edu/~croxton_4/tutorial/
Fondamentalmente è un risolutore di problemi di decisione, come prendere decisioni che massimizzano il risultato desiderato. Questo presuppone che la funzione che giudica il risultato sia lineare e che nel tuo caso specifico sia. La funzione che giudica il risultato in questo caso, riassume i blocchi per tutte le forme a T che hai deciso di scurire.
Matematicamente, come impostare le variabili: nel nostro caso attuale i booleani (ho oscurato la forma a T con l'indice i o no) ai valori ottimali per massimizzare il risultato che vogliamo: oscurare il maggior numero possibile di blocchi senza oscurare le forme a T intersecanti. Finché il risultato desiderato può essere calcolato con una funzione lineare quando tutte le variabili sono impostate, lo risolverà. Nel nostro caso, controlliamo quali forme a T abbiamo oscurato e sommiamo i blocchi che coprono.
So che questo non è banale, quindi se scegli di fare il salto, sentiti libero di commentare e lo elaborerò.