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:
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.
Odpowiedzi:
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:
Weź geometrie a i b , wyrażone jako MultiLinestrings przez kolejne dwa wiersze i obrazy:
Różnica symetryczna, gdzie porcje i b nie przecinają się, to:
Na koniec oceń różnicę między a lub b a różnicą symetryczną:
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:
Zauważ, że nie testowałem dokładnie tej metody, więc weź je jako pomysły jako punkt wyjścia.
źródło
Algorytm bez błędów.
Pierwszy zestaw: Drugi zestaw:
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):
Wybrane wiersze stanowią odpowiedź:
Kryteria będą stanowić różnicę między skumulowanymi obszarami a rzeczywistą sumą.
źródło