Katakanlah saya memiliki kotak persegi panjang dengan berbagai bentuk dan warna dan saya ingin mengurangi (cukup dekat dengan optimal baik-baik saja, optimal tidak perlu) jumlah persegi panjang untuk mewakili tata letak warna yang sama.
Gambar di atas adalah kasus yang sangat disederhanakan dan spasi putih antara persegi panjang hanya untuk visualisasi - mereka benar-benar akan penuh sesak.
Apa itu nama pendekatan atau algoritma (senang Google) yang dapat membantu saya melakukan ini?
Jawaban:
Pertama, kami dapat mengonversi persegi panjang sumber Anda menjadi sel di kisi yang mendasarinya, untuk membuat input lebih seragam. (Secara efektif merasterisasi masalah)
Ini akan memungkinkan kami menemukan optimisasi yang mungkin tidak jelas ketika bekerja secara langsung dengan persegi panjang sumber - terutama ketika itu melibatkan pemisahan beberapa sumber persegi panjang untuk menggabungkannya secara berbeda.
Selanjutnya kita dapat menemukan daerah yang terhubung dengan warna yang sama, menggunakan algoritma pencarian kedalaman atau pencarian banjir. Kita dapat mempertimbangkan masing-masing daerah yang terhubung ( polyomino ) secara terpisah - tidak ada yang kita lakukan untuk wilayah yang berbeda yang perlu memengaruhi yang ini.
Secara efektif kami ingin menemukan cara untuk membedah polyomino ini menjadi persegi panjang (sayangnya sebagian besar literatur yang saya dapat temukan adalah tentang masalah yang berlawanan: membedah persegi panjang menjadi polyomino! Ini membuatnya sulit untuk mencari petunjuk ...)
Salah satu metode langsung adalah menggabungkan run horisontal dari kotak yang berdekatan menjadi persegi panjang kurus. Kemudian kita dapat membandingkan dengan baris di atas dan menggabungkan jika proses kita mulai & berakhir cocok - baik saat kita menyelesaikan setiap proses / baris, atau karena kita menganggap setiap sel untuk menambah proses saat ini.
Saya belum tahu seberapa dekat metode ini menjadi optimal. Tampaknya ia dapat mengalami sedikit masalah ketika suatu baris yang belum dianggapnya menunjukkan perpecahan yang berbeda dari baris yang terlihat sejauh ini:
Mendeteksi ketika menjalankan / persegi panjang persis ditutupi oleh berjalan di atas & di bawah, kemudian membaginya dan menggabungkan mereka akan menyelesaikan kasus khusus ini, tapi saya belum menjelajahi seberapa umum masalahnya.
Saya juga telah melihat metode di mana kita berjalan di sekeliling polyomino, dan memotong kapan saja kita menemukan sudut cekung, tetapi pendekatan ini terlihat lebih rentan kesalahan bagi saya. Mendapatkan hasil yang optimal tampaknya memerlukan pemotongan prioritas yang menggabungkan dua sudut cekung, dan bentuk yang mengandung lubang perlu penanganan khusus, sehingga metode pemindaian baris tampaknya memiliki keunggulan kesederhanaan.
Satu lagi metode yang saya lihat adalah untuk mengambil run pertama yang ditemukan di baris atas & memperpanjang sejauh yang Anda bisa. Kemudian jalankan pertama di baris atas dari apa yang tersisa ... Ini tersandung pada bentuk T terbalik, jadi itu juga tidak optimal.
Saya merasa mungkin ada cara untuk menggunakan pemrograman dinamis untuk menemukan pemisahan optimal, tetapi saya belum menemukannya.
sumber