Zamazany najmniej zgrubny wspólny algorytm partycji

9

Biorąc pod uwagę dwie różne partycje kształtu (ze względu na argument, dwa różne podziały administracyjne kraju), jak mogę znaleźć nową partycję, w której pasują obie te partycje, dopuszczając (i optymalizując) jakiś błąd?

Na przykład ignorując błąd, chcę algorytm, który to robi:

Wersja nie rozmyta

Być może pomaga to wyrazić w ustalonych terminach. Używając następującej numeracji:

Mogę wyrazić powyższe partycje jako:

A = {{1}, {2}, {3,4,7,8}, {5}, {6}, {9,10,13,14}, {11}, {12}, {15} , {16}}

B = {{1,2,5,6}, {3}, {4}, {7}, {8}, {9}, {10}, {13}, {14}, {11,15} , {12,16}}

Kropka B = {{1,2,5,6}, {3,4,7,8}, {9,10,13,14}, {11,15}, {12,16}}

a algorytm do tworzenia kropki B wydaje się prosty (coś w stylu, jeśli dwa elementy znajdują się w partycji razem w A (B) łączą partycje, w których się znajdują w B (A) - powtarzaj, aż A i B będą równe).

Ale teraz wyobraź sobie, że niektóre z tych linii różnią się nieznacznie między dwiema partycjami, więc ta idealna odpowiedź nie jest możliwa, a zamiast tego chcę optymalnej odpowiedzi z zastrzeżeniem zminimalizowania pewnego kryterium błędu.

Weź nowy przykład:

Tutaj w lewej kolumnie mamy dwie partycje bez wspólnych linii (poza samą zewnętrzną ramką). Jedynym możliwym rozwiązaniem tego rodzaju jest trywialne, prawa kolumna. Ale jeśli pozwolimy na rozwiązania „rozmyte”, wówczas środkowa kolumna może być dopuszczalna, powiedzmy, że 5% całkowitej powierzchni jest kwestionowane (tj. Przydzielone do innego podobszaru w każdej zgrubnej partycji). Możemy więc opisać środkową kolumnę jako reprezentującą „najmniej zgrubną wspólną partycję z błędem <= 5%”.

Niezależnie od tego, czy rzeczywistą odpowiedzią jest podział w górnym rzędzie, środkowej kolumnie czy środkowym rzędzie, środkowej kolumnie - czy coś pomiędzy, jest mniej ważne.

EconAndrew
źródło
Nie rozumiem twojej operacji. Wygląda na to, że szukasz wspólnego gruboziarnistego podziału na dwie partycje. Jednak bez dodatkowych kryteriów zwykle istnieje wiele rozwiązań. Na przykład, skoro grubiaństwo (a nie wyrafinowanie) wydaje się twoim celem, dlaczego przestać tam, gdzie to zrobiłeś? Dlaczego nie narysować wspólnego kwadratu ograniczającego?
whuber
1
Dzięki, źle to opisałem. Myślę, że mam na myśli najlepszy wspólny podział, a może „najmniej zgrubny”.
EconAndrew
W takim przypadku wynik wyglądałby zupełnie inaczej niż narysowany. Byłaby to szachownica kwadratów 4 x 4. Z tego jednego przykładu nie udało mi się wydedukować reguły, którą chcesz przestrzegać. Może próbujesz zachować wszystkie krawędzie wspólne dla wszystkich funkcji wejściowych? Jaki jest faktyczny problem, który próbujesz rozwiązać? Czy możesz podać konkretny przykład, który pomoże nam zrozumieć, jakie powinno być twoje pytanie ?
whuber
Dużo opracowałem - może to pomoże. To prawda, że ​​w rozmytej sprawie nie mogę precyzyjnie określić pytania, ale myślę, że w tym konkretnym przypadku wiem dokładnie, co mam na myśli (nawet jeśli nie wyrażam tego dobrze).
EconAndrew
Dziękuję za te wysiłki (+1). Pod względem swojej notacji set-teoretyczny, ścianki działowe z regionu tworzą częściowy porządek : partycja jest udoskonalenie od B , a B jest coarsening od A , gdy każdy zestaw w A jest podzbiorem jeden w B . Twoja praca pojawi łączących się być najlepszym wspólny coarsening z A i B . Jednym ze sposobów rozwiązania problemu z rozmytą wersją byłoby wykorzystanie możliwości GIS do usuwania zwisów i odłamków, aby skorygować małe rozbieżności między dwiema warstwami, a następnie wykonać operację bez rozmycia.
whuber

Odpowiedzi:

2

Możesz to zrobić, oceniając różnicę granicy wielokąta względem symetrycznej różnicy między ich granicami lub wyrażonej symbolicznie jako:

Difference(a, SymDifference(a, b))

Weź geometrie a i b , wyrażone jako MultiLinestrings przez kolejne dwa wiersze i obrazy:

MULTILINESTRING((0 300,50 300,50 250,0 250,0 300),(50 300,100 300,100 250,50 250,50 300),(0 250,50 250,50 200,0 200,0 250),(50 250,100 250,100 200,50 200,50 250),(100 300,200 300,200 200,100 200,100 300),(0 200,100 200,100 100,0 100,0 200),(100 200,150 200,150 150,100 150,100 200),(150 200,200 200,200 150,150 150,150 200),(100 150,150 150,150 100,100 100,100 150),(150 150,200 150,200 100,150 100,150 150))
MULTILINESTRING((0 300,100 300,100 200,0 200,0 300),(100 300,150 300,150 250,100 250,100 300),(150 300,200 300,200 250,150 250,150 300),(100 250,150 250,150 200,100 200,100 250),(150 250,200 250,200 200,150 200,150 250),(0 200,50 200,50 150,0 150,0 200),(50 200,100 200,100 150,50 150,50 200),(0 150,50 150,50 100,0 100,0 150),(50 150,100 150,100 100,50 100,50 150),(100 200,150 200,150 100,100 100,100 200),(150 200,200 200,200 100,150 100,150 200))

za b

Różnica symetryczna, gdzie porcje i b nie przecinają się, to:

MULTILINESTRING((50 300,50 250),(50 250,0 250),(100 250,50 250),(50 250,50 200),(150 150,100 150),(200 150,150 150),(150 300,150 250),(150 250,100 250),(200 250,150 250),(150 250,150 200),(50 200,50 150),(50 150,0 150),(100 150,50 150),(50 150,50 100))

symdiff

Na koniec oceń różnicę między a lub b a różnicą symetryczną:

MULTILINESTRING((0 300,50 300),(0 250,0 300),(50 300,100 300),(100 300,100 250),(50 200,0 200),(0 200,0 250),(100 250,100 200),(100 200,50 200),(100 300,150 300),(150 300,200 300,200 250),(200 250,200 200),(200 200,150 200),(150 200,100 200),(100 200,100 150),(100 150,100 100),(100 100,50 100),(50 100,0 100,0 150),(0 150,0 200),(150 200,150 150),(200 200,200 150),(150 150,150 100),(150 100,100 100),(200 150,200 100,150 100))

diff_symdiff

Możesz zaimplementować tę logikę w GEOS (Shapely, PostGIS itp.), JTS i innych. Zauważ, że jeśli geometriami wejściowymi są wielokąty, wówczas ich granice należy wyodrębnić, a wynik można poligonizować. Na przykład pokazano za pomocą PostGIS, weź dwa MultiPolygon i uzyskaj wynik MultiPolygon:

SELECT
  ST_AsText(ST_CollectionHomogenize(ST_Polygonize(
    ST_Difference(ST_Boundary(A), ST_SymDifference(ST_Boundary(A), ST_Boundary(B)))
  ))) AS result
FROM (
  SELECT 'MULTIPOLYGON(((0 300,50 300,50 250,0 250,0 300)),((50 300,100 300,100 250,50 250,50 300)),((0 250,50 250,50 200,0 200,0 250)),((50 250,100 250,100 200,50 200,50 250)),((100 300,200 300,200 200,100 200,100 300)),((0 200,100 200,100 100,0 100,0 200)),((100 200,150 200,150 150,100 150,100 200)),((150 200,200 200,200 150,150 150,150 200)),((100 150,150 150,150 100,100 100,100 150)),((150 150,200 150,200 100,150 100,150 150)))'::geometry AS a,
    'MULTIPOLYGON(((0 300,100 300,100 200,0 200,0 300)),((100 300,150 300,150 250,100 250,100 300)),((150 300,200 300,200 250,150 250,150 300)),((100 250,150 250,150 200,100 200,100 250)),((150 250,200 250,200 200,150 200,150 250)),((0 200,50 200,50 150,0 150,0 200)),((50 200,100 200,100 150,50 150,50 200)),((0 150,50 150,50 100,0 100,0 150)),((50 150,100 150,100 100,50 100,50 150)),((100 200,150 200,150 100,100 100,100 200)),((150 200,200 200,200 100,150 100,150 200)))'::geometry AS b
) AS f;
                               result
--------------------------------------------------------------------------------
MULTIPOLYGON(((0 300,50 300,100 300,100 250,100 200,50 200,0 200,0 250,0 300)),((100 250,100 300,150 300,200 300,200 250,200 200,150 200,100 200,100 250)),((0 200,50 200,100 200,100 150,100 100,50 100,0 100,0 150,0 200)),((150 200,200 200,200 150,200 100,150 100,150 150,150 200)),((100 200,150 200,150 150,150 100,100 100,100 150,100 200)))

Zauważ, że nie testowałem dokładnie tej metody, więc weź je jako pomysły jako punkt wyjścia.

Mike T.
źródło
Czy możesz wyrazić się jasno na temat tego, jak ten algorytm radzi sobie z rozmytą wersją zadawanego problemu, albo jak można go dostosować do tej wersji?
whuber
0

Algorytm bez błędów.

Pierwszy zestaw: wprowadź opis zdjęcia tutaj Drugi zestaw: wprowadź opis zdjęcia tutaj

Scal 2 zestawy i sortuj w kolejności malejącej według obszaru. Wybierz wiersze w tabeli (góra => dół), aż suma obszarów = całkowity obszar (w tym przypadku 16):

wprowadź opis zdjęcia tutaj

Wybrane wiersze stanowią odpowiedź:

wprowadź opis zdjęcia tutaj

Kryteria będą stanowić różnicę między skumulowanymi obszarami a rzeczywistą sumą.

FelixIP
źródło
Wygląda na to, że będzie działać poprawnie tylko w bardzo szczególnych okolicznościach. W jaki sposób gwarantujesz, że skończysz z nienakładającą się, wyczerpującą partycją wspólnego regionu?
whuber
Poprawny. Dodatkowe kroki a) zespoły danych w kategoriach narzędzia arcgis Union b) weź pierwszy największy ze scalonej tabeli i sprawdź ułamek innych wewnątrz c) usuń inne z ułamkiem większym progiem, np. 90%. Jak to jest?
FelixIP
Nie wiem, bo jeszcze nie zorientowałem się, o co tak naprawdę chodzi.
whuber
Uzupełnij obszar, używając największych możliwych bloków. Tak rozumiem pytanie
FelixIP,
Rozwiązaniem tego jest użycie jednego bloku (połączenie wszystkich)!
whuber