Câu hỏi đơn giản, giải pháp khó.
Phương pháp tốt nhất mà tôi biết sử dụng mô phỏng ủ (tôi đã sử dụng phương pháp này để chọn vài chục điểm trong số hàng chục nghìn và nó có tỷ lệ cực kỳ tốt để chọn 200 điểm: tỷ lệ là tuyến tính), nhưng điều này đòi hỏi phải mã hóa cẩn thận và thử nghiệm đáng kể, như cũng như một số lượng lớn tính toán. Bạn nên bắt đầu bằng cách xem xét các phương pháp đơn giản hơn, nhanh hơn trước để xem liệu chúng có đủ không.
Một cách đầu tiên là phân cụm các vị trí cửa hàng . Trong mỗi cụm chọn cửa hàng gần trung tâm cụm nhất.
Một phương pháp phân cụm thực sự nhanh là K-nghĩa . Đây là một R
giải pháp sử dụng nó.
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],]
}
Các đối số scatter
là một danh sách các vị trí cửa hàng (dưới dạng ma trận n theo 2) và số lượng cửa hàng sẽ chọn (ví dụ: 200). Nó trả về một loạt các vị trí.
Để làm ví dụ cho ứng dụng của nó, hãy tạo n = 1000 cửa hàng được đặt ngẫu nhiên và xem giải pháp đó trông như thế nào:
# 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))
Tính toán này mất 0,03 giây:
Bạn có thể thấy nó không tuyệt vời (nhưng nó cũng không quá tệ). Để làm tốt hơn nhiều sẽ yêu cầu các phương pháp ngẫu nhiên, như ủ mô phỏng, hoặc các thuật toán có khả năng mở rộng theo cấp số nhân với quy mô của vấn đề. (Tôi đã triển khai một thuật toán như vậy: phải mất 12 giây để chọn 10 điểm cách nhau rộng rãi nhất trong số 20. Áp dụng nó cho 200 cụm là không cần thiết.)
Một thay thế tốt cho K-mean là thuật toán phân cụm theo cấp bậc; thử phương pháp "Ward's" trước và xem xét thử nghiệm với các mối liên kết khác. Điều này sẽ có nhiều tính toán hơn, nhưng chúng ta vẫn đang nói về một vài giây cho 1000 cửa hàng và 200 cụm.
Các phương pháp khác tồn tại. Chẳng hạn, bạn có thể bao phủ vùng bằng lưới lục giác thông thường và, đối với các ô có chứa một hoặc nhiều cửa hàng, hãy chọn cửa hàng gần trung tâm của nó. Chơi một chút với kích thước ô cho đến khi khoảng 200 cửa hàng đã được chọn. Điều này sẽ tạo ra một khoảng cách rất đều đặn của các cửa hàng, mà bạn có thể muốn hoặc không muốn. .