Co wiadomo na temat złożoności następującego problemu:
- Biorąc pod uwagę: liczby wymierne .
- Wyjście: liczby całkowite .
- Cel: zminimalizować gdzie
Oznacza to, że chcielibyśmy zaokrąglić liczby wymierne do liczb całkowitych, aby zminimalizować sumę błędów w odległościach parowych. Dla każdej pary chcielibyśmy mieć zaokrągloną odległość możliwie najbliższą rzeczywistej odległości .
Motywacja: nudna podróż metrem i plakat przedstawiający „lokalizacje” stacji w rozdzielczości jednej minuty podróży. Tutaj minimalizujemy błąd popełniany przez ludzi, którzy używają plakatu do wyszukiwania czasu podróży między stacjami i , uśredniając dla wszystkich par .
Na przykład tutaj możemy odczytać następujące przybliżenia odległości parami między czterema stacjami (używając zwięzłości A, B, C, D):
- A – B ≈ 1 minuta, B – C ≈ 2 minuty, C – D ≈ 2 minuty
- A – C ≈ 3 minuty, B – D ≈ 4 minuty
- A – D ≈ 5 minut
Czy to najlepsze możliwe przybliżenie? Jeśli znasz rzeczywisty czas podróży, czy możesz znaleźć lepsze rozwiązanie?
Na początku wydawało się to prostym ćwiczeniem w programowaniu dynamicznym, ale teraz wydaje się, że potrzebne jest trochę myślenia.
Czy ktoś rozpoznaje ten problem? Lub zobaczyć sprytny algorytm do jego rozwiązania?
Edycja: Istnieje kilka naturalnych wariantów pytania, które zostały wspomniane w komentarzach; nadajmy im kilka nazw:
wersja podłogowa / sufitowa : wymagane jest, aby dla wszystkich i .
wersja całkowita : wystarczy, że dla wszystkich i .
wersja monotoniczna : wymagane jest, aby .
wersja niemonotoniczna : możemy mieć dla i < j .
Oryginalne pytanie dotyczy monotonicznej liczby całkowitej, ale mile widziane są odpowiedzi dotyczące dowolnej z tych wersji.
źródło
Odpowiedzi:
DOBRZE. Algorytm DP wydaje się niepotrzebnie skomplikowany. Po przeczytaniu komentarzy myślę, że może to rozwiązać monotoniczną wersję problemu (ale nie sprawdziłem każdego szczegółu).
Najpierw załóżmy, że każdy , gdzie ⌊ x i ⌋ jest częścią integralną, { x i } jest częścią ułamkową. Załóżmy, że x i jest zaokrąglone do ⌊ x i ⌋ + v i , gdzie v i jest nieujemną liczbą całkowitą (oczywiście ogólnie v i może być ujemna, ale zawsze możemy przesunąć tak, aby najmniejsza v i wynosiła 0).xi=⌊xi⌋+{xi} ⌊xi⌋ {xi} xi ⌊xi⌋+vi vi vi vi
Teraz weź pod uwagę koszt pary , x j podczas wykonywania tego zaokrąglania. Koszt powinien wynosićxi xj
Wyrażenie jest skomplikowane ze względu na wartości bezwzględne. Zauważ jednak, że mamy monotoniczność, więc rzeczy wewnątrz dwóch wewnętrznych wartości bezwzględnych powinny mieć znak SAM. Ponieważ mamy zewnętrzną wartość bezwzględną, tak naprawdę nie ma znaczenia, czym jest ten znak, wyrażenie to po prostu upraszcza
Odtąd nie zakładamy, że rozwiązanie jest monotoniczne, ale zamiast tego zmieniamy cel, aby zminimalizować sumę powyższego terminu dla wszystkich par. Jeśli rozwiązanie tego problemu okaże się monotoniczne, to oczywiście jest to również optymalne rozwiązanie dla wersji monotonicznej. (Pomyśl o tym jako: oryginalny problem ma nieskończoną karę, gdy rozwiązanie nie jest monotoniczne, nowy problem ma mniejszą karę, jeśli rozwiązanie monotoniczne wygrywa nawet w nowej wersji, musi to być rozwiązanie monotonicznej wersji)
Teraz chcielibyśmy udowodnić, że jeśli , w optymalnym rozwiązaniu musimy mieć v i ≥ v j .{xi}>{xj} vi≥vj
Załóżmy, że to nieprawda, że mamy parę ale v i < v j . Pokażemy, że jeśli zamienimy v i v j, rozwiązanie stanie się zdecydowanie lepsze.{xi}>{xj} vi<vj vi vj
Najpierw porównujemy termin między i j , tutaj jest naprawdę jasne, że zamiana jest zdecydowanie lepsza, ponieważ w wersji bez zamiany, v i - v j i { x j } - { x i } ma ten sam znak, absolut wartość będzie sumą dwóch wartości bezwzględnych.i j vi−vj {xj}−{xi}
Teraz dla dowolnego porównujemy sumę par ( i , k ) i ( j , k ) . Oznacza to, że musimy porównaćk (i,k) (j,k)
i | v j - v k - ( { x i } - { x k } ) | + ||vi−vk−({xi}−{xk})|+|vj−vk−({xj}−{xk})| .|vj−vk−({xi}−{xk})|+|vi−vk−({xj}−{xk})|
Zastosowanie , B , C , D , oznaczające cztery warunki wewnątrz wartości bezwzględnej, to jest oczywiste, że + B = C + D . Jest również jasne, że | A - B | ≥ | C - D | . Dzięki wypukłości wartości bezwzględnej wiemy | A | + | B | ≥ | C | + | D | . Weź sumę nad wszystkimi x kA B C D A+B=C+D |A−B|≥|C−D| |A|+|B|≥|C|+|D| xk Wiemy, że zamiana może być tylko lepsza.
Zauważ, że teraz mamy już rozwiązanie dla monotonicznej wersji podłogi / sufitu: musi istnieć próg, gdy jest większy zawsze zaokrągla w górę, gdy jest mniejszy zawsze zaokrągla w dół, gdy jest równy zaokrągla w górę, a niektóre w dół, podczas gdy jakość rozwiązania zależy tylko od liczby. Wymieniamy wszystkie te rozwiązania i wybieramy jedno z najmniejszą funkcją celu. (Wszystkie te rozwiązania są z konieczności monotoniczne).{xi}
Na koniec chcielibyśmy przejść do monotonicznej liczby całkowitej problemu. Możemy faktycznie udowodnić, że optymalne rozwiązanie jest takie samo jak wersja monotoniczna podłogi / sufitu.
Ponieważ zakładamy, najmniejsza 0. Grupa wszystkich x i jest zgodnie z ich v i 's, które nazywają grupę 0 , 1 , 2 , . . . , max { v i } . Najpierw udowodnimy, że nie ma pustych grup, ale jest to proste, jeśli k-ta grupa jest pusta, dla dowolnego v i > k po prostu pozwól v i = v i - 1vi xi vi 0,1,2,...,max{vi} k vi>k vi=vi−1 . Łatwo jest zauważyć, że funkcja celu zawsze się poprawia (zasadniczo dlatego, że ).|{xi}−{xj}|<1
Teraz udowodnimy, średnia w grupie k + 1 jest co najmniej średnią { x i } w grupie k powiększonej o 1 / 2 . Jeśli nie jest to prawdą, po prostu pozwól v i = v i - 1 dla wszystkich v i > k , obliczenia ponownie pokazują poprawę funkcji celu.{xi} k+1 {xi} k 1/2 vi=vi−1 vi>k
Ponieważ średnia mieści się w przedziale [ 0 , 1 ) , tak naprawdę istnieją co najwyżej dwie grupy, co odpowiada wersji podłoga / sufit.{xi} [0,1)
źródło
Tylko rozszerzony komentarz ... (może trywialny i / lub zły :)
Jeśli i M jest najmniejszą wspólną wielokrotnością B i S, to możemy pozbyć się rationals: x ' I = M * x í .xi=ai/bi M bi x′i=M∗xi
Jeżeli (podłoga, ograniczenie ceil), następnie można użyć zmiennych binarnych v i wyrazić Y ' i za pomocą jego odległości od X " I ( L I = x " i - M ∗ ⌊ x i ⌋ lub R i = x ′ i - M ∗ ⌈ x i ⌉yi∈{⌈xi⌉,⌊xi⌋} vi y′i x′i Li=x′i−M∗⌊xi⌋ Ri=x′i−M∗⌈xi⌉ ):
Pierwotny problem powinien (?!?) Być równoważny ze znalezieniem minimalizujących:vi
zvi∈{0,1},Di∈Z
źródło
Kolejny rozszerzony komentarz ... Może się mylić.
Rozważam również przypadek z ograniczeniami podłogi / sufitu i próbuję go rozwiązać za pomocą programowania dynamicznego (nie mogę, ale może to działa, gdy wspólny dzielnik jest mały).
Niech będzie ułamkową częścią x i , rozważamy rzeczy od najmniejszej { x i } do największej. Załóżmy, że największy jest { x k } , a ponieważ robimy programowania dynamicznego wiemy już „coś” (I wyjaśni, co to coś jest) o optymalnych rozwiązań dla wszystkiego z wyjątkiem x k .{xi} xi {xi} {xk} xk
Problem polega oczywiście na tym, że Sdown może mieć wykładniczo wiele wartości. Ale działa, gdy wspólny dzielnik jest mały, lub możemy najpierw zaokrąglić wszystko do punktu siatki i uzyskać FPTAS (jeśli powyższy program dynamiczny jest poprawny ...)
źródło