यह एक ग्राफ़िक्स रंग समस्या है ।
याद रखें कि एक ग्राफ रंग एक ग्राफ के कोने को इस तरह से रंग का एक असाइनमेंट है कि कोई भी दो कोने जो एक किनारे को साझा करते हैं, उनका रंग भी समान होगा। विशेष रूप से, ग्राफ का (अमूर्त) कोने बहुभुज हैं। जब भी वे (बहुभुज) को काटते हैं, तो दो कोने एक (अप्रत्यक्ष) किनारे से जुड़े होते हैं। यदि हम समस्या का कोई हल निकालते हैं - जो कि पॉलीगन्स के संग्रह को कहना ( k ) का एक क्रम है - और अनुक्रम में प्रत्येक संग्रह के लिए एक अनूठा रंग प्रदान करता है, तो हमें ग्राफ का k -coloring प्राप्त होगा । एक छोटे से कश्मीर को खोजने के लिए यह वांछनीय है ।
यह समस्या बहुत कठिन है और मनमाने रेखांकन के लिए अनसुलझी बनी हुई है। एक अनुमानित समाधान पर विचार करें जो कोड के लिए सरल है। एक अनुक्रमिक एल्गोरिथ्म करना चाहिए। वेल्श-पॉवेल एल्गोरिथ्म एक लालची समाधान है जो डिग्री द्वारा वर्टीकल के अवरोही क्रम पर आधारित है। मूल बहुभुज की भाषा में अनुवादित, पहले बहुभुज को दूसरे बहुभुजों की संख्या के अवरोही क्रम में क्रमबद्ध करते हैं, जिन्हें वे ओवरलैप करते हैं। क्रम में काम करते हुए, पहले बहुभुज को एक प्रारंभिक रंग दें। प्रत्येक क्रमिक चरण में, मौजूदा बहुभुज को मौजूदा रंग से रंगने का प्रयास करें: यानी ऐसा रंग चुनें जो न होपहले से ही किसी भी बहुभुज के पड़ोसियों द्वारा उपयोग किया जाता है। (उपलब्ध रंगों में से चुनने के कई तरीके हैं, या तो एक का उपयोग करें जो कम से कम इस्तेमाल किया गया है या एक यादृच्छिक रूप से चुनें।) यदि अगला बहुभुज एक मौजूदा रंग के साथ रंगीन नहीं हो सकता है, तो एक नया रंग बनाएं और उसी के साथ इसे रंग दें।
एक बार जब आप रंगों की एक छोटी संख्या के साथ एक रंग प्राप्त कर लेते हैं, तो रंग द्वारा आंचलिक रंग का प्रदर्शन करें: निर्माण द्वारा, आपको गारंटी दी जाती है कि दिए गए रंग ओवरलैप के कोई दो बहुभुज नहीं हैं।
इसमें नमूना कोड है R
। (पायथन कोड बहुत अलग नहीं होगा।) सबसे पहले, हम दिखाए गए सात बहुभुजों में से ओवरलैप का वर्णन करते हैं।
edges <- matrix(c(1,2, 2,3, 3,4, 4,5, 5,1, 2,6, 4,6, 4,7, 5,7, 1,7), ncol=2, byrow=TRUE)
यही है, बहुभुज 1 और 2 ओवरलैप करते हैं, और इसलिए बहुभुज 2 और 3, 3 और 4, ..., 1 और 7 करते हैं।
अवरोही डिग्री के आधार पर छंटनी करें:
vertices <- unique(as.vector(edges))
neighbors <- function(i) union(edges[edges[, 1]==i,2], edges[edges[, 2]==i,1])
nbrhoods <- sapply(vertices, neighbors)
degrees <- sapply(nbrhoods, length)
v <- vertices[rev(order(degrees))]
ए (क्रूड) अनुक्रमिक रंग एल्गोरिथ्म जल्द से जल्द उपलब्ध रंग का उपयोग करता है जो पहले से ही किसी अतिव्यापी बहुभुज द्वारा उपयोग नहीं किया जाता है:
color <- function(i) {
n <- neighbors(i)
candidate <- min(setdiff(1:color.next, colors[n]))
if (candidate==color.next) color.next <<- color.next+1
colors[i] <<- candidate
}
डेटा संरचनाओं को प्रारंभ करें ( colors
और color.next
) और एल्गोरिथ्म लागू करें:
colors <- rep(0, length(vertices))
color.next <- 1
temp <- sapply(v, color)
बहुभुज को रंगों के अनुसार समूहों में विभाजित करें:
split(vertices, colors)
इस उदाहरण में आउटपुट चार रंगों का उपयोग करता है:
$`1`
[1] 2 4
$`2`
[1] 3 6 7
$`3`
[1] 5
$`4`
[1] 1
इसने बहुभुज को चार गैर-अतिव्यापी समूहों में विभाजित किया है। इस मामले में समाधान इष्टतम नहीं है ({{3,6,5}, {2,4}, {1,7}} इस ग्राफ के लिए एक तीन रंग है)। सामान्य तौर पर इसका समाधान बहुत बुरा नहीं होना चाहिए, हालांकि।