Biarkan saya melihat apakah saya sudah benar, blok bertanda merah, berwarna biru dan algoritma menemukan bentuk T dan menandai mereka merah, apakah itu benar? Tujuan Anda adalah untuk menemukan sebanyak mungkin bentuk T dengan blok warna yang sama, saya harap sejauh ini. Saat ini Anda menandai mereka setelah Anda menemukannya dan itu mengurangi kegunaan algoritma (Karena Anda bisa kehilangan solusi optimal). Anda berencana mencari semua bentuk dan memilih yang mana yang akan digunakan dan mana yang tidak digunakan. Apakah saya benar sejauh ini? Karena Anda ingin memaksimalkan jumlah blok yang terkandung di dalam bentuk T ketika algoritma dilakukan.
Jika saya benar, berikut ini adalah solusi optimal untuk situasi Anda menurut saya.
Kami akan menggunakan Integer Linear Programming.
Saya percaya saya menggunakan yang ini di masa lalu:
http://sourceforge.net/projects/lpsolve/
http://lpsolve.sourceforge.net/5.5/Java/README.html
(Anda bisa menggunakannya dengan banyak bahasa, saya menggunakannya dengan PHP, Java, dan C)
Apa yang akan kita lakukan adalah mendaftarkan setiap bentuk T yang mungkin di papan tulis dan kemudian menggunakan ILP untuk memaksimalkan jumlah blok yang dicakup. ILP sangat kompleks secara eksponensial. Mempertimbangkan ukuran papan Anda, itu tidak akan menjadi masalah. Saya telah menjalankan pertanyaan min / max yang jauh lebih rumit pada grafik dengan ILP dan hanya butuh sepersekian detik untuk menyelesaikan dan hingga 30-90 detik dengan ratusan simpul (dalam kasus Anda jatuh dalam sepersekian detik).
Apa yang akan saya rekomendasikan untuk dilakukan:
- Temukan semua bentuk Garis yang mungkin
- Temukan semua persimpangan antara bentuk garis dengan warna yang sama
- Temukan semua bentuk T yang mungkin, cari semua persimpangan.
- Tentukan variabel Boolean dalam Masalah Linear untuk setiap bentuk T (
0 <= Bi <= 1
) Karena nilainya adalah bilangan bulat, yang menyisakan 0 atau 1.
- Buat kondisi untuk setiap pasangan bentuk T yang berpotongan (
Bi + Bj <= 1
)
- Fungsi obyektif adalah (jumlah blok dalam bentuk "T" (i) * Bi)
- Jalankan solver dan gelapkan bentuk T di mana Boolean (s) yang sesuai solver di mana 1 dalam solusi optimal.
Ini adalah pengetahuan yang berharga, saya sering menggunakan pemecah linear untuk proyek kerja.
ILP pada dasarnya adalah cara untuk memecahkan masalah pemilihan di mana Anda ingin mencapai maksimum atau minimum untuk beberapa fungsi linier.
Anda dapat membaca lebih lanjut di sini, menggunakan Integer Linear Programming dan Linear Programming adalah sama untuk programmer hanya bahwa Integer jauh lebih kompleks untuk komputer yang dapat mengakibatkan waktu berjalan yang lama. Tidak dalam kasus Anda, Ini sangat sederhana dan hanya membutuhkan waktu kurang dari milidetik dalam kasus terburuk.
Saya kira Anda bisa membaca lebih lanjut di sini:
http://en.wikipedia.org/wiki/Integer_linear_programming#Integer_unknowns
Ini menjelaskannya dengan baik:
http://fisher.osu.edu/~croxton_4/tutorial/
Ini pada dasarnya adalah pemecah masalah keputusan, bagaimana membuat keputusan yang memaksimalkan hasil yang Anda inginkan. Ini mengasumsikan fungsi yang menilai hasilnya linier yang dalam kasus spesifik Anda saat ini. Fungsi yang menilai hasil dalam kasus ini, meringkas blok untuk semua bentuk T yang Anda putuskan untuk digelapkan.
Secara matematis, cara mengatur variabel: dalam kasus kami saat ini Boolean (Apakah saya menggelapkan bentuk T dengan indeks i atau tidak) ke nilai optimal untuk memaksimalkan hasil yang kita inginkan: menggelapkan sebanyak mungkin blok tanpa menggelapkan bentuk T yang gelap. Selama hasil yang Anda inginkan dapat dihitung dengan fungsi linear ketika Anda memiliki semua variabel yang ditetapkan, itu akan menyelesaikannya. Dalam kasus kami, kami memeriksa bentuk T mana yang digelapkan dan menjumlahkan blok yang dicakupnya.
Saya tahu ini bukan hal sepele jadi jika Anda memilih untuk melakukan lompatan, jangan ragu untuk berkomentar dan saya akan menguraikan.