Saya ingin menulis sebuah program sederhana yang menerima satu set jendela (lebar + tinggi) dan resolusi layar dan menampilkan pengaturan dari jendela-jendela tersebut di layar sedemikian rupa sehingga windows mengambil ruang paling besar. Oleh karena itu dimungkinkan untuk mengubah ukuran jendela, sambil mempertahankan output size >= initial size
dan aspek rasio. Jadi untuk jendela , saya ingin algoritma mengembalikan tuple .
Saya percaya ini mungkin variasi dari 2D Knapsack. Saya sudah mencoba memeriksa hasil di web tetapi kebanyakan dari mereka memiliki banyak latar belakang (dan tidak ada implementasi) yang menyulitkan saya untuk mengikuti.
Saya kurang tertarik pada algoritma tercepat yang mungkin, tetapi lebih pada sesuatu yang praktis untuk kebutuhan spesifik saya.
sumber
Jawaban:
Meskipun pertanyaan Anda tidak mengatakannya, saya berasumsi bahwa Anda tidak ingin windows tumpang tindih.
Salah satu pendekatan untuk masalah ini adalah dengan menggunakan pemecah kendala seperti Choco . Seseorang cukup menuliskan batasan-batasan yang menyandikan masalah Anda, menyetel pemecah untuk bertindak dengan cara yang cerdas, dan kemudian membiarkannya berjalan. Ini berarti bahwa semua pemikiran yang perlu Anda lakukan akan dihabiskan untuk menemukan cara pengkodean masalah yang baik, bukan merancang algoritma dan melakukan pemrograman dan penyetelan. Ini jawaban parsial untuk membantu Anda memulai.
Asumsikan bahwa ukuran layar adalah .xmax×ymax
Untuk setiap jendela, , Anda akan memiliki satu set variabel dan kendalax i , y i , h i , w iWi xi,yi,hi,wi
Sekarang Anda perlu merawat tumpang tindih jendela. Untuk setiap pasangan windows, , di mana i ≠ j , Anda akan menghasilkan kendala seperti berikut ini, yang menangkap bahwa tidak ada sudut W j muncul dalam W i . Untuk ( x , y ) ∈ { ( x j , y j ) , ( x j + w j , y j ) , ( x j , yWi,Wj i≠j Wj Wi , menghasilkan kendala:(x,y)∈{(xj,yj),(xj+wj,yj),(xj,yj+hj),(xj+wj,yj+hj)}
Kendala yang ditentukan sejauh ini hanya menggambarkan jendela non-tumpang tindih yang tidak tumpah di sisi layar, yang memenuhi beberapa batasan ukuran minimal, dan yang mempertahankan rasio aspek mereka.
Untuk mendapatkan kecocokan yang baik, Anda perlu menentukan metrik yang menangkap artinya menjadi tata letak yang baik. Satu kemungkinan adalah menganggap bahwa Anda ingin menjaga ukuran jendela kira-kira sama dan / atau bahwa Anda ingin meminimalkan "ruang putih". Saya tidak berpikir bahwa ini dapat dispesifikasikan menggunakan Choco, tetapi dimungkinkan dengan pemecahan kendala lainnya (orang lain mungkin dapat membantu di sini).
Choco memang memungkinkan seseorang untuk memaksimalkan wrt ke fungsi objektif yang ditentukan sebagai variabel tunggal. Berdasarkan ide ini, Anda dapat memaksimalkan hal berikut:
sumber
Saya mulai menulis prototipe untuk solusi brute force, yang diharapkan dapat dioptimalkan ke titik di mana itu akan praktis.
Ini bekerja kira-kira begitu:
Ada beberapa hal yang harus diperbaiki:
S.coordinates()
sangat lambat sekarang. Iterates semua poin dalamS.width x S.height
dan memeriksa apakah masing-masing berada di salah satu jendela S.S.put()
memeriksa apakah parameternya tumpang tindih dengan sisa jendela S dengan melakukan tes yang disebutkan dalam jawaban Dave. Mungkin ini bisa diperbaiki dengan menggunakan pohon interval ?S.score()
Saat ini saya mencoba untuk mencari tahu struktur data yang sesuai untuk mewakili layar dan jendelanya, ia perlu mendukung pertanyaan ini:
sumber