Нечіткий алгоритм загального розподілу


9

З огляду на два різні розділи форми (заради аргументу, два різні адміністративні поділи країни), як я можу знайти новий розділ, в який обидва ці розділи вписуються, дозволяючи (і оптимізуючи) деяку помилку?

Наприклад, ігноруючи помилку, я хочу алгоритм, який робить це:

Нечітка версія

Можливо, це допомагає виразити це у встановлені терміни. Використовуючи таку нумерацію:

Я можу висловити розділи вище:

А = {{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}}

Крапка В = {{1,2,5,6}, {3,4,7,8}, {9,10,13,14}, {11,15}, {12,16}}

а алгоритм створення точки B здається простим (щось на зразок, якщо два елементи перебувають у розділі разом у A (B), об'єднують розділи, у яких вони є, у B (A) - повторюйте, поки A і B не будуть рівними).

Але тепер уявіть, що деякі з цих рядків дещо відрізняються між двома розділами, так що ця ідеальна відповідь неможлива, і натомість я хочу, щоб оптимальна відповідь відповідала мінімізації деякого критерію помилки.

Візьміть новий приклад:

Тут у лівому стовпчику є дві секції, що не мають загальних ліній (крім самої зовнішньої межі). Єдиним можливим рішенням вищевказаного роду є тривіальний, правильний стовпчик. Але якщо ми дозволити "нечіткі" рішення, то середній стовпчик може бути допустимим, скажімо, 5% загальної площі оскаржується (тобто розподіляється на різну підподібну область в кожній грубій перегородці). Тож ми можемо описати середній стовпчик як такий, що представляє "найменш грубу загальну секцію з помилкою <= 5%".

Незалежно від того, чи справжня відповідь - це розділ у верхньому рядку, середньому стовпчику чи середньому рядку, середньому стовпчику - чи щось середнє, є менш важливим.


Я не розумію вашої операції. Здається, ви шукаєте спільну групування двох перегородок. Однак без додаткових критеріїв зазвичай буде багато рішень. Наприклад, оскільки ваша мета - швидше огрублення (а не уточнення), навіщо зупинятися на тому, де ви це зробили? Чому б просто не намалювати загальний обмежуючий квадрат?
whuber

1
Дякую, я це неправильно позначив. Що я думаю, я маю на увазі найтонший загальний розділ, або, можливо, "найменш грубий".
EconAndrew

У такому випадку результат буде виглядати зовсім інакше від того, що ви намалювали. Це було б 4 x 4 шахівниці квадратів. З цього прикладу я не зміг вивести правило, якого ви хочете дотримуватися. Можливо, ви намагаєтесь зберегти всі ребра спільними для всіх вхідних функцій? Яку актуальну проблему ви намагаєтеся вирішити? Чи можете ви надати конкретний приклад, щоб допомогти нам зрозуміти, яким має бути ваше запитання ?
whuber

Я багато розробив - можливо, це допоможе. Це правда, що в нечіткому випадку я не можу точно вказати своє питання, але думаю, що в точному випадку я точно знаю, що я маю на увазі (навіть якщо я не висловлюю це добре).
EconAndrew

Дякую за зусилля (+1). З точкою зору вашого теоретико-множинної записи, розбиття області утворює частково впорядкована множина : розбиття є уточненням з B , а B являє собою огрубіння з А , коли кожен набір в A є підмножина одного в B . Ваша робота , як видається , що поєднують бути кращим загальним огрубіння A і B . Одним із способів вирішити вашу нечітку версію буде використання можливостей ГІС для видалення звисань і трісок, щоб виправити невеликі розбіжності між двома шарами, а потім виконати нечітку операцію.
whuber

Відповіді:


2

Це можна зробити, оцінивши різницю межі полігона на симетричну різницю між їх межами або символічно виразивши як:

Difference(a, SymDifference(a, b))

Візьміть геометрії a і b , виражені у вигляді MultiLinestrings на наступних двох рядках та зображеннях:

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))

а б

Симетрична різниця, де ділянки a і b не перетинаються, є:

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))

симдиф

І, нарешті, оцініть різницю між a або b і симетричною різницею:

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

Ви можете реалізувати цю логіку в GEOS (Shapely, PostGIS тощо), JTS та інших. Зауважте, що якщо вхідні геометрії є багатокутниками, то їх межі потрібно витягти, а результат можна полігонізувати. Наприклад, показаний на PostGIS, візьміть два мультиполігони та отримайте результат 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)))

Зауважте, що я не широко перевіряв цей метод, тому сприймайте їх як ідеї як вихідну точку.


Чи можете ви пояснити, як цей алгоритм або обробляє нечітку версію проблеми, про яку ви питаєте, або як би він міг бути адаптований до цієї версії?
whuber

0

Алгоритм вільного помилки.

Перший набір: введіть тут опис зображення Другий набір: введіть тут опис зображення

Об'єднайте 2 набори та сортуйте у порядку зменшення за площею. Виберіть рядки в таблиці (зверху => вниз) до досягнення загальної площі = загальна площа (16 у цьому випадку):

введіть тут опис зображення

Вибрані рядки дають відповідь:

введіть тут опис зображення

Критеріями буде різниця між накопиченими площами та фактичною загальною сумою.


Схоже, це буде працювати правильно лише в дуже особливих обставинах. Як ви гарантуєте, що у вас виникне нерозбірливий, вичерпний розділ спільного регіону?
whuber

Правильно. Додаткові кроки a) набори даних об'єднання з точки зору arcgis Інструмент Union b) беруть перший найбільший з об'єднаної таблиці та перевіряють фракцію інших усередині c) видаляють інші з більш високим порогом, наприклад 90%. Як це?
FelixIP

Я не знаю, тому що я ще не зрозумів, яке питання насправді задають.
качан

Складіть область, використовуючи найбільші можливі блоки. Це моє розуміння питання
FelixIP

Рішенням цього є використання єдиного блоку (об'єднання їх усіх)!
whuber
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.