सरल प्रश्न, कठिन समाधान।
सबसे अच्छी विधि जो मुझे पता है कि सिम्युलेटेड एनेलिंग का उपयोग करता है (मैंने इसका इस्तेमाल दसियों हज़ार में से कुछ दर्जन बिंदुओं का चयन करने के लिए किया है और यह 200 अंकों का चयन करने के लिए बहुत अच्छी तरह से मापता है: स्केलिंग सबलाइनर है), लेकिन इसके लिए सावधानीपूर्वक कोडिंग और काफी प्रयोग की आवश्यकता होती है, जैसा कि साथ ही संगणना की एक बड़ी राशि। आपको पहले सरल, तेज तरीकों को देखकर शुरू करना चाहिए कि क्या वे पर्याप्त हैं।
स्टोर लोकेशंस को क्लस्टर करने का एक तरीका सबसे पहले है । प्रत्येक क्लस्टर के भीतर क्लस्टर केंद्र के निकटतम स्टोर का चयन करें।
एक बहुत तेजी से क्लस्टरिंग विधि K- साधन है । यहां एक R
समाधान है जो इसका उपयोग करता है।
scatter <- function(points, nClusters) {
#
# Find clusters. (Different methods will yield different results.)
#
clusters <- kmeans(points, nClusters)
#
# Select the point nearest the center of each cluster.
#
groups <- clusters$cluster
centers <- clusters$centers
eps <- sqrt(min(clusters$withinss)) / 1000
distance <- function(x,y) sqrt(sum((x-y)^2))
f <- function(k) distance(centers[groups[k],], points[k,])
n <- dim(points)[1]
radii <- apply(matrix(1:n), 1, f) + runif(n, max=eps)
# (Distances are changed randomly to select a unique point in each cluster.)
minima <- tapply(radii, groups, min)
points[radii == minima[groups],]
}
तर्क scatter
स्टोर के स्थानों ( 2 मैट्रिक्स द्वारा एन के रूप में ) और चयन करने के लिए स्टोर की संख्या (जैसे, 200) की एक सूची है। यह स्थानों की एक सरणी देता है।
अपने आवेदन के एक उदाहरण के रूप में, चलो n = 1000 बेतरतीब ढंग से स्थित भंडार उत्पन्न करते हैं और देखते हैं कि समाधान क्या दिखता है:
# Create random points for testing.
#
set.seed(17)
n <- 1000
nClusters <- 200
points <- matrix(rnorm(2*n, sd=10), nrow=n, ncol=2)
#
# Do the work.
#
system.time(centers <- scatter(points, nClusters))
#
# Map the stores (open circles) and selected ones (closed circles).
#
plot(centers, cex=1.5, pch=19, col="Gray", xlab="Easting (Km)", ylab="Northing")
points(points, col=hsv((1:nClusters)/(nClusters+1), v=0.8, s=0.8))
इस गणना में 0.03 सेकंड लगे:
आप देख सकते हैं कि यह बहुत अच्छा नहीं है (लेकिन यह बहुत बुरा भी नहीं है)। बहुत बेहतर करने के लिए या तो स्टोकेस्टिक विधियों की आवश्यकता होने वाली है, जैसे कि नकली एनालाइजिंग, या एल्गोरिदम जो समस्या के आकार के साथ तेजी से बड़े पैमाने पर होने की संभावना रखते हैं। (मैंने इस तरह के एक एल्गोरिथ्म को लागू किया है: 20 में से 10 सबसे व्यापक रूप से स्थान बिंदुओं का चयन करने में 12 सेकंड लगते हैं। इसे 200 समूहों में लागू करना सवाल से बाहर है।)
K- साधनों का एक अच्छा विकल्प एक पदानुक्रमित क्लस्टरिंग एल्गोरिथ्म है; पहले "वार्ड" विधि का प्रयास करें और अन्य लिंकेज के साथ प्रयोग करने पर विचार करें। यह अधिक संगणना लेगा, लेकिन हम अभी भी 1000 दुकानों और 200 समूहों के लिए कुछ सेकंड के बारे में बात कर रहे हैं।
अन्य विधियाँ मौजूद हैं। उदाहरण के लिए, आप इस क्षेत्र को एक नियमित हेक्सागोनल ग्रिड के साथ कवर कर सकते हैं और एक या एक से अधिक स्टोर वाले कक्षों के लिए, इसके केंद्र के निकटतम स्टोर का चयन करें। लगभग 200 दुकानों का चयन होने तक कोशिकाओं के साथ थोड़ा खेलें। यह दुकानों के एक बहुत ही नियमित अंतराल का उत्पादन करेगा, जिसे आप चाहते हैं या नहीं कर सकते हैं। (यदि ये वास्तव में स्टोर स्थान हैं, तो यह संभवतः एक बुरा समाधान होगा, क्योंकि इसमें कम से कम आबादी वाले क्षेत्रों में स्टोर चुनने की प्रवृत्ति होगी। अन्य अनुप्रयोगों में यह एक बेहतर समाधान हो सकता है।)