সহজ প্রশ্ন, কঠিন সমাধান।
আমি জানি যে সেরা পদ্ধতিটি সিমুলেটেড অ্যানিলিং ব্যবহার করে (আমি কয়েক হাজার পয়েন্টের মধ্যে কয়েক ডজন পয়েন্ট নির্বাচন করতে এটি ব্যবহার করেছি এবং এটি 200 পয়েন্ট নির্বাচন করতে খুব ভাল স্কেল করে: স্কেলিংটি সাবলাইনার) তবে এর জন্য সতর্কতার সাথে কোডিং এবং যথেষ্ট পরীক্ষামূলক প্রয়োজন পাশাপাশি গণনা একটি বিশাল পরিমাণ। প্রথমে সহজ এবং দ্রুত পদ্ধতিগুলি দেখে তাদের শুরু করা উচিত যে তারা যথেষ্ট কিনা তা দেখুন।
একটি উপায় হ'ল প্রথমে স্টোরের অবস্থানগুলি ক্লাস্টার করা । প্রতিটি ক্লাস্টারের মধ্যে ক্লাস্টার সেন্টারের নিকটবর্তী দোকানটি নির্বাচন করুন।
সত্যিকারের দ্রুত ক্লাস্টারিং পদ্ধতি হ'ল কে-মানে । এটি একটি 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 200 ক্লাস্টারে এটি প্রয়োগ করা প্রশ্নের বাইরে নয়))
কে-মানেগুলির একটি ভাল বিকল্প হায়ারারিকিকাল ক্লাস্টারিং অ্যালগরিদম; প্রথমে "ওয়ার্ডের" পদ্ধতিটি ব্যবহার করে দেখুন এবং অন্যান্য লিঙ্কগুলির সাথে পরীক্ষার বিষয়টি বিবেচনা করুন। এটি আরও গণনা নেবে, তবে আমরা এখনও 1000 স্টোর এবং 200 টি ক্লাস্টারের জন্য কয়েক সেকেন্ডের কথা বলছি।
অন্যান্য পদ্ধতি বিদ্যমান। উদাহরণস্বরূপ, আপনি এই অঞ্চলটিকে নিয়মিত ষড়ভুজ গ্রিড দিয়ে কভার করতে পারেন এবং এক বা একাধিক স্টোর রয়েছে এমন কোষগুলির জন্য, এর কেন্দ্রের নিকটবর্তী স্টোরটি নির্বাচন করতে পারেন। প্রায় 200 স্টোর নির্বাচন না করা অবধি সেলসাইজ সহ সামান্য খেলুন। এটি স্টোরের খুব নিয়মিত ব্যবধান তৈরি করবে, যা আপনি হয়ত বা নাও চান। (যদি এগুলি সত্যিকারের স্টোরের অবস্থান হয় তবে এটি সম্ভবত একটি খারাপ সমাধান হতে পারে, কারণ এটির মধ্যে কমপক্ষে জনবহুল অঞ্চলে দোকানগুলি বেছে নেওয়ার প্রবণতা থাকবে other অন্যান্য অ্যাপ্লিকেশনগুলিতে এটি আরও ভাল সমাধান হতে পারে))