Bulanık en az kaba ortak bölme algoritması


9

Bir şeklin iki farklı bölümü (argüman uğruna, bir ülkenin iki farklı idari bölümü) göz önüne alındığında, bu bölümlerin her ikisinin de sığacağı ve bazı hatalara izin verdiği (ve optimize ettiği) yeni bir bölümü nasıl bulabilirim?

Örneğin, hatayı yoksayarak, bunu yapan bir algoritma istiyorum:

Bulanık olmayan sürüm

Belki de bunu belirli terimlerle ifade etmeye yardımcı olur. Aşağıdaki numaralandırmayı kullanarak:

Yukarıdaki bölümleri şöyle ifade edebilirim:

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

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

ve A noktasının B üretilmesi için algoritma basit görünmektedir (A (B) 'de iki eleman birlikte bir bölümdeyse, B (A)' da oldukları bölümleri birleştirirse - A ve B eşit oluncaya kadar tekrarlayın).

Ama şimdi bu satırlardan bazılarının iki bölüm arasında biraz farklı olduğunu hayal edin, böylece bu mükemmel cevap mümkün değildir ve bunun yerine en uygun cevabın bazı hata kriterlerini en aza indirmesini istiyorum.

Yeni bir örnek alın:

Burada sol sütunda ortak çizgi olmayan iki bölüm var (dış sınırın kendisi dışında). Yukarıdaki türün tek olası çözümü önemsiz olan, sağ sütundur. Ancak "bulanık" çözeltilere izin verirsek, orta sütuna izin verilebilir, toplam alanın% 5'i itiraz edilir (yani her bir kaba bölümdeki farklı bir alt alana tahsis edilir). Bu nedenle orta sütunu "<=% 5 hata ile en az kaba ortak bölümü" temsil eden olarak tanımlayabiliriz.

Gerçek cevabın üst satır, orta sütun veya orta satır, orta sütun veya aralarındaki bir şey olup olmadığı daha az önemlidir.


Operasyonunu anlamıyorum. Görünüşe göre iki bölümden oluşan ortak bir fikir arıyoruz . Ek kriterler olmadan, genellikle birçok çözüm olacaktır. Örneğin, kabalaştırma (arıtma yerine) hedefiniz gibi göründüğü için neden durdunuz? Neden sadece ortak sınırlayıcı kareyi çizmiyorsunuz?
whuber

1
Teşekkürler, bunu yanlış etiketledim. Demek istediğim en iyi ortak bölüm veya belki de "en az kaba".
EconAndrew

Bu durumda sonuç, çizdiklerinizden çok farklı görünecektir. 4 x 4 satranç tahtası kareler olurdu. Bu örnekte, takip etmek istediğiniz kuralı çıkaramadım. Belki de tüm kenarları tüm girdi özellikleri için ortak tutmaya çalışıyorsunuzdur ? Çözmeye çalıştığınız asıl sorun nedir? Sorunuzun ne olması gerektiğini anlamamıza yardımcı olacak somut bir örnek verebilir misiniz ?
whuber

Çok özenle hazırladım - belki bu yardımcı olacaktır. Bulanık durumda sorumu tam olarak belirleyemediğim doğru, ama tam olarak ne demek istediğimi tam olarak bildiğimi düşünüyorum (iyi ifade etmeme rağmen).
EconAndrew

Bu çabalar için teşekkür ederim (+1). Belirlediğiniz-teorik gösterimde açısından, bir bölgenin bölümleri bir formu kısmen sıralı kümesi : bölme A bir olan arıtma ait B ve B bir olan irileşmesi ait A her set zaman, A içinde birinin bir alt kümesidir B . Birleştirme operasyonunuz A ve B'nin en iyi ortak kabalaşması gibi görünüyor . Bulanık sürümünüzle baş etmenin bir yolu, GIS'in iki katman arasındaki küçük tutarsızlıkları düzeltmek ve daha sonra bulanık olmayan işlemi gerçekleştirmek için dangles ve şeritleri kaldırma yeteneklerinden yararlanmaktır.
whuber

Yanıtlar:


2

Bunu, bir çokgenin sınırının sınırları arasındaki simetrik farkla farkını değerlendirerek veya sembolik olarak şu şekilde ifade ederek yapabilirsiniz:

Difference(a, SymDifference(a, b))

Sonraki iki çizgi ve resim üzerinde MultiLinestrings olarak ifade edilen a ve b geometrilerini alın :

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

bir b

A ve b bölümlerinin kesişmediği simetrik fark :

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

Ve son olarak, a veya b ile simetrik fark arasındaki farkı değerlendirin :

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

Bu mantığı GEOS (Shapely, PostGIS, vb.), JTS ve diğerlerinde uygulayabilirsiniz. Giriş geometrilerinin çokgen olması durumunda, sınırlarının çıkarılması gerektiğini ve sonucun çokgenleştirilebileceğini unutmayın. Örneğin, PostGIS ile gösterildiği gibi, iki MultiPolygon alın ve bir MultiPolygon sonucu alın:

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

Bu yöntemi kapsamlı bir şekilde test etmediğimi unutmayın , bu yüzden bunları bir başlangıç ​​noktası olarak fikir olarak kabul edin.


Bu algoritmanın ya sorulan sorunun bulanık sürümünü nasıl ele aldığı ya da bu sürüme nasıl uyarlanabileceği konusunda açık olabilir misiniz?
whuber

0

Hatalar ücretsiz algoritma.

İlk set: resim açıklamasını buraya girin İkinci set: resim açıklamasını buraya girin

2 seti birleştirin ve alana göre azalan düzende sıralayın. Toplam alan = toplam alan (bu durumda 16) olana kadar tablodaki satırları seçin (üst => aşağı):

resim açıklamasını buraya girin

Seçilen satırlar yanıtınızı verir:

resim açıklamasını buraya girin

Kriterler, biriken alanlar ile gerçek toplam arasında bir fark olacaktır.


Bu sadece çok özel durumlarda doğru çalışacak gibi görünüyor. Ortak bölgenin örtüşmeyen, kapsamlı bir bölümle sonuçlanacağını nasıl garanti edersiniz?
whuber

Doğru. Ek adımlar a) arcgis açısından birleşik veri kümeleri Birlik aracı b) birleştirilmiş tablodan ilk büyük değeri alır ve diğerlerinin fraksiyonunu kontrol eder c) fraksiyonu daha yüksek eşikli, örneğin% 90 olan diğerlerini kaldırır. Bu nasıl?
FelixIP

Bilmiyorum, çünkü sorunun henüz ne istediğini henüz anlamadım.
whuber

Mümkün olan en büyük blokları kullanarak alanı tamamlayın. Bu benim soru anlayışım
FelixIP

Bunun çözümü tek bir blok kullanmaktır (hepsinin birleşimi)!
whuber
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.