Bakalım doğru anladım, kırmızı işaretli bloklar maviydi ve algoritma bir T şekli buldu ve kırmızı olarak işaretledi, doğru mu? Amacınız aynı renkli bloklarla mümkün olduğunca çok T şekli bulmak, şimdiye kadar düzeliyorum. Şu anda onları bulduktan sonra işaretleyin ve bu algoritmanın kullanışlılığını azaltır (çünkü en uygun çözümü kaçırmış olabilirsiniz). Tüm şekilleri aramayı ve sonra hangilerinin kullanılacağını ve hangilerinin kullanılmayacağını seçmeyi planlıyorsunuz. Şimdiye kadar doğru muyum? Çünkü algoritma tamamlandığında T şekillerinin içinde bulunan blok miktarını en üst düzeye çıkarmak istiyorsunuz.
Doğruysam, bence durumunuz için en uygun çözüm aşağıdadır.
Tamsayılı Doğrusal Programlamayı kullanacağız.
Geçmişte bunu kullandığımı düşünüyorum:
http://sourceforge.net/projects/lpsolve/
http://lpsolve.sourceforge.net/5.5/Java/README.html
(Birçok dilde çalışmasını sağlayabilirsiniz, PHP, Java ve C ile kullandım)
Yapacağımız her olası T şeklini tahtaya kaydetmek ve daha sonra kapsanan blok miktarını en üst düzeye çıkarmak için ILP'yi kullanmaktır. ILP üstel olarak karmaşıktır. Tahtanızın boyutu göz önüne alındığında, bu bir sorun olmayacaktır. ILP ile grafikler üzerinde çok daha karmaşık min / max soruları çalıştırdım ve tamamlanması sadece bir saniyenin bir kısmını ve yüzlerce köşe ile 30-90 saniyeyi aldı (sizin durumunuzda bir saniyenin bir kısmına düşüyor).
Ne tavsiye ederim:
- Tüm olası Çizgi şekillerini bulun
- Aynı renkteki çizgi şekilleri arasındaki tüm kavşakları bulun
- Tüm kavşakları arayarak tüm olası T şekillerini bulun.
- Her T şekli için Doğrusal Problemde bir Boolean değişkeni tanımlayın (
0 <= Bi <= 1
) Değerler tamsayı olduğundan, 0 veya 1 bırakır.
- Kesişen (
Bi + Bj <= 1
) her bir T şekli için koşulları yapın
- Amaç işlevi ("T" Şeklindeki blokların toplamı (i) * Bi)
- Çözücüyü çalıştırın ve çözücünün en uygun çözümde 1 olduğu karşılık gelen Boole (ların) olduğu T şekillerini koyulaştırın.
Bu değerli bir bilgidir, iş projeleri için sıklıkla doğrusal çözücüler kullandım.
ILP temel olarak, bazı doğrusal fonksiyonlar için maksimum veya minimum ulaşmak istediğiniz seçim problemlerini çözmenin bir yoludur.
Burada daha fazla bilgi edinebilirsiniz, Tamsayı Doğrusal Programlama ve Doğrusal Programlama'yı kullanmak programcı için aynıdır, ancak Tamsayı bilgisayar için çok daha karmaşıktır ve bu da uzun çalışma sürelerine neden olabilir. Sizin durumunuzda değil, Çok basit ve en kötü durumda sadece milisaniyeden az sürmelidir.
Sanırım burada daha fazlasını okuyabilirsiniz:
http://en.wikipedia.org/wiki/Integer_linear_programming#Integer_unknowns
Bu iyi açıklıyor:
http://fisher.osu.edu/~croxton_4/tutorial/
Temelde bir karar problem çözücüdür, istediğiniz sonucu en üst düzeye çıkarmak için nasıl karar vereceğinizdir. Bu, sonucu yargılanan fonksiyonun, mevcut durumunuzda doğrusal olduğunu varsayar. Bu durumda sonucu yargılayan işlev, karartmaya karar verdiğiniz tüm T şekilleri için blokları toplar.
Matematiksel olarak, değişkenler nasıl ayarlanır: mevcut durumumuzda Booleans (T şeklini i işaretini i ile indeksledim mi, etmedim mi) istediğimiz sonucu en üst düzeye çıkarmak için: kesişen T şekillerini karartmadan mümkün olduğunca çok blok karartmak. İstediğiniz sonuç, tüm değişkenleri ayarladığınızda doğrusal bir işlevle hesaplanabildiği sürece çözecektir. Bizim durumumuzda, hangi T şekillerini kararttığımızı kontrol ediyor ve kapsadıkları blokları topluyoruz.
Bunun önemsiz olmadığını biliyorum, bu yüzden sıçramayı seçerseniz, yorum yapmaktan çekinmeyin ve ayrıntılı olarak anlatacağım.