Apa yang diketahui tentang kompleksitas masalah berikut:
- Diberikan: bilangan rasional .
- Output: bilangan bulat .
- Tujuan: kecilkan mana
Yaitu, kami ingin membulatkan bilangan rasional ke bilangan bulat sehingga kami meminimalkan jumlah kesalahan dalam jarak berpasangan. Untuk setiap pasangan kami ingin memiliki jarak bulat sedekat mungkin dengan jarak sebenarnya .y j - y saya x j - x saya
Motivasi: perjalanan metro yang membosankan, dan poster yang menunjukkan "lokasi" stasiun dengan resolusi satu menit waktu perjalanan. Di sini kita meminimalkan kesalahan yang dilakukan orang jika mereka menggunakan poster untuk mencari waktu perjalanan antara stasiun dan , rata-rata untuk semua pasangan .j i < j
Sebagai contoh, di sini kita dapat membaca perkiraan jarak berpasangan berikut ini antara empat stasiun (menggunakan A, B, C, D untuk singkatnya):
- A – B ≈ 1 menit, B – C ≈ 2 menit, C – D ≈ 2 menit
- A – C ≈ 3 menit, B – D ≈ 4 menit
- A – D ≈ 5 menit
Apakah ini perkiraan terbaik? Jika Anda tahu waktu perjalanan yang sebenarnya, dapatkah Anda menemukan solusi yang lebih baik?
Pada awalnya, ini terdengar seperti latihan sederhana dalam pemrograman dinamis, tetapi sekarang tampaknya diperlukan sejumlah pemikiran aktual.
Adakah yang mengenali masalah ini? Atau lihat algoritma pintar untuk menyelesaikannya?
Sunting: Ada beberapa varian alami dari pertanyaan yang telah disebutkan dalam komentar; mari beri mereka beberapa nama:
versi floor / ceil : diperlukan bahwa untuk semua .i
versi integer : cukup untuk semua . i
versi monoton : diperlukan .
versi non-monoton : kita dapat memiliki untuk . i < j
Pertanyaan awal mempertimbangkan versi bilangan bulat monotonik, tetapi jawaban yang terkait dengan salah satu dari versi ini diterima.
sumber
Jawaban:
BAIK. Algoritma DP tampaknya tidak perlu rumit. Setelah membaca komentar saya pikir ini mungkin menyelesaikan masalah versi Monoton (tapi saya belum memeriksa setiap detail).
Pertama, anggap setiap , di mana ⌊ x i ⌋ adalah bagian integral, { x i } adalah bagian fraksional. Asumsikan x i dibulatkan menjadi ⌊ x i ⌋ + v i , di mana v i adalah integer nonnegatif (tentu saja secara umum v i bisa negatif, tetapi kita selalu dapat bergeser sehingga v terkecil i adalah 0).xsaya= ⌊ xsaya⌋ + { xsaya} ⌊ xsaya⌋ { xsaya} xsaya ⌊ xsaya⌋+vi vi vi vi
Sekarang, pertimbangkan biaya untuk pasangan , x j saat melakukan pembulatan ini. Biaya seharusnyaxi xj
Ungkapannya rumit karena nilai absolutnya. Namun, perhatikan bahwa kita memiliki sifat monoton, sehingga hal-hal di dalam dua nilai absolut batin harus memiliki tanda SAMA. Karena kita memiliki nilai absolut terluar, tidak peduli apa tanda itu, ungkapan yang disederhanakan
Mulai sekarang kami tidak menganggap solusinya monoton, tetapi sebaliknya, kami mengubah tujuan untuk meminimalkan jumlah istilah di atas untuk semua pasangan. Jika solusi untuk masalah ini adalah monotonik, maka tentu saja itu juga solusi optimal untuk versi monotonik. (Anggap ini sebagai: masalah asli memiliki penalti tak terbatas ketika solusinya tidak monoton, masalah baru memiliki penalti lebih kecil, jika solusi monoton menang bahkan dalam versi baru, itu harus menjadi solusi untuk versi monoton)
Sekarang kita ingin membuktikan, jika , dalam solusi optimal kita harus memiliki v i ≥ v j .{xi}>{xj} vi≥vj
Asumsikan ini tidak benar, bahwa kita memiliki pasangan tetapi v i < v j . Kami akan menunjukkan bahwa jika kami menukar v i v j solusinya menjadi sangat baik.{xi}>{xj} vi<vj vi vj
Pertama kita membandingkan istilah antara dan j , di sini sangat jelas bahwa swapping benar-benar lebih baik karena dalam versi non-swap, v i - v j dan { x j } - { x i } memiliki tanda yang sama, absolut nilai akan menjadi jumlah dari dua nilai absolut.i j vi−vj {xj}−{xi}
Sekarang untuk apa pun , kami membandingkan jumlah pasangan ( i , k ) dan ( j , k ) . Artinya, kita perlu membandingkank (i,k) (j,k)
dan | v j - v k - ( { x i } - { x k } ) | + ||vi−vk−({xi}−{xk})|+|vj−vk−({xj}−{xk})| .|vj−vk−({xi}−{xk})|+|vi−vk−({xj}−{xk})|
Gunakan , B , C , D untuk menunjukkan empat hal dalam nilai absolut, jelas bahwa A + B = C + D . Juga jelas bahwa | A - B | ≥ | C - D | . Dengan cembungnya nilai absolut, kita tahu | A | + | B | ≥ | C | + | D | . Ambil jumlah atas semua x kA B C D A+B=C+D |A−B|≥|C−D| |A|+|B|≥|C|+|D| xk Kita tahu bertukar hanya bisa lebih baik.
Perhatikan bahwa sekarang kita sudah memiliki solusi untuk versi lantai / langit-langit Monoton: harus ada ambang, ketika lebih besar selalu dibulatkan, ketika lebih kecil selalu dibulatkan ke bawah, ketika itu adalah putaran yang sama beberapa ke atas dan beberapa turun, sedangkan kualitas solusi hanya tergantung pada jumlahnya. Kami menghitung semua solusi ini dan memilih yang memiliki fungsi objektif terkecil. (Semua solusi ini harus monoton).{xi}
Akhirnya kami ingin pergi ke versi integer monoton masalah. Kami benar-benar dapat membuktikan solusi optimal sama dengan versi lantai / langit-langit Monoton.
Seperti kita mengasumsikan, yang terkecil adalah 0. Grup semua x i 's menurut mereka v i ' s, dan memanggil mereka kelompok 0 , 1 , 2 , . . . , maks { v i } . Pertama-tama kita harus membuktikan bahwa tidak ada grup kosong, tetapi ini sederhana, jika grup k -th kosong, untuk v i > k biarkan saja v i = v i - 1vi xi vi 0,1,2,...,max{vi} k vi>k vi=vi−1 . Mudah untuk melihat fungsi objektif selalu membaik (pada dasarnya karena ).|{xi}−{xj}|<1
Sekarang kita akan membuktikan, rata-rata dalam kelompok k + 1 adalah setidaknya rata-rata { x i } dalam kelompok k ditambah 1 / 2 . Jika ini tidak benar, cukup biarkan v i = v i - 1 untuk semua v i > k , perhitungan lagi menunjukkan fungsi objektif membaik.{xi} k+1 {xi} k 1/2 vi=vi−1 vi>k
Karena rata-rata dalam kisaran [ 0 , 1 ) , sebenarnya ada paling banyak dua kelompok, yang sesuai dengan versi lantai / ceil.{xi} [0,1)
sumber
Hanya komentar yang panjang ... (mungkin sepele dan / atau salah :)
Jika dan M adalah kelipatan persekutuan terkecil dari b i s, maka kita dapat menyingkirkan rasional: x ' i = M * x i .xi=ai/bi M bi x′i=M∗xi
Ifyi∈{⌈xi⌉,⌊xi⌋} (floor,ceil restriction) then we can use binary variables vi to express y′i using its distance from x′i (Li=x′i−M∗⌊xi⌋ or Ri=x′i−M∗⌈xi⌉ ):
And the original problem should (?!?) be equivalent to finding thevi that minimize:
withvi∈{0,1},Di∈Z
sumber
Another extended comment... Could be wrong.
I'm also considering the case with floor/ceil restrictions, and I'm trying to solve it using dynamic programming (I can't, but maybe it works when the common divisor is small).
Let{xi} be the fractional part of xi , we consider things from the smallest {xi} to the largest. Suppose the largest is {xk} , and because we are doing dynamic programming we already know "something" (I will explain what this something is) about optimal solution for everything else except xk .
Now consider the difference in objective function when we roundxk up or down. If originally some xi is rounded up, then the difference is simply 1 (haven't really checked very carefully but seems like this is the case, it is really important that no matter whether xi is to the left or right of xk , the difference is always the same); if originally some xi is rounded down, then the difference is 2{xk}−2{xi}−1 . So: we know what decision we should make if the following three quantities are known:
OK, 1 and 2 are essentially the same, we can let f[N, Ndown, Sdown] be the optimal solution for the first N points (when the points are sorted in ascending order of{xi} ), the number of xi 's rounded down is Ndown, and the sum of {xi} for those that are rounded down is Sdown. Then it is not hard to write out how to go from f[N-1] to f[N].
The problem is of course, Sdown can have exponentially many values. But it works when either the common divisor is small, or we can round everything to a grid point first and get a FPTAS (if the above dynamic program is correct...)
sumber