อัลกอริทึมพาร์ติชันที่พบน้อยที่สุดที่คลุมเครือน้อยที่สุด


9

ด้วยพาร์ติชันที่แตกต่างกันสองแบบของรูปร่าง (เพื่อเหตุผลของการโต้เถียงแผนกการบริหารที่แตกต่างกันสองแห่งของประเทศ) ฉันจะค้นหาพาร์ติชันใหม่ที่พาร์ติชันทั้งสองนั้นพอดีได้อย่างไรทำให้เกิดข้อผิดพลาดบางอย่าง

ตัวอย่างเช่นการละเว้นข้อผิดพลาดฉันต้องการอัลกอริทึมที่ทำสิ่งนี้:

รุ่นที่ไม่คลุมเครือ

บางทีมันอาจช่วยในการแสดงในเงื่อนไขที่กำหนด ใช้หมายเลขต่อไปนี้:

ฉันสามารถแสดงพาร์ติชั่นด้านบนเป็น:

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

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

และอัลกอริทึมสำหรับการผลิต A dot B ดูเหมือนจะตรงไปตรงมา (เช่นถ้าองค์ประกอบสองอย่างอยู่ในพาร์ติชันร่วมกันใน A (B) ผสานพาร์ติชั่นที่พวกเขาอยู่ใน B (A) - ทำซ้ำจนกระทั่ง A และ B เท่ากัน

แต่ตอนนี้ลองนึกดูว่าบางบรรทัดเหล่านี้มีความแตกต่างกันเล็กน้อยระหว่างสองพาร์ติชั่นดังนั้นคำตอบที่สมบูรณ์แบบนี้เป็นไปไม่ได้และฉันต้องการคำตอบที่ดีที่สุดเพื่อลดข้อผิดพลาดให้น้อยที่สุด

นำตัวอย่างใหม่:

ที่นี่ในคอลัมน์ด้านซ้ายเรามีสองพาร์ติชันที่ไม่มีบรรทัดทั่วไป (นอกเหนือจากเส้นขอบภายนอก) ทางออกเดียวที่เป็นไปได้ของประเภทข้างต้นคืออันเล็กน้อยคอลัมน์ที่ถูกต้อง แต่ถ้าเราอนุญาตการแก้ปัญหาแบบ "คลุมเครือ" คอลัมน์กลางอาจอนุญาตได้โดยพูดได้ 5% ของพื้นที่ทั้งหมดที่เข้าร่วมแข่งขัน ดังนั้นเราอาจอธิบายคอลัมน์กลางว่าเป็น "พาร์ทิชันทั่วไปที่มีความหนาน้อยที่สุดพร้อมกับ <= 5% ข้อผิดพลาด"

ไม่ว่าคำตอบที่แท้จริงคือพาร์ติชันในแถวบนสุดคอลัมน์กลางหรือแถวกลางคอลัมน์กลางหรือบางสิ่งที่อยู่ระหว่างนั้นมีความสำคัญน้อยกว่า


ฉันไม่เข้าใจการทำงานของคุณ ดูเหมือนว่าคุณกำลังมองหาที่พบอนุภาคของสองพาร์ทิชัน แม้ว่าจะไม่มีเกณฑ์เพิ่มเติม แต่มักจะมีวิธีแก้ไขมากมาย ตัวอย่างเช่นเนื่องจากการทำให้หยาบ (แทนที่จะเป็นการปรับแต่ง) ดูเหมือนจะเป็นเป้าหมายของคุณทำไมหยุดที่ที่คุณทำ ทำไมไม่เพียงแค่วาดสี่เหลี่ยมที่มีขอบเขตร่วมกัน?
whuber

1
ขอบคุณฉันใช้คำนี้ผิด สิ่งที่ฉันคิดว่าฉันหมายถึงเป็นพาร์ทิชันทั่วไปที่ดีที่สุดหรืออาจ "หยาบน้อย"
EconAndrew

ในกรณีนั้นผลลัพธ์จะดูแตกต่างจากที่คุณวาดมาก มันจะเป็นกระดานหมากรุกสี่เหลี่ยมขนาด 4 x 4 จากตัวอย่างนี้ฉันไม่สามารถอนุมานกฎที่คุณต้องการติดตามได้ บางทีคุณกำลังพยายามรักษาขอบทั้งหมดให้เหมือนกันกับคุณสมบัติการป้อนข้อมูลทั้งหมดหรือไม่ ปัญหาจริงที่คุณพยายามแก้ไขคืออะไร คุณสามารถยกตัวอย่างที่เป็นรูปธรรมเพื่อช่วยให้เราเข้าใจว่าคำถามของคุณควรเป็นอย่างไร
whuber

ฉันได้ทำอย่างละเอียดมาก - บางทีนี่อาจช่วยได้ มันเป็นความจริงที่ในกรณีที่คลุมเครือฉันไม่สามารถระบุคำถามของฉันได้อย่างแม่นยำ แต่ฉันคิดว่าในกรณีที่แน่นอนฉันรู้อย่างแม่นยำในสิ่งที่ฉันหมายถึง (แม้ว่าฉันจะไม่แสดงออกอย่างดี)
EconAndrew

ขอบคุณสำหรับความพยายามเหล่านั้น (+1) ในแง่ของสัญกรณ์ชุดตามทฤษฎีของพาร์ทิชันของภูมิภาคในรูปแบบส่วนชุดที่สั่ง : พาร์ทิชันคือการปรับแต่งของBและBเป็นอนุภาคของเมื่อตั้งอยู่ในทุกเป็นส่วนหนึ่งของหนึ่งในB การทำงานของคุณของการรวมดูเหมือนจะเป็นอนุภาคที่พบบ่อยที่ดีที่สุดของและB วิธีหนึ่งในการแก้ไขปัญหาเวอร์ชันฟัซซีของคุณคือการใช้ประโยชน์จากความสามารถของ GIS ในการลบ dangles และ slivers เพื่อแก้ไขความคลาดเคลื่อนเล็กน้อยระหว่างสองเลเยอร์แล้วทำการดำเนินการที่ไม่คลุมเครือ
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 ข

ความแตกต่างสมมาตรโดยที่ส่วนของ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))

symdiff

และสุดท้ายประเมินความแตกต่างระหว่าง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 รับสอง MultiPolygons และรับผล 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

แก้ไข. ขั้นตอนเพิ่มเติมก) ชุดข้อมูลยูเนี่ยนในแง่ของ arcgis เครื่องมือยูเนี่ยนข) ใช้เวลามากที่สุดเป็นอันดับแรกจากตารางที่ผสานและตรวจสอบเศษส่วนของส่วนอื่น ๆ ภายใน c) ลบส่วนอื่น ๆ เป็นอย่างไรบ้าง?
FelixIP

ฉันไม่รู้เพราะฉันยังไม่เข้าใจว่าคำถามนี้ถามอะไรจริงๆ
whuber

สร้างพื้นที่โดยใช้บล็อกที่ใหญ่ที่สุดที่เป็นไปได้ นี่คือความเข้าใจของฉันของคำถาม
FelixIP

ทางออกที่จะใช้บล็อกเดียว (สหภาพของพวกเขาทั้งหมด)!
whuber
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.