Chińska komórka
03.10.2009 - Paweł Gawrychowski
![]() ![]() Nie jest to może moje ulubione zadanie (nie wygrałem dzięki jego rozwiązaniu żadnych zawodów :), ale na pewno jest bardzo fajnym przykładem użycia dość ogólnej techniki, którą warto znać. Także dlatego, że w dość zaskakujący sposób pojawia się w niej geometria obliczeniowa (mam nadzieję, że nie zniechęci to Was to dalszej lektury...), mimo że zadanie na pierwszy (a nawet na drugi) rzut oka nie ma nic wspólnego z geometrią. Ale po kolei... Zadanie
Treść można zobaczyć na przykład tutaj. Po przedarciu się przez historyjkę problem wygląda następująco: dostajemy ciąg Pierwszy pomysł
..jest dość oczywisty: możemy użyć programowania dynamicznego. Niech
. Musimy jednak poradzić sobie z dwoma problemami:
Drugi pomysł, trochę lepszy
Skoro wyznaczenie pojedynczej wartości
, oraz widać, że tak naprawdę interesuje nas wyznaczenie dla wszystkich wartości . W tym momencie możemy całkiem zapomnieć o pierwotnym sformułowaniu problem i zająć się tylko i wyłącznie wyznaczaniem takich minimów z funkcji liniowych (no, prawie: przydatne będzie jeszcze to, że współczynniki są wszystkie dodatnie i coraz większe dla kolejnych wartości ).
Jak minimalizować funkcje liniowe?
Popatrzmy przez chwilę na prostszą wersję problemu: dla danego zbioru funkcji liniowych
Krzywą zaznaczoną na czerwono będziemy nazywali górną otoczką funkcji
No dobrze, ale w naszym problemie zbiór funkcji liniowych nie był podany z góry: dla kolejnych wartości
w powyższej sytuacji trzeba zastąpić zielony fragment przedziałem, na którym optymalna jest niebieski fragment nowej funkcji. Jeżeli kolejno dodawane funkcje mają coraz większe współczynniki przy
Zastanówmy się chwilę nad kosztem takiej aktualizacji. Może się zdarzyć, że dodanie nowej funkcji spowoduje konieczność usunięcia wielu odcinków, jednak powoduje utworzenie tylko jednego nowego. Z drugiej strony ciężko usunąć coś czego nie ma, a więc (wszystkich) usunięć nie będzie więcej niż
Oprócz aktualizacji musimy jednak również znaleźć przedział, w którym znajduje się bieżąca wartość Cała implementacja nie jest bardzo skomplikowana, o ile umiemy wyliczać przecięcia dwóch odcinków/prostych. Tego typu "prymitywy" geometryczne (jak przecięcie, sprawdzanie po której stronie prostej leży punkt, liczenie odległości od prostej, znajdowanie okręgu przechodzącego przez dane punkty, itd) warto:
Czy to już koniec?
W zasadzie tak: umiemy już wyznaczyć optymalny koszt. Autor zadania prosi nas też o wyznaczenie najlepszego podziału (a nawet jest bardziej wybredny i wymaga, żeby był on najmniejszy leksykograficznie), jednak podany wyżej pomysł można łatwo wzbogacić o znajdowanie nie tylko najmniejszego kosztu, ale także funkcji, dla której jest on osiągany. Cały algorytm będzie miał złożoność Co jeszcze?Co prawda nie ma to żadnego związku z minimalizacją funkcji liniowych, ale wszystkim, którym podobało się użycie otoczki do rozwiązania problemu, który wydawał się nie mieć nic wspólnego z geometrią, polecam następujące zadanie:
Mamy dane trzy substancje chemiczne A,B i C (Czytelnik może zastąpić litery swoimi ulubionymi pierwiastkami). Dysponujemy oraz zastanowienie się nad warunkami, które musi spełniać funkcja kosztu, aby znajdowanie optymalnego podziału na fragmenty można było przyspieszyć tak, jak w przypadku zadaniu o komórce. (4 ocen) |
Copyright © 2008-2010 Wrocławski Portal Informatyczny
design: rafalpolito.com